webサービスを作った時に何回かハマったことがあるのでメモ。
PHPスクリプトをブラウザからアクセスしたら実行できるのに cron だと動かない。
こんな時に確認すべきことは4つ。
1. そもそもコマンドに間違いはないか
例えばこのように指定する。
/home/user/public_html/cron/hoge.php
2. shebangを追加しているか
実行するスクリプトファイルの1行目に
#!/usr/local/bin/php
こんなやつを追加する。
3. 相対パスを記述していないか
スクリプト内で外部のファイルを指定するときに相対パスで記述されていると正常に実行されない。
なぜなら、ブラウザで実行する場合と cron で実行する場合とで、カレントディレクトリが異なるためだ。
スクリプト内で外部ファイルを指定するときには必ず絶対パスで記述するようにしよう。
4. 実行ファイルのパーミッションは適切か
意外に忘れやすいのがこれ。
実行するスクリプトファイルのパーミッションを 755 に変更しよう。
それでも動かない時は
上の4つを確認しても動かない時は cron にエラーを吐いてもらおう。
cPanel でコマンドをこのように変更する。
/home/user/public_html/cron/hoge.php > /home/user/public_html/cron/result.txt 2>&1
この「1」と「2」はそれぞれ
・1 : 標準出力
・2 : 標準エラー出力
を意味しており、通常はコンソール画面に表示されるものをリダイレクトすることによって、標準出力と標準エラー出力の両方を result.txt へ出力することができる。
result.txt の内容を見て、プログラムを修正しよう。