0

PHP スクリプトで残りのコードを実行する前に、http ステータス (200 OK) を呼び出しスクリプトに送信したいと考えています。ステータス コードを送信するために、HTTP/1.1 200 OK を使用していますが、スクリプト全体の実行が終了した後にステータスを送信しているため、呼び出し元のスクリプトが待機します。それが可能かどうかはよくわかりません。助けはありますか?

詳細: a.php と b.php という 2 つのスクリプトがあるとします。a.php は b.php を呼び出して http ステータスを待っています。200 の場合は、別のことを続けます。私は、b.php スクリプトが呼び出されるとすぐに 200 応答を返し、その後独自のコードを続行するようなものにしたいと考えています。

ありがとう!

編集:コメントを読んだ後、私がやりたかったことは悪い考えだと理解しました。しかし、なぜ私はそれを考えていたのか、そのようなことができるのかを言わせてください.

a.php には、人々が画像をアップロードできる Web インターフェースがあり、アップロードが完了すると、a.php はこれらの画像を使用して何らかの処理を行う b.php を呼び出します。a.php を続行して、b.php が終了するまでハング/待機しないようにしたかったので、b.php が失敗した場合に備えて、エラーを「プッシュ」して、a.php が失敗についてユーザーにプロンプ​​トを表示できるようにすることができると考えました。 . 異なるスレッドを使用する必要がありますか?

4

6 に答える 6

2

私はAJAXまたはXMLRPCを考えていますが、@Andrewが言ったように、phpはそのように機能していません..NodeJSは本当に良い代替手段です...

于 2012-12-17T16:50:45.277 に答える
1

PHP は確かにそれを行うことができますが、少しトリッキーです。

ignore_user_abort(true);
header("Content-Length: 0");
header("Connection: Close");
flush();
session_write_close();

// do something that takes very long

これは必要最小限のコードです。セッションがない場合は、最後の通話を中断できます。

ただし、接続を閉じると、更新を送信することはできません。そのため、エラー報告で何かをしたい場合は、別の方法を見つける必要があります。

于 2013-08-06T16:36:26.257 に答える
1

うーん、ソケットベースの接続を可能にするものを使用したほうがよいようです。NodeJS をチェックしてください。PHP は、何らかの形式のソケット ベースの接続もサポートする可能性があると思います。「フラッシュ」を使用してやろうとしていることは、実際には本当に悪い習慣です。PHP は複数のペイロード用に設計されていません。AJAX を使用している場合は、さまざまな問題が発生します。

于 2012-12-17T16:25:06.527 に答える
0

a.php は b.php を呼び出し、http ステータスを待機しています。200 の場合は、別のことを続けます。

簡単な答えは、ウェブサーバーがバッファをフラッシュするタイミングを制御できないということです。したがって、Web サーバーをバイパスして b.php を呼び出す必要があります。問題は、exec / system / などを介して呼び出すと、b.hpp が a.php の子プロセスになることです。これは、 b.php が完了するまでに時間がかかる場合、非常に悪い考えです。

問題の解決策を実装するためにまったく異なる方法をとる必要があることを考えると、有用な作業を行うに無条件の 200 ステータスを発行する理由を知ることが非常に重要です (有用な作業を行っているに失敗する可能性が最も高い場合)。仕事)。

あなたが提供した情報に基づいて(これは大したことではありません)、これを実装する唯一の信頼できる方法は、メッセージキュー(およびデーモンで実行されているカスタムサブスクライバー)を介することです-成功したエンキュー操作をステータスコードを返しました。しかし、それには独自の複雑な問題があります。

于 2012-12-17T16:36:29.487 に答える
0

必要なことを行うような関数がflush()ありますが、特定の注意事項があります。詳しくはhttp://php.net/manual/en/function.flush.phpをご覧ください。

コードで PHP スクリプトを呼び出しているため、リストされているブラウザーの問題について心配する必要はありません。しかし、mod_gzip のようなものが有効になっている場合、これは不可能です。

于 2012-12-17T16:21:16.140 に答える
0

a.php で b.php を非同期に実行したい場合は、cURL POST メソッドを使用してスクリプトを開始することを検討してください。a.php でタイムアウトを 1 秒に設定すると、cURL セッションが停止します。また、b.php は実行され続けますが、a.php も実行され続けます。

于 2012-12-17T16:22:34.933 に答える