• PHP = PHP: Hypertext Preprocessorお気楽スクリプト言語。でも結構使われてる。

記事一覧

メインサイト

セキュリティについて

http://www.asahi-net.or.jp/%7Ewv7y-kmr/memo/php_security.html

なんか上読んでると穴だらけで実運用したくない気がする。

インストール

  • php4apache.dllはphp4ts.dllに依存している

エラーメッセージはphp4apache.dllのモジュールが見つかりませんとでるので紛らわしい。要はphp4ts.dllをc:\windowsに置いてないと依存関係が解決できずにエラーが出てしまう。php5に関しても同様。

  • php.iniの場所を指定する。明白にするためにこちらがお勧め
PHPIniDir "C:/php"

PHP7 on centos7

サーバー側インストールは問題無し

remiレポジトリからインストール

yum install http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
yum remove php php-pdo php-mbstring php-pgsql php-gd
yum install --enablerepo=remi,remi-php70 php php-devel php-mbstring php-pdo php-gd php-mysql php-xml

ミドルウェアチェック

さすがに7.3はcakephpがだめだった。7.2でもfile_get_htmlがダメなのでfile_get_contentsして、strに入れた後、str_get_htmlに変更して、ついでにHTTPのエラーハンドリングも入れる!しかし交通情報リカバリーバッチでしくって2日障害状態!!

  • wordpress OK
  • cakephp 7.3rc3だとだめ、7.2はOK
  • pukiwiki(1.5.1へアップグレード必要) OK
  • 自作ツール OK

開発環境

昔はテキストエディタだけだったが、今やeclipseなどが利用できる時代。ZendStuidoというのがリモートデバッグも出来るらしいのだが、有料なので却下。無料といえばEclipseというわけでPHPEclipseが今のところ一番のお勧め。プラグイン入れるのが面倒な御仁には全部いりパッケージのEasyEclipseForPHPをお勧めしておく。

Tips

print_rの内容を画面に出力せず変数に格納する。

ob_start();
//ここでprint_rやvar_dumpしても画面に出力されずにバッファにたまる
print_r($_SERVER);
//バッファ取得
$tmp = ob_get_contents();
//バッファクリアしてバッファリングも終わり
ob_end_clean();
  • つーかvar_exportつかえば?
    $str = var_export($hogehoge, $true);
    $handle = fopen(a.txt, "w");
    fwrite($handle, $str);
    fclose($handle);

一行完結Tips

変数の型を取得gettype($var)
クラス名を取得get_class($var)
配列の要素数取得count() or sizeof()
バージョンによる変数名の違い$_GETが4.2以降。$HTTP_GET_VARSなどが4.0.x
エラーレベルの設定error_reporting(E_ALL)
デバック手法1phpinfo()でHTTPリクエスト内容が取得できる
デバック手法2print_r(配列)で配列内全表示,var_dumpやvar_exportも役立つ
自分自身のパス名取得$_SERVER["PHP_SELF"]
定数定義define(定数名,内容)
定数一覧取得print_r(get_defined_constants());
include,requireされているファイル一覧表示get_included_files()
文字コード変換Shift_JISの入力に対して、EUCに変換i18n_convert($_POST['test'],"EUC","SJIS");
コマンドラインから利用php ファイル名
コマンドラインから直接実行php -r 'echo "HelloWorld\n";'
エラーメッセージの抑制@fopenなどと実行するとエラーメッセージが$php_errormsg荷格納され画面には表示されない
インクルードパスの変更set_include_path("../lib");
環境変数の設定putenv("NLS_LANG=Japanese_Japan.JA16EUC");
日付の妥当性チェックcheckdate($month,$day,$year)

出力にSJISを利用する

基本PHPはソースEUCかつ出力もEUCで利用するのが一番トラブルが少ないが、携帯サイトなどで泣く泣くSJISを利用しなければいけない場合のTIPS

下記の手順でやれば文字化けもない

  1. ソースはEUCにする。内部処理はすべてEUCで行う。
  2. リクエストパラメータ取得の時にSJIS→EUC変換をする。
  3. 出力のエンコーディングをSJISにする

php.iniで設定するのはお勧めできないのでスクリプト単位で設定するのがお勧め。

ini_set('mbstring.http_output','SJIS');
ini_set('mbstring.http_input','SJIS');
ini_set('output_buffering','On');
ini_set('output_handler','mb_output_handler');

参考サイト

http://www.hizlab.net/app/phppg.html

エラー表示をOn/Off

本番環境などではOffになっていてその場合はエラーがまったく表示されないので画面が真白になってもあわてないこと。PHPのエラーログにはちゃんと出力される

 display_errors = On

文法

可変変数

$a = "test";
$b = "a";
$c = $$b;
  • $cは$aと同一

ポインタ変数

$a = "before";
$b = &$a;
$b = "after";

$bを通して$aの内容を変更できる。要は参照渡し

PEAR

  • 共通ライブラリインストールせずに使えるとの触れ込み。パッケージは入れる必要がある。

PECL

拡張ライブラリでC言語でコンパイルされているので早い。

php.iniについて

  • パッケージインストールの場合/etc/php.iniにおいてある事が多い。変更したらapache再起動するべし。何処のphp.iniを参照しているかはphpinfo()を見ればわかる。コマンドラインでは明示的に指定できる。

ハマリポイント

一見するとエラーないのにパースエラー

全角スペースはいってませんか?たまに意図せず紛れ込んで頭抱えます。

画面が真白

基本的に上記エラー表示をonにすればよい

windows+Apache2の時のreqiure_onceの挙動

requeire_onceは一度だけ読込む命令だが、同じファイルを相対パス表記と絶対パス表記でrequire_onceしていると別ファイルとみなされる。同じクラス名を宣言しているので二度目の読込で Cannot redeclare class のエラーがでる。上記を避けるにはrequire_onceの表記を絶対パスか相対パスかのどちらかに統一すること。どうやらDLLのバグらしい

sessionにオブジェクトを格納するときの注意点

セッションに格納したオブジェクトを取り出すところでもrequire_onceしとかないとクラス定義が未定のためメソッドが利用できない。PHPでは1リクエストで完結するの考えてみれば当然のことである。

Cannot modify header information - headers already sent by

上記エラーはヘッダー情報を操作した後にechoやprintなどの画面出力命令を行うとでてしまう。require_onceしているクラスファイルの<?php ?>タグ外の空行も画面出力とみなされるので注意

サンプルプログラム

メール送信サンプル

<?php
       mb_language("Ja");
       $headers = "From: [email protected]\r\n";
       $headers .= "MIME-Version: 1.0\r\n";
       $headers .= "Content-Type: text/plain;charset=ISO-2022-JP\r\n";
       $to = '[email protected]';
       $subject = mb_convert_encoding('日本語テスト','iso-2022-jp','euc-jp');
       $body    = mb_convert_encoding('はるのうーたー','iso-2022-jp','euc-jp');
       $result = mb_send_mail($to,$subject,$body,$headers);
       if (!$result) {
               echo "mail send failure!";
       } else {
               echo "mail send to $to";
       }
?>

出力エンコーディングについて

  • HTMLのMETAタグではなく、レスポンスに含まれるContentTypeのcharsetを変更する

一括で指定する。ただし下記のソースコード指定で上書き可能

php.iniのdefault_charset を変更してapache再起動

ソースコードで指定する

今までEUC-JPがデフォルトのOSでやってきたのであまりはまることは無かったが、基本的にHEADER関数で出力エンコーディングを指定した方が安全。CentOS4以降ではデフォルトUTF-8なのでEUC-JP前提のソースコードではそのままだと化ける

header("Content-type: text/html; charset=EUC-JP");
Counter: 16482, today: 3, yesterday: 2

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2019-08-12 (月) 15:33:57