13

検索して検索して検索しましたが、それに関するリソースは見つかりませんでした。

AppFog の PHP アプリでワーカーを実行する方法はありますか?

その言語のフレームワークに基づいて、Ruby、Node.js、および Python ワーカーを実行するための手順しか見つかりませんでした。

4

2 に答える 2

30

いろいろいじくり回した結果、方法を見つけました!

PHP スクリプトでは、タイムアウト制限を0に設定し、次のように無限ループにする必要があります。

<?php
    set_time_limit(0);

    while (true) {
        print "blah\n";
        sleep(120);
    }

このコードは、2 分ごとに "blah" を出力します。

これを AppFog にデプロイするには、 console コマンドを使用する必要があります。afここで重要なことは、それが PHP アプリかどうかを尋ねられたときに「いいえ」と答えることです。

手順

  1. af pushディレクトリに
  2. アプリの言語を推測する場合はノーと言います
  3. アプリの種類として[スタンドアロン]を選択します。
  4. 今、あなたはPHPを選択します
  5. php index.phpまたは、アプリケーションのメイン ファイルに付けた任意の名前を入力します。

以下にすべてを示します。

D:\Users\Leonel\dev\app>af push
Would you like to deploy from the current directory? [Yn]:
Application Name: APP
Detected a PHP Application, is this correct? [Yn]: n
[...]
6: Standalone
[...]
Select Application Type: 6
Selected Standalone Application
[...]
5: php
[...]
Select Runtime: 5
Selected php
Start Command: php index.php
1: AWS US East - Virginia
[...]
Select Infrastructure: 1
Application Deployed URL [None]:
Memory reservation (128M, 256M, 512M, 1G, 2G) [128M]:
How many instances? [1]:
Bind existing services to 'APP'? [yN]:
Create services to bind to 'APP'? [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 'APP': OK
Starting Application 'APP': OK

D:\Users\Leonel\dev\APP>af logs APP
====> /logs/stdout.log <====

blah
blah

いくつかのメモ

  • バックグラウンド タスクを実行するには別のアプリを作成する必要がありますが、たとえば、このアプリを他のアプリの同じサービス (データベースなど) にバインドしたり、このアプリを他のアプリにバインドしたりできcurlます。同じアベイラビリティーゾーンにあることを確認してください。
  • af logs APPワーカーの出力が得られるので、デバッグしてすべてが問題ないかどうかを確認できます。

それだけです。お役に立てば幸いです。

于 2012-11-27T23:21:06.303 に答える
1

優れたソリューション。評判が不十分でコメントできないため、元の回答を変更しています。

PHP 疑似 crontab を指定した秒に開始できるようにするには、次のように、スクリプトの開始時に強制ループを使用します。

<?php
    set_time_limit(0);

    // begin process at zero (00) second mark
    $cnt=0;
    while (true) {
      usleep(250000); // avoid excess looping
      if ( date('s',time()) == '00' ) {
        break;
      }
      if ( $cnt++ > 240 ) {
        break; // something has gone wrong...
      }
    }
    var_dump(date('s',time()));exit; // test/validate

    while (true) {
        print "blah\n";
        sleep(120);
    }
于 2015-05-14T08:28:12.187 に答える