無料や格安のレンタルサーバーだと cron が使えない場合が多い。
そんな時は web cron サービスを使ったりする。
ところが間隔に制限があったり不安定だったりと残念な思いをするコトがしばしば・・・
そこで PaaS をある程度までは無料で使えちゃう AppFog を代替えにしてみた!
という貧乏くさい備忘録です。。。
前準備
とりあえず AppFog のアカウントを取得。
SignUp から必要項目を入力するだけなので詳細は割愛。
次にソースコードをデプロイ(アップロード)する為に必要な専用ツール「af」を使えるようにする。
Windows の場合は Ruby Installer for Windows をインストールして、スタートメニューの [Ruby x.x.x-pxxx(-x64)] から [Ruby コマンドプロンプトを開く] を起動させる。
開いたコマンドプロンプトに、
gem update --system gem install af
こんな感じで入力すれば準備は完了。
ログイン
早速ログインしてみる。
af login
登録したメールアドレスとパスワードを入れて
Successfully logged into
とでればOK。
途中、警告がでるけど
[WARNING] DL is deprecated, please use Fiddle
とりあえず無視しても大丈夫っぽい。
実行コード
「5分おきに特定のURLにアクセス」を PHP でやってみる。
実行スクリプト名 [app.php]
<?php set_time_limit(0); $url = "http://HOGE.com/hoge.php"; while (true) { file_get_contents($url); sleep(300); } ?>
ようするに PHP の最大実行時間を制限なしにして、
set_time_limit(0);
無限ループをかけて、
while (true) {
処理を実行したら、
file_get_contents($url);
スリープで待機してるだけ。
sleep(300);
実際は非同期な処理にしないと時間がズレていくと思われるが。。
app 作成&デプロイ
スタンドアロンのバックグラウンドワーカーにするので AppFog のコントロールパネルからではなく af からアプリを作成する。
作成と同時にデプロイもするので、コマンドプロンプトのカレンドディレクトリを上の app.php が保存されている場所に移動させておくこと。
更にディレクトリ内のファイルは全部デプロイされるので余計なものは消しておく。
早速実行。
af push cron_test_01
とりあえずアプリ名は「cron_test_01]としてみた。
対話式で進行するので次のように設定する。
Would you like to deploy from the current directory? [Yn]: Detected a PHP Application, is this correct? [Yn]: n 1: Rails 2: Spring 3: Grails 4: Lift 5: JavaWeb 6: Standalone 7: Sinatra 8: Node 9: PHP 10: Erlang/OTP Rebar 11: WSGI 12: Django 13: aspdotnet 14: Rack 15: Play Select Application Type: 6 Selected Standalone Application 1: clr20 2: clr40 3: java 4: node04 5: node06 6: node08 7: node10 8: php 9: python2 10: ruby18 11: ruby192 12: ruby193 Select Runtime: 8 Selected php Start Command: php app.php 1: CLC - Santa Clara 2: AWS US East - Virginia 3: AWS EU West - Ireland 4: AWS Asia SE - Singapore Select Infrastructure: 4 Application Deployed URL [None]: Memory reservation (128M, 256M, 512M, 1G, 2G) [128M]: How many instances? [1]: Create services to bind to 'cron_test_01'? [yN]: Would you like to save this configuration? [yN]: Creating Application: OK Uploading Application: Checking for available resources: OK Packing application: OK Uploading (0K): OK Push Status: OK Staging Application 'cron_test_01': OK Starting Application 'cron_test_01': OK
色つきの部分がデフォルト以外を設定した箇所。
「PHPっぽいけど合ってるかい?」みたいな意味のようだが「n」を選択して拒否る。
Detected a PHP Application, is this correct? [Yn]: n
スタンドアロンにするので「6」(Standalone) を選択。
Select Application Type: 6
ランタイムは PHP を使うので「8」(PHP) を選択。
Select Runtime: 8
開始コマンドは上で作成した app.php を php で実行。
Start Command: php app.php
インフラはどこでもいいけど、近場の AWS シンガポールにした。
Select Infrastructure: 4
その他、 Deployed URL はスタンドアロンなので必要ないし、メモリやインスタンスは最小で問題ない。
サービスのバインドも不要なので、デフォルト値を Enter で送ればよし。
デプロイが完了すれば勝手に動き始めてる筈。
当然のことながら無茶や悪用は厳禁です。
おまけ
もちろん AppFog のコントロールパネルにも追加されており、オン・オフの切り替えやリソースの変更も通常のアプリと同様に操作できるはず。
最後にお行儀よくログアウトしてみる。
af logout
(参考サイト)
Running PHP workers on AppFog