99

私はPHP Webアプリケーションに取り組んでおり、ユーザーのリクエストに基づいてリモートサーバーから誰かを取得するなど、リクエストでいくつかのネットワーク操作を実行する必要があります。

関数にデータを渡す必要があり、関数からの出力も必要な場合、PHP で非同期動作をシミュレートすることは可能ですか?

私のコードは次のようなものです:

<?php

     $data1 = processGETandPOST();
     $data2 = processGETandPOST();
     $data3 = processGETandPOST();

     $response1 = makeNetworkCall($data1);
     $response2 = makeNetworkCall($data2);
     $response3 = makeNetworkCall($data3);

     processNetworkResponse($response1);
     processNetworkResponse($response2);
     processNetworkResponse($response3);

     /*HTML and OTHER UI STUFF HERE*/

     exit;
?>

3 つの要求を行うと、各ネットワーク操作が完了するまでに約 5 秒かかり、アプリケーションの応答時間に合計 15 秒追加されます。

makeNetworkCall() 関数は、HTTP POST 要求を実行するだけです。

リモートサーバーはサードパーティの API であるため、そこを制御することはできません。

PS: AJAX やその他についての提案には答えないでください。私は現在、PHPを介してこれを行うことができるかどうかを探しています.C++拡張機能などを使用している可能性があります。

4

12 に答える 12

9

直接的な答えはありませんが、次のことを調べてください。

于 2014-05-05T08:05:46.440 に答える
4

ここでは、cURL が唯一の選択肢になります (それか、ノンブロッキング ソケットといくつかのカスタム ロジックを使用するかのいずれか)。

このリンクはあなたを正しい方向に導くはずです。PHP には非同期処理はありませんが、複数の Web リクエストを同時に作成しようとしている場合は、cURL multi が処理してくれます。

于 2013-01-09T13:34:38.993 に答える
3

HTML やその他の UI がデータを返す必要がある場合、それを非同期にする方法はないと思います。

PHPでこれを行う唯一の方法は、リクエストをデータベースに記録し、毎分cronチェックを行うか、Gearmanキュー処理のようなものを使用するか、コマンドラインプロセスでexec()を使用することだと思います

それまでの間、phpページは、進行状況を確認するために数秒ごとにリロードするhtmlまたはjsを生成する必要がありますが、理想的ではありません。

問題を回避するために、いくつの異なるリクエストが予想されますか? それらをすべて 1 時間ごとに自動的にダウンロードして、データベースに保存できますか?

于 2013-01-09T14:13:13.520 に答える
0

curl のラッパーである http v2 もあります。pecl 経由でインストールできます。

http://devel-m6w6.rhcloud.com/mdref/http/

于 2014-06-16T22:38:54.260 に答える
0

バックグラウンド プロセスにしたくない場合、最も簡単な解決策はproc_open(). 終了を待たずに端末コマンドを実行します。これを使用してスクリプトを呼び出すことができます。このようなもの:

proc_open('start cmd.exe php path-to-script.php', [], $pipes);

-rフラグを使用してインライン php コードを実行することもできます。PHP コマンドのヘルプを読んで、使用可能なすべてのフラグを確認してください。


もう 1 つの方法は、タイムアウトの警告を無視して、自分自身に HTTP リクエストを送信することです! php を使用してアイデアを簡単に実装できますfile_get_contents()

$stream_context = stream_context_create(['http'=>['timeout' => 1]]);
file_get_contents('http://localhost/script-to-run-async.php', false, $stream_context);

// Replace "http://localhost/path-to-script.php" with
// a script that should be run asynchronously.

結局、この回答を使用して、タイムアウトによって返される警告を無視できます。

于 2021-09-03T07:43:54.003 に答える