お疲れ様です。
GMOリサーチの石黒です。
先日の記事(CakePHP3縛りのハッカソンで新着ツイート通知バッチ作ってみた)
にて、Herokuで1分に1回PHPを実行して、新着ツイートの監視をしてみました。
その詳細な方法について、ご紹介します。
0. ご注意
Herokuの無料枠には実行時間の制限があり、全アプリで1,000時間/月と決まっています。
そのため、できるだけ実行時間を節約したいというところから、シェルスクリプトをcronで実行してみてはどうかと考えました
が、
実際にはシェルスクリプトの実行時間もそこに含まれますので、
これを実践すると一つのアプリが24時間稼動しっぱなしの状態になるようですので
お気をつけください。
結局、24時間稼働して良いなら、デーモンにしてしまった方が良いと思いましたが、コケた時の対応などのノウハウが無いため、短い間隔でのcron実行が手軽で保守性があるかなと思います。
1. Heroku Schedulerで10分に1回シェルスクリプトを実行する
Heroku上ではcronを動かすことができません。
その代わりにHeroku Schedulerを使うのですが、
これには設定が10分、1時間、1日の3段階しかありません。
そのため、とりあえず一番間隔の短い10分で実行してもらうことにします。
これで、10分に1回は実行してもらうことができました。
(ただし、ベストエフォートのため、実行されない時があると、どこかに書いてあった覚えがあります)
2. シェルスクリプトから1分に1回PHPを実行する
さて、10分に1回シェルスクリプトが実行できるようになったので、
あとはそのシェルスクリプトから1分に1回、計10回PHPを実行するようにすれば、
目的が達成できます。
ソースはこんな感じで書きました。
# !/bin/bash
if [ $# -lt 2 ]; then
echo "usage: tweets_notifier_resident.sh LOOP_COUNT SLEEP_SECONDS [SHELL_OPTION]"
exit 1
fi
LOOP=$1 # 実行回数
SLEEP=$2 # sleep秒数
shift 2 # 残りの引数を渡すため、引数をシフト
for i in `seq 1 1 $LOOP`
do
bin/cake tweets_notifier $*
if [ $i -lt $LOOP ]; then
sleep $SLEEP
fi
done
第一引数が実行回数、第二引数がsleep秒数です。
つまり、1分に1回、計10回実行するには、
/bin/bash sh/tweets_notifier_resident.sh 10 60
とします!