#author("2018-10-28T09:09:36+00:00","default:wikiadmin","wikiadmin") #author("2019-01-11T01:29:36+00:00","default:wikiadmin","wikiadmin") -''PHP'' = ''PHP: Hypertext Preprocessor''お気楽スクリプト言語。でも結構使われてる。 #contents *記事一覧 [#jca957a3] #ls2(PHP) *メインサイト [#meff017c] -[[PHP Main Site:http://jp2.php.net/]] -[[日本PHPユーザー会:http://www.php.gr.jp]] //Japn PHP User Group *セキュリティについて [#m1147fda] http://www.asahi-net.or.jp/%7Ewv7y-kmr/memo/php_security.html なんか上読んでると穴だらけで実運用したくない気がする。 *インストール [#c4c528cb] -Linuxは[[UNIX/ServerSoft/Apache]]の項目を参照。Windowsではまったので記載 -php4apache.dllはphp4ts.dllに依存している エラーメッセージはphp4apache.dllのモジュールが見つかりませんとでるので紛らわしい。要はphp4ts.dllをc:\windowsに置いてないと依存関係が解決できずにエラーが出てしまう。php5に関しても同様。 -php.iniの場所を指定する。明白にするためにこちらがお勧め PHPIniDir "C:/php" **PHP7 on centos7 [#hf7dc483] ***サーバー側インストールは問題無し [#u0abb22e] 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 yum install --enablerepo=remi,remi-php70 php php-devel php-mbstring php-pdo php-gd php-mysql php-xml ***ミドルウェアチェック [#n38c167e] さすがに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 *開発環境 [#k24c1e96] 昔はテキストエディタだけだったが、今やeclipseなどが利用できる時代。ZendStuidoというのがリモートデバッグも出来るらしいのだが、有料なので却下。無料といえばEclipseというわけでPHPEclipseが今のところ一番のお勧め。プラグイン入れるのが面倒な御仁には全部いりパッケージの[[EasyEclipseForPHP:http://www.easyeclipse.org/site/distributions/php.html]]をお勧めしておく。 *Tips [#i0e871a4] **print_rの内容を画面に出力せず変数に格納する。 [#k832099d] 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 [#n6f37cdc] |変数の型を取得|gettype($var)| |クラス名を取得|get_class($var)| | 配列の要素数取得 | count() or sizeof()| | バージョンによる変数名の違い | $_GETが4.2以降。$HTTP_GET_VARSなどが4.0.x| |エラーレベルの設定|error_reporting(E_ALL)| | デバック手法1 | phpinfo()でHTTPリクエスト内容が取得できる| | デバック手法2 | print_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を利用する [#sa3c6410] 基本PHPはソースEUCかつ出力もEUCで利用するのが一番トラブルが少ないが、携帯サイトなどで泣く泣くSJISを利用しなければいけない場合のTIPS 下記の手順でやれば文字化けもない +ソースはEUCにする。内部処理はすべてEUCで行う。 +リクエストパラメータ取得の時にSJIS→EUC変換をする。 +出力のエンコーディングを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 [#h6fcf483] 本番環境などではOffになっていてその場合はエラーがまったく表示されないので画面が真白になってもあわてないこと。PHPのエラーログにはちゃんと出力される display_errors = On *文法 [#h0a41784] **可変変数 [#s9a64d4c] $a = "test"; $b = "a"; $c = $$b; -$cは$aと同一 **ポインタ変数 [#u8cf200a] $a = "before"; $b = &$a; $b = "after"; $bを通して$aの内容を変更できる。要は参照渡し *[[PEAR>PHP/PEAR]] [#ye596795] -共通ライブラリインストールせずに使えるとの触れ込み。パッケージは入れる必要がある。 *PECL [#p0fa9478] 拡張ライブラリでC言語でコンパイルされているので早い。 *php.iniについて [#z1b76968] -パッケージインストールの場合/etc/php.iniにおいてある事が多い。変更したらapache再起動するべし。何処のphp.iniを参照しているかはphpinfo()を見ればわかる。コマンドラインでは明示的に指定できる。 *ハマリポイント [#yd50159c] **一見するとエラーないのにパースエラー [#z07b565a] 全角スペースはいってませんか?たまに意図せず紛れ込んで頭抱えます。 **画面が真白 [#e88bd9c7] 基本的に上記エラー表示をonにすればよい **windows+Apache2の時のreqiure_onceの挙動 [#q7cc37e8] requeire_onceは一度だけ読込む命令だが、同じファイルを相対パス表記と絶対パス表記でrequire_onceしていると別ファイルとみなされる。同じクラス名を宣言しているので二度目の読込で Cannot redeclare class のエラーがでる。上記を避けるにはrequire_onceの表記を絶対パスか相対パスかのどちらかに統一すること。どうやらDLLのバグらしい **sessionにオブジェクトを格納するときの注意点 [#d2e41d57] セッションに格納したオブジェクトを取り出すところでもrequire_onceしとかないとクラス定義が未定のためメソッドが利用できない。PHPでは1リクエストで完結するの考えてみれば当然のことである。 **Cannot modify header information - headers already sent by [#he787c24] 上記エラーはヘッダー情報を操作した後にechoやprintなどの画面出力命令を行うとでてしまう。require_onceしているクラスファイルの<?php ?>タグ外の空行も画面出力とみなされるので注意 *サンプルプログラム [#fc02aa50] **メール送信サンプル [#q2068a27] <?php mb_language("Ja"); $headers = "From: xxxxx@nifty.com\r\n"; $headers .= "MIME-Version: 1.0\r\n"; $headers .= "Content-Type: text/plain;charset=ISO-2022-JP\r\n"; $to = 'takeru.fujii@infinium.jp'; $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"; } ?> *出力エンコーディングについて [#f678de18] -HTMLのMETAタグではなく、レスポンスに含まれるContentTypeのcharsetを変更する **一括で指定する。ただし下記のソースコード指定で上書き可能 [#v4d302b5] php.iniのdefault_charset を変更してapache再起動 **ソースコードで指定する [#l4027238] 今までEUC-JPがデフォルトのOSでやってきたのであまりはまることは無かったが、基本的にHEADER関数で出力エンコーディングを指定した方が安全。CentOS4以降ではデフォルトUTF-8なのでEUC-JP前提のソースコードではそのままだと化ける header("Content-type: text/html; charset=EUC-JP"); #counter