これは…ちょっと複雑です。
私が欲しい
run php as service where php may run without being connected to client
php execution can be triggered using http request by client
php (continuous or triggered) have full access to the resources
php can send the data from the resources to the client on response
最初のことは簡単に達成できます。PHP をコマンド ラインとしてインストールし、無限ループ (コマンド ラインには有効期限がありません) で実行するか、必要に応じて crontab サービスとして実行するだけです。これを実現するためのユーティリティがいくつかあります。X 秒ごとにスクリプトを実行するか、スクリプトが終了するとすぐにスクリプトを再起動します。
スクリプトが何らかの方法で (たとえば、データベースを介して) 「実行する作業」があるかどうかをチェックする場合、目的 2 も達成されます。HTTP Web クライアント スクリプトは、データベースに詳細を挿入するだけで済みます。マスター実行スクリプトが Web サーバーによって起動されました。実際に何が起こるかというと、マスター スクリプトは通常すぐに終了しますが (サーバーに過負荷をかけないように、数秒間スリープすることもあります)、次に実行するときは、実行する作業を見つけて実行します。
目的 3 は、マスター スクリプトをより多くの権限で実行することで達成できます。ユーザー スクリプトは「すべてのリソースにアクセスする」ことはできませんが、謙虚にデータを要求できます。マスター スクリプト (より安全) は、そのようなデータの読み取りと、クライアントが取得できるデータベース (またはファイル システム) への書き込みを許可する場合があります。それ。
最後に、目標 4 は、クライアント スクリプト側でデータを読み取り、それらをクライアント ブラウザーに提供することで達成できます。
サンプル ワークフロー:
- 15:55:00 The master script runs. SELECT worktodo FROM thingstodo returns nothing
- 15:56:00 The master script runs. SELECT worktodo FROM thingstodo returns nothing
- 15:56:17 The client runs; it is a request for data from serial port.
- 15:56:17 The request is stored in the DB and gets ID 12345 and status "WAITING"
仮説 1
- 15:56:18 クライアントは「作業がキューに入れられました。お待ちください」と書き込んだ後に終了し、ループする HTTP ヘッダーを自身に送信します。
Location: http://mylocation/script.php?check=12345
仮説 2
- 15:56:19 クライアントは、念のため 10 秒間待機し、毎秒チェックを実行して、作業が完了したかどうかを確認します。成功した場合は、15:17:35 に従って続行します。それ以外の場合は、仮説 1 と同様に、「また来ます」と言い、Location ヘッダーで終了します。- 15:56:20 Location ヘッダーのおかげで、クライアント スクリプトは check=12345 でリロードされます。DB に接続し、12345 のステータスが COMPLETED ではないことを確認し、「Working...」アニメーションを表示し、5 秒間待機し、再び Location: で終了します。
- 15:57:00 The master script gets awakened and finds there is one job in WAITING status; updates it in LOCKED status and places its own IP and PID in the proper fields, then decodes the work details, sees what needs to be done and does it.
- 15:57:33 The work is done and the row gets updated again; now STATUS=COMPLETED
- 15:57:35 Meanwhile the client gets called again, but this time it finds COMPLETED, so happily fetches the data and shows it to the customer, also deleting the row not to clutter the DB.
その他の可能性: - マスター スクリプトは、ジョブ行に入力された電子メール フィールドを見つけて、適切なリンクを含む電子メールをユーザーに送信します。- マスター スクリプトは実際にはほとんどの時間スリープ状態で、ポート XYZ のソケットにバインドされています。クライアント スクリプトは、何かを実行する必要があるときにマスター スクリプトを「目覚めさせ」ます。これにより、要求と応答の間の遅延が短縮されます。