無言で止まるとは

ちょっこし詰まったのでメモ。
環境はさくらのレンタルサーバ


以下のようなスクリプトが、Webからのアクセスでは動くけど、コマンドから叩いても動かない。勿論cronも。

first.php
//動かすスクリプトはこれ。
<?php
require_once 'second.php';
$second = new second();
$second->echo();
?>

second.php
<?php
class second {
    __construct() {
        require_once('module.php');  //同一ディレクトリではなく、ユーザー設定のphp.iniでパスを通したところに置いてある
    }
    function echo() {
        echo 'success!';
    }
}
?>

で、コマンドから叩いて動かない一番の原因はパスが通っていないことなんだけど、もしパスが通っていなければ、require()でFatal Errorを吐くはず。と思っていた。
けど、実際は何もエラーを吐かずにそこ*1で処理が止まる。
なので、エラーの位置を特定するのに結構手間取ったよ、というお話。


結局、原因はパスが通っていなかったことだったらしく、相対パス指定の所を絶対パスに変えたら動いた。
php.iniで指定したはずなのにな、と思っていたら、コマンドから'/usr/local/bin/php first.php'と叩いた場合はさくらのコンパネから設定できるphp.iniがどうやら機能していないか何かになってるみたい。
以前、cron回してるphpのエラーログを取っていたとき、error_levelをE_ALLにしても出なかったのもそれが理由だろうか。ここまだ調査中。
とりあえず、なるべく絶対パスで書くか、cronで動かすphpの行頭に書くパス指定を

#! /usr/local/bin/php -c /php.iniのパス/

とかにすることでひとまずの解決とした。


っで、問題は何もエラーが出なかったこと。
コンストラクタ内でのエラー処理は色々面倒くさいらし。exception投げてもデストラクタ呼ばれないとか。*2
何でエラー吐かなかったのかちゃんと調べてないけど、何もエラー吐かずに止まったらとりあえずコンストラクタ内の処理を見てみると良いかも知れない。

*1:require_onceでmodule.phpを呼び出すところ

*2:継承して生成したときに継承元が__destructされない