4

誰もが接続を閉じる方法を知っていますが(それ以外はflush()?)、その後もコードを実行し続けます。

ページが完成した後に発生する可能性のある長いプロセスをクライアントに見られたくありません。

4

5 に答える 5

9

あなたは見たいかもしれませんpcntl_fork()-それはあなたがあなたの現在のスクリプトをフォークして別のスレッドでそれを実行することを可能にします。

ユーザーがファイルをアップロードした後、スクリプトがサードパーティのサーバーとの通信など、さまざまな操作を実行するプロジェクトで使用しましたが、これには時間がかかる可能性があります。最初のアップロード後、スクリプトはフォークして次のページをユーザーに表示し、親は自殺しました。その後、子は実行を継続し、AJAXを使用して返されたページからステータスを照会されました。これにより、アプリケーションの応答性が大幅に向上し、ユーザーは実行中のステータスに関するフィードバックを受け取りました。

このリンクには、その使用方法の詳細があります。

を使用できない場合はpcntl_fork、いつでもフォールバックして、キューからさらにアイテムを実行するためのAJAXリクエストを起動するページをすばやく返すことができます。


mvdsは、次のことを通知します(特定のサーバー構成に適用できます) 。ApacheWebサーバー全体ではなくfork、代わりに別のプロセスを開始します。そのプロセスが生きている子供をフォークオフさせましょう。proc_openPHPスクリプトとプロセスの間の完全なfdインタラクションを取得するために探してください

于 2010-07-17T05:48:22.037 に答える
5

ページが完成した後に発生する可能性のある長いプロセスをクライアントに見られたくありません。

悲しいことに、このページは長いプロセスが終了するまで完成しません。したがって、あなたが求めることは不可能です(あなたが推測する方法で実装することはできません)。

ここで重要なのは、Jhongの回答で指摘され、animusenのコメントで逆に示唆されていることですが、Web開発者としてHTTPを使用する場合の全体的なポイントは、リクエストにできるだけ早く応答することです。他のことをやり直すと、それはおそらくもう少し良かったかもしれないいくつかの設計上の決定を示しています:)

通常、「ページ」を返した後に実行している追加のタスクを取得し、それを他のプロセスに渡します。通常、これは、タスクをジョブキューに配置し、CLIデーモンまたはcronジョブにそれを取得させて実行させることを意味します。必要です。

正確な解決策は、あなたがしていることに固有であり、さまざまな(一連の)質問への答えです。しかし、これについては、接続を閉じることはできません。そのスクリプト/ページから長時間実行されているプロセスをリファクタリングすることを検討することをお勧めします。

于 2010-07-17T06:28:04.107 に答える
4

PHPのignore_user_abort設定を見てください。ignore_user_abort()関数を使用して設定できます。

(オプションの)使用例は、次の重複する質問で示されています(そして、OPによって機能していると報告されています)。

基本的に、PHPマニュアルのユーザーノートへの参照を提供します。中心的なものは

これは、次の2つのベースでもあります。調査することをお勧めします。

于 2010-07-17T09:16:00.387 に答える
3

Apache Webサーバー全体ではなくfork、代わりに別のプロセスを開始します。そのプロセスが生きている子供をフォークオフさせましょう。proc_openPHPスクリプトとプロセスの間の完全なfdインタラクションを取得するために探してください。

于 2010-07-17T08:52:26.330 に答える
2

この問題は、実行する必要のある作業をジョブキューに挿入し、cronスクリプトでバックエンドジョブを定期的に取得することで解決しました。おそらくあなたが必要としているものとは正確には一致しませんが、データ集約型のプロセスには非常にうまく機能します。

(現金がたくさんあり、実証済みのソリューションが必要な場合は、Zend Serverのジョブキューを使用することもできます)

于 2010-07-17T09:20:20.347 に答える