3

私は、長時間実行されるタスクを伴う可能性のあるphpスクリプトに取り組んでいます。プロセスは次のようになります。ユーザー (私の場合は iOS アプリケーションを使用) が Web サービスにデータを送信します。プロセスの一部では、送信されたデータの一部を確認するために、私の php スクリプトがサード パーティに連絡する必要があります。クライアント (iPad 上) は、サードパーティからの応答を待つ必要はありません。

擬似コード:

Pull values from _POST[]
some simple validation
if _POST[] values are good
    return success to client
    further process submitted data with thrd party
    update database
else
    return error code and message

サーバーから単純な JSON オブジェクトを返して領収書としてのみ機能させ、送信されたデータを php スクリプトでさらに処理させるにはどうすればよいでしょうか。私が使用しているサードパーティは、応答が遅いことが知られています (数回のホップを行い、応答に数分かかることが知られています)。

4

1 に答える 1

6

出力バッファを早期に送信して処理を続けることはできますが (「接続を閉じた後も処理を続行する」を参照)、これはハックなソリューションであり、PHP のリクエスト ライフサイクルには適していません。

より良い方法は、処理キューを作成することです。クライアントがサービスにヒットすると、成功ステータスを返し、処理リクエストをキューに挿入します (たとえば、データベース テーブル/キー値ストアなど)。別のプロセス (CLI スクリプトを実行する cron ジョブなど) がタスクを取得し、先入れ先出しで実行します。これにより、長時間実行されるスクリプトを帯域外で実行できます。おそらく別のサーバーでも実行できます。

余談ですが、これにより、クライアントが長時間実行されているプロセスの結果を確認する必要がある場合でも、Web サーバーを解放してより多くのリクエストを処理することができます。クライアントはサーバーをポーリングして、ジョブが完了したかどうかを確認し、準備ができたら完全な応答を取得できます。

于 2012-06-27T03:26:53.680 に答える