PHPをコマンドで実行・CRONで実行の結果が異なる理由
PHPでmb_strposを使い、XMLフィードから特定の文字列を抽出するコードを書きました。
こちらは、早朝にCronで自動で実行するものです。
手動(コマンド)で実行は問題なし
手動(コマンド)で実行すると期待通りの結果が出てきます。問題なさそうです。
Cronで実行すると失敗が多い
手動(コマンド)で実行すると期待通りの結果になるのに、Cronでは何故かmb_strposで抽出できていない文字列が多数出てきました。
文字コードを明示的に指定する必要がある
サーバーの内部はUTF-8ですし、PHPのソースコードもXMLフィードもUTF-8なので明示的に指定する必要など無いと思っていましたが、Cronなどで実行する場合は指定する必要があるようです。
PHPソースコードで指定
まず、PHPソースコードの上の方に以下を記載しました。
mb_internal_encoding("UTF-8");
このPHPはブラウザからアクセスして実行するのではなく、Cronで実行したいので.htaccessではなくPHPソース内に上記を記載しました。
しかし、Cronで実行すると抽出漏れが発生しています。
次に、mb_strposでも文字コードを指定しました。
mb_strpos(抽出したい文字列, "対象となる文字列", 0, "UTF-8")
これでも駄目です。Cron実行すると同様に抽出漏れが置きます。
正解はCronで文字コードを指定
結果、Cronを記述する時に以下のようにすることで解決しました。
01 9 * * * export LANG="UTF-8"; /usr/bin/php /home/*********.php
なぜCronでは上記のように文字コード指定しないと行けないのかは不明ですが、上記のようにCronで文字コードを指定することで無事解決しました。