PHPの最近のブログ記事

※今日のお話は、最初から最後まで、知っている人にとっては当たり前すぎて困るレベルのお話です。
phpでは、error_logという関数でログを出すことが出来て、一般にこれはApacheのエラーログに出力されるので、これを使うとなんだか動かないスクリプトの動きを追うことが出来ます。
ところが、一部のレンタルサーバで、PHPは使えるんだけどログを見せていただけない環境が存在します。全部見せてくれない環境はさすがに少ないですけど、例えばサブドメインを使っていると駄目とか、共用SSLを使っていると駄目とか。
こういう場合に、しょうがないので自前ログを用意する手順。
1.絶対パスを確認
ログを書き出す場所を決めるために、まずはディレクトリ構成を知る必要があります。
log.phpとか適当な名前のファイルに、こういうスクリプトを書いて走らせてみればだいたい分かります。
<?php echo "cwd:".getcwd(); ?>
「/home/mogya/public_html/」的なものが得られるはず。これだったら、/home/mogya/debug_log あたりにログを出力するようにすれば良さそうですね。
2.ログ出力関数
<?php
function dbg_log($str){
$filepath = "/home/mogya/debug_log";
$fp = fopen($filepath, "a+");
fputs( $fp, $str."\n" );
fclose($fp);
}
?>
ログを出力したいファイルの頭あたりにこんなのを書いておいて、error_log()の代わりにdbg_log()を書けば、変数の中身なり何なりを出力して動きを追うことが出来る。
環境によっては/home/mogya/debug_log に書き込めないことがあり得るので、その場合はFTPで適当なファイルをあげておいて、アクセス権を777にしてしまえば書き込めるようになる。
PHPでファイルに文字を書くだけなんだから当たり前の話なんだけど、毎回思い出すのが面倒なので書いてみた。
セキュリティとか深刻に考えたスクリプトじゃないので、終わったら消すことが前提です。
プレゼンとソースを公開します。
ソース:sendmail.lzh
あと、メールアドレスのミスを指摘してくれる入力フォームもよかったらご覧くださいませ。
2009-01-19 10:03:23
ソースがダウンロードできなかったので、圧縮した物を上げ直しました。lzhで圧縮してあるので、解凍してご覧くださいませ。
2009-01-19 19:51:28
Tempa Playground - ウェブテコ第4回終了が公開されていますね。すでに記事あげた方は、トラックバックするといいんじゃないかと思います。
おわり。
...いやでもさ。まずいことがあった時に出力されるはずのエラーログに変数の値をprintfデバッグするのはどうなのさ? ファイルを分けたい時もあるでしょ?
そういう時は、apache_note関数とapacheのhttpd.confの記述を組み合わせる。
httpd.confに
<VirtualHost *:80>
ServerName test1.example.com
ServerAlias localtest1.example.com
DocumentRoot /var/www/someapp/html/
LogFormat "%h %l %u %t \"%r\" %>s %b %{phpdebug}n" phpdebug_log
CustomLog /var/www/someapp/log/phpdebug_log phpdebug_log
ErrorLog /var/www/someapp/log/error_log
TransferLog /var/www/someapp/log/access_log
</VirtualHost>
こんな具合にLogFormatとCustomLogを書いておく。
で、PHPの方では、
apache_note("phpdebug", "php debug message: {$_SERVER['REMOTE_ADDR']} ({$_SERVER['HTTP_USER_AGENT']})");
こんな感じでログを出す。
すると、CustomLogで書いたファイル名のファイルにログが出力される。
[daisuke@hige ~]$ sudo tail -f /var/www/someapp/log/phpdebug_log 192.168.11.128 - hoge [08/Jul/2008:09:13:33 +0900] "GET /graph/someapp.php HTTP/1.1" 200 4856 php debug message: 192.168.11.128 (Mozilla/5.0 (Windows; U; Windows NT 5.1; ja; rv:1.8.1.15) Gecko/20080623 Firefox/2.0.0.15) 192.168.11.128 - hoge [08/Jul/2008:09:13:48 +0900] "GET /graph/someapp.php HTTP/1.1" 200 4856 php debug message: 192.168.11.128 (Mozilla/5.0 (Windows; U; Windows NT 5.1; ja; rv:1.8.1.15) Gecko/20080623 Firefox/2.0.0.15) 192.168.11.128 - hoge [08/Jul/2008:09:16:37 +0900] "GET /graph/someapp.php HTTP/1.1" 200 4856 php debug message: 192.168.11.128 (Mozilla/5.0 (Windows; U; Windows NT 5.1; ja; rv:1.8.1.15) Gecko/20080623 Firefox/2.0.0.15)
こうしておけば、apacheの通常のログと同様にログファイルを扱うことができるので、ログのローテーションとかパースに既存の仕組みを使うことができて嬉しい。
おまけ
別のファイルに出すと、tailでログを監視するときerror_logと二つのウィンドウを開かないといけないじゃないかって?
tailはなんとファイル名を複数監視することができる。
[daisuke@hige ~]$ sudo tail -f /var/www/someapp/log/error_log /var/www/someapp/log/phpdebug_log ==> /var/www/someapp/log/error_log <== [Tue Jul 08 08:43:04 2008] [error] [client 192.168.11.128] PHP Notice: Undefined variable: access in /var/www/someapp/html/graph/someapp.php on line 7 [Tue Jul 08 09:13:41 2008] [error] [client 192.168.11.128] PHP Parse error: syntax error, unexpected T_STRING in /var/www/someapp/html/graph/someapp.php on line 2 ==> /var/www/someapp/log/phpdebug_log <== 192.168.11.128 - hoge [08/Jul/2008:09:13:33 +0900] "GET /graph/someapp.php HTTP/1.1" 200 4856 php debug message: 192.168.11.128 (Mozilla/5.0 (Windows; U; Windows NT 5.1; ja; rv:1.8.1.15) Gecko/20080623 Firefox/2.0.0.15) 192.168.11.128 - hoge [08/Jul/2008:09:13:41 +0900] "GET /graph/someapp.php HTTP/1.1" 200 - - 192.168.11.128 - hoge [08/Jul/2008:09:13:48 +0900] "GET /graph/someapp.php HTTP/1.1" 200 4856 php debug message: 192.168.11.128 (Mozilla/5.0 (Windows; U; Windows NT 5.1; ja; rv:1.8.1.15) Gecko/20080623 Firefox/2.0.0.15) 192.168.11.128 - hoge [08/Jul/2008:09:16:37 +0900] "GET /graph/someapp.php HTTP/1.1" 200 4856 php debug message: 192.168.11.128 (Mozilla/5.0 (Windows; U; Windows NT 5.1; ja; rv:1.8.1.15) Gecko/20080623 Firefox/2.0.0.15)
今月の流行は携帯サイトとPHPのもぎゃです。こんにちは。
携帯絵文字変換スクリプトをPHPで作ってみた。 携帯ホームページを作ろう! -ちょっと詳しいモバイルサイトの作り方-というのがあって、フリーで使えるのはすばらしい!と思ったのですが。
これどうも、ドコモの絵文字が正しく出ません。すくなくとも手元の環境では出ない。
- サーバ:Apache/2.0.52
- PHP:PHP 5.1.6 (cli) (built: Oct 26 2007 13:49:00)
- 携帯:F705i。あと、i-mode HTML Simulator II ver5.1も試したけど出なかった。
しょうがないのでデバッグしました。
結論
emoji.csvをこっちに差し替えると出るみたいです。
emoji.csv
元のファイルとの違いは、iモード絵文字をダブルクオーテーションでくくっただけです。
問題だったこと
作ろうiモードコンテンツ:基本絵文字一覧 | サービス・機能 | NTTドコモを参考に、べたにphpファイルに文字列を貼り付けたら、これは表示できました。
Wiresharkでパケットを拾ってのぞいてみると、データが化けているとかじゃなくて、そもそもデータが出ていません。
さかのぼっていくと、そもそも$emoji_array[1]が空っぽのままみたいです。
fgetcsvでググってみると、どうもこの関数は結構危険らしく。
テレパス・ラボ : fgetcsv()で日本語が読み込めない
iモード絵文字も、SJIS範囲外とはいえ日本語っぽい文字なのは同じなので、環境によって空っぽになってしまうんじゃないでしょうか。上記サイトで言われているように、問題の文字列をダブルクオーテーションでくくってみたら動いたので、とりあえずご報告まで。