2

マルチでcurl_multiを使用して、ファイルを異なるサーバーにアップロードしています。各サーバーにはアップロードが必要な複数のファイルがあるため、サーバーごとに curl_multi 要求があります。curl_multi ハンドルを実行するときは、次のように、同じループですべての curl_multi ハンドルを実行するだけです。

<?php
do {

 $continue_running=false;

 foreach($handles as $host => $handle) {

  if(!is_resource($handle[0])) {
   die("\nHandle is not a resource!\n");
  }

  if($running_{$host}) {
   if(curl_multi_exec($handles[$host][0], $running_{$host}) != CURLM_OK) {
    die("\ncurl_multi_exec failed!\n");
   }
   $continue_running=true;
  }

  if(!$running_{$host} && !$done_{$host}) {
   echo "$host finished in ".(microtime(1)-$start)." seconds\n";
   $done_{$host}=true;
  }
 }

} while ($continue_running);
?>

私が疑問に思っているのは、curl リクエストで実際に curl_multi_exec を何回呼び出す必要があるかということです。転送されるデータの小さなビットごとに呼び出す必要がありますか? 多くのCPUを使用していますが、「ビジーループ」が多すぎるためだと思います。それで、sleep(5); を追加できますか? 各ループの最後に使用する CPU サイクルを少なくするか、またはこれによりリクエストが大幅に遅くなりますか?

curl_multi_select を使用しますが、複数の curl_multi_exec が処理されているため使用できません。

4

1 に答える 1

2

curl_multi_exec() は、ソケットに対してデータを読み書きします。書き込みまたは読み取りができない場合は停止します。そのため、必要な呼び出しの数は、転送するデータの量とネットワークの速度によって異なります。curl_multi_select() は、ソケットが読み取り可能または書き込み可能になるまで待機します。

curl_multi_select() を使用して、すべてのホストを 1 つのマルチハンドル内に配置する必要があります。個々のリクエストの期間を知る必要がある場合は、 curl_getinfo ()またはcurl_multi_info_read()を確認してください。

于 2010-11-30T11:43:47.330 に答える