このたび、生涯で初めてcronを使ったのですが、なぜかうまくいかず散々悩んだ挙句がCakePHPに仕込んでいた「環境変数による判定」が原因だったというお話。2度と同じ轍を踏まないようメモしておきます。
サーバはさくらインターネットのレンタルサーバ・ビジネスプロを使ってます。
CakePHPのアクションを用意する
ZiSTA Cake: XREAのCronでCakePHPのシェルを実行する
こちらのようにコマンドラインから実行できるシェル形式にする方法もあるようですが、よくわからんので、今回は
CakePHPでcronを使う方法 – ElectricBrain Standard
こちらにある、Cakeのアクションをcronで実行するやり方でチャレンジしました。
複数のECサイトの売上を集計して、1日1回メールで売上日報を送信します。
ソースは割愛しますが、ブラウザからそのURLを開くと日報メールが送信されることを確認しました。
cronに設定してみる
[000742]CRONや.mailfilterに記述したプログラムが動作しません。
こちらにあるとおり、
cd /home/アカウント名/www/app/webroot ; /usr/local/bin/php send_report.php
てなかんじでコマンドを入力して、とりあえずテストのため実行時間を5分後くらいにセットして実行してみたのですが…
メールがこない。。。なんで?
あれこれ試してみたのですが一向にうまくいかない。
じゃあ、そのコマンドを直接コンソールから実行してみよう!というわけでやってみたところ、原因がわかりました。
リターンされてきたデータを見ると、データベースの接続に失敗している模様。
ブラウザからはうまくいくのに、なんで?と思いながらも/app/core/database.phpを見てみたら、環境変数を条件にローカルの開発環境と本番環境を振り分けしてました(笑)
結論・まとめ
ローカルの開発環境と本番環境では使うデータベースが違うので、database.phpで以下のように振り分けを行っていました。
/app/core/database.php
if (strpos($_SERVER['SERVER_NAME'],"サイトURLの一部") === false) { // ローカル開発環境のDB設定 } else { // 本番環境のDB設定 }
cronが実行するときにはSERVER_NAMEなんてとれないんですね。
というわけで、以下のように修正しました。
// さくらの場合/home/アカウント名/www....というフルパスになるので、それで判定する。 // ローカル環境にも同じようにアカウント名が含まれていれば使えないけど、いかようにもなりますね。 if (strpos(dirname(__FILE__), "アカウント名") === false) { // ローカル環境のDB設定 } else { // 本番環境のDB設定 }
その後コンソールからもcronからも無事にメールが送信されました^^
僕の知識の外のトラブルだったので解決に少してこずりましたが、何とかなってよかった 🙂
今日から毎晩0:05に、売上報告が届く予定なので楽しみです♪