LoginSignup
5
5

More than 1 year has passed since last update.

Herokuで1分に1回PHPを実行する

Last updated at Posted at 2016-11-29

お疲れ様です。
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分で実行してもらうことにします。

設定画面はこんな感じ
image

これで、10分に1回は実行してもらうことができました。
(ただし、ベストエフォートのため、実行されない時があると、どこかに書いてあった覚えがあります)

2. シェルスクリプトから1分に1回PHPを実行する

さて、10分に1回シェルスクリプトが実行できるようになったので、
あとはそのシェルスクリプトから1分に1回、計10回PHPを実行するようにすれば、
目的が達成できます。

ソースはこんな感じで書きました。

tweets_notifier_resident.sh
#!/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

とします!

5
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
5