2007年10月31日水曜日

[PHP] イヤーな はめられ方

とある集計ができていない、という。

とりあえず引き継いだ自分がやらなきゃならんので、調査。
cron で実行してる。

運良く?実行時にログを吐くようにしているのでそれをみる・・。

fopen で ファイルが開けてない。んー。パスがおかしくね?

経緯
・こないだサーバ移行した (したのは別の人)
・構成は全く同じ
・それ以降変更はなし


んー。どうしたもんか。
とりあえず3,4年前のふるーいコードを追っていく。
やっぱりパスの解釈がおかしい??

でも・・・ 変更してないならなぜおこる?


調査結果
移行前は cgi 版を使って実行していたけど、 移行後は cli 版で実行していたため。
$_SERVER['DOCUMENT_ROOT']があるとき、
空であることは考えてなかった模様。。。

cronで実行させるんなら、 フツー cli だから合ってるんじゃね?とも思うけど、旧環境はcgi 版。自分の常識は通用しない。

cronで実行してるスクリプトの一部分だけもってきて、
似たような感じにしてテスト。

こんなかんじ。

--

if (isset($_SERVER['DOCUMENT_ROOT'])) {
$hoge = sprintf("%s/../hoge/fuga", $_SERVER['DOCUMENT_ROOT']);
} else {
$hoge = sprintf("%s/../hoge/fuga", $_SERVER['PWD']);
}

print "$hoge\n";
--


cli, cgi 版それぞれでチェック

cli
% cat /tmp/test.php|php -q
/../hoge/fuga

cgi
% cat /tmp/test.php|php-cgi -q
/home/katsuji/../hoge/fuga

正解。
cli版だと期待したパスになってない。
そらそーだ、$_SERVER['DOCUMENT_ROOT'] が空だから。

こんなかんじ。

% php -i |grep -i document
$_SERVER["DOCUMENT_ROOT"] =>
% php-cgi -i |grep -i document


・if (isset($_SERVER['DOCUMENT_ROOT'])) が悪
か、
・移行するときにちゃんと前の環境とそろえとけ
と。。。

if (isset($_SERVER['DOCUMENT_ROOT']) && $_SERVER['DOCUMENT_ROOT'] != NULL)
のような具合なら cli 版でもよかったね ( -_-)

0 件のコメント:

コメントを投稿