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
그리고!
Reference
이 문제에 관하여(Heroku에서 1분에 1회 PHP 실행), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/Gro/items/5a072d0a59411987ce7d
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
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
그리고!
Reference
이 문제에 관하여(Heroku에서 1분에 1회 PHP 실행), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/Gro/items/5a072d0a59411987ce7d
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
#!/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
/bin/bash sh/tweets_notifier_resident.sh 10 60
Reference
이 문제에 관하여(Heroku에서 1분에 1회 PHP 실행), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/Gro/items/5a072d0a59411987ce7d텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)