XSERVERでcronするとPHP_SAPIがcgi-fcgiを返してきて困る件

困るケース

Slim Framework とかのフレームワークを使っている場合、CLI上での実行をするためにリクエストモックを作成してWebアクセスされたかのようにルーティングをするという小細工をしたりします。 この時に、 cron やコマンドラインから実行すれば、 PHP_SAPI または php_sapi_name() に、通常であれば cli という文字列が入ってくるので、それで CLI や cron からの実行であることを識別するわけです。

ところが、FAST CGI版PHPを採用しているレンタルサーバなどは、 CLI も cron も普通のウェブアクセスも、全て同様に cgi-fcgi が返ってくることがあるため、処理分けができなかったり予想外の挙動に陥ったりする場合があります。

XSERVER で対応

私が経験したのは XSERVER なので、こちらの対応を記載します。
プログラム側の修正は必要ありません。管理パネルでCron設定するPHPパスを変更すれば終わりです。

通常、こんな感じのコマンドをCronに設定すると思います。(前者は標準PHP、後者はバージョンを指定したPHP)

/usr/bin/php /home/user-id/examlple.com/public_html/index.php cron_run
/usr/bin/php5.6 /home/user-id/examlple.com/public_html/index.php cron_run

このPHPパス(/usr/bin/php/usr/bin/php5.6)は、管理パネルにログインし「サーバ情報」→「コマンドパス一覧」から確認できるものです。
ですが、これですと PHP_SAPIcgi-fcgi を返してくるわけです。

じゃーどうすりゃいいのか。
実は、このPHPパス、FAST CGI版PHPのパスにシンボリックリンクしているだけで、CLI版PHPやモジュール版PHPの本体はちゃんと別に残っているのです。
つまり、そのCLI版PHPやモジュール版PHPのパスに変更すればいいだけです。

以下のように。

/usr/bin/php-cli /home/user-id/examlple.com/public_html/index.php cron_run
/opt/php-5.6.30/bin/php /home/user-id/examlple.com/public_html/index.php cron_run

これであれば PHP_SAPIcli を返すようになりハッピーになります。
ただ、このパスは管理パネル「コマンドパス一覧」にはリストされていないため、XSERVER側が突然変更する可能性もありますので、十分ご注意下さい。

他のバージョンのPHPの場合は?

サーバやプランで違いがあるかもしれませんので、ご自分でSSHを有効にしてサーバ上で探してみるといいでしょう。
以下のパスにPHPがらみのバイナリが入っているようです。

ls -la /usr/bin/ | grep -i php
ls -la /opt/ | grep -i php

ご健闘を祈ります。🙏