web cron サービスの代替えとして AppFog を使ってみる (PHP編)

無料や格安のレンタルサーバーだと cron が使えない場合が多い。

そんな時は web cron サービスを使ったりする。

ところが間隔に制限があったり不安定だったりと残念な思いをするコトがしばしば・・・

そこで PaaS をある程度までは無料で使えちゃう AppFog を代替えにしてみた!

という貧乏くさい備忘録です。。。

前準備

とりあえず AppFog のアカウントを取得。

AppFog

SignUp から必要項目を入力するだけなので詳細は割愛。

次にソースコードをデプロイ(アップロード)する為に必要な専用ツール「af」を使えるようにする。

AF CLI Tool

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

スポンサーリンク

シェアする

  • このエントリーをはてなブックマークに追加

フォローする

スポンサーリンク