crond でタスクを実行する際に$_SERVER['SERVER_NAME']が有効でない

原因と対策

CakePHPapp/Console/cakeを叩くコマンドをCrontab に登録したのですが思い通りに動かずはまったのでメモ。

php - Cron Job $_SERVER issue - Stack Overflow

  • $_SERVER['HTTP_HOST']$_SERVER['SERVER_NAME']などの変数はHTTPからのアクセスじゃないと有効じゃないよ。

なるほど、そう言われるとそうだ。

解決策としては

  • ホスト名をハードコーディングする
  • コマンドの引数(argv)にホスト名を渡す
  • $_SERVER['HTTP_HOST'が取得できなかった場合の処理を記述する
    • $host = isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : 'CLI';

やりたかったことはホスト名を見て、開発環境だったらファイルの保存先をここに本番環境だったらここに保存するということだった。 これらの解決策だと「ホスト名をハードコーディングする」でしか解決できない。。 もう少し調べる必要がある。。

Crontabで有効な環境変数

Crontabについて調べたことをいかにメモ。

Crontab を設定する際には、環境変数に注意する必要があります。

有効な環境変数は、「HOME」「SHELL」「LOGNAME」のみです。

ユーザーアカウントに設定している環境変数はしたがって、パスが設定されていないためにコマンドが実行されなかったり、環境変数に設定した各種設定情報が無効になるといったことが起こり得ます。

Crond で実行時に環境変数を利用するには、Crontab 内で宣言する方法や、コマンド実行時にシェルスクリプトを指定して、そのなかで宣言するなどの方法があります。

Rubyによるクローラー開発技法 巡回・解析機能の実装と21の運用例 6-2-2 Crondで動かす際の注意点

Rubyによるクローラー開発技法 巡回・解析機能の実装と21の運用例