Heroku에서 1분에 1회 PHP 실행

고마워요.
GMO 연구의 이시구로입니다.

요전날 기사( CakePHP3 묶인 Hackason으로 최신 트윗 알림 일괄 만들기 )
에서 Heroku에서 1분에 1회 PHP를 실행해, 새 도착 트윗의 감시를 해 보았습니다.
그 자세한 방법에 대해 소개합니다.

0. 주의



Heroku의 무료 프레임에는 실행 시간 제한이 있으며 모든 앱에서 1,000시간/월로 정해져 있습니다.
그래서 가능한 한 실행 시간을 절약하고 싶다는 점에서 쉘 스크립트를 cron으로 실행해 보는 것은 어떨까 생각했습니다.
그러나,
실제로는 쉘 스크립트의 실행 시간도 거기에 포함되므로,
이것을 실천하면 하나의 앱이 24시간 가동 없는 상태가 되는 것 같기 때문에
조심하세요.
결국, 24시간 가동해도 좋다면, 데몬으로 해 버리는 것이 좋다고 생각했습니다만, 이끼 때의 대응등의 노하우가 없기 때문에, 짧은 간격으로의 cron 실행이 간편하고 보수성이 있을까 라고 생각합니다.

1. Heroku Scheduler에서 10분에 한 번 쉘 스크립트 실행



Heroku에서 cron을 움직일 수 없습니다.
대신 Heroku Scheduler를 사용하지만,
여기에는 설정이 10분, 1시간, 하루의 3단계만 있습니다.
그러므로 우선 가장 간격이 짧은 10분에 실행하도록 한다.

설정 화면은 이런 느낌


이제 10분에 한 번 실행할 수 있었습니다.
(단, 베스트 에포트 때문에, 실행되지 않을 때가 있으면, 어딘가에 써 있던 기억이 있습니다)

2. 쉘 스크립트에서 분당 한 번 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

그리고!

좋은 웹페이지 즐겨찾기