1

タイトルが示すように、リクエストを作成して何らかの情報を返すPHPスクリプトに対して作成できる非同期リクエストの数、またはハードウェアに依存する場合はおおよその数です。CURL

例えば:

AJAXJavascriptを介して同じ PHP スクリプトに対して非同期の get 要求を作成し、返された結果を配列に格納するループで 50 回実行されます。

CURLそのようなリクエストを合理的にいくつ作成できるか、またはサーバーが一度に 1 つのリクエストしか考えられないか?

4

1 に答える 1

3

あなたが探しているのはcurl_multi_*関数です。例は次のようになります。

//create the multiple cURL handle
$mh = curl_multi_init();

// Loop over pages and get set the URL to the cURL queue
foreach ($urls as $url) {

    // Get a cURL handle of the current URL
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    // Set all your other curl_setopt() options here for the transfers


    // Success
    if (gettype($ch) == 'resource' && get_resource_type($ch) == 'curl') {
        curl_multi_add_handle($mh, $ch);
    }
}

// Execute the handles
do {
    $mrc = curl_multi_exec($mh, $active);
} while ($mrc == CURLM_CALL_MULTI_PERFORM);

while ($active && $mrc == CURLM_OK) {
    if (curl_multi_select($mh) != -1) {
        do {
            $mrc = curl_multi_exec($mh, $active);
        } while ($mrc == CURLM_CALL_MULTI_PERFORM);
    }
}

私のサイトの 1 つでそれを使用して約 50 の URL をダウンロードしていますが、完全に機能します。もちろん、それはすべてスクリプトに割り当てられたメモリに依存します。URL によってスクリプトが長時間ハングしないように、タイムアウトを設定することもできます。

編集:実際にあなたの質問に答えるには、この関数に入力できる URL の数の制限がいくらかわかりません。接続速度に応じてサーバーごとに異なると思います。また、結果に対してプロセッサを集中的に使用する場合は、メモリとおそらく CPU によって異なります。しかし、そうは言っても、すべてのリクエストが同じリモート サーバーに対して行われている場合、その構成によってはボトルネックの問題が発生する可能性があります。これは、PHP の複数の cURL リクエストを使用しているか、AJAX を使用しているかに関係ありません。すべての Web サーバーは、同じスクリプトに対する多くの同時要求を処理するように作られていますが、次のいずれかの状況で問題が発生する可能性があります。

  • 送信される各リクエストは非常にリソースを消費します
  • リモート サーバーはデータベースをロックする必要があります。この場合、すべての要求が 1 つずつ実行されるため、すべてを一度に送信する場合と 1 つずつ送信する場合の違いはほとんどありません。
  • リモートサーバーは PHP でファイルベースのセッションを使用し、リクエストにはセッションが必要です
  • リモートサーバーは、最大数の同時クライアントを許可するように設定されています(通常、Nginxは、リクエストごとに新しいプロセスをフォークする必要がないため、Apacheよりも多くの同時クライアントを適切に処理します。問題が発生した場合は、調査することをお勧めしますWeb サーバーの切り替え)。この場合、後続のすべてのリクエストは特定のハード リミット量までキューに入れられ、それを超えるとドロップされます。
于 2012-09-11T23:03:52.830 に答える