4

init()curlとclose()関数と混同しています。これらの状況のそれぞれでいつ curl ハンドルを閉じる必要があるかを知りたい:
1. 単一のハンドルを使用して、さまざまなオプションで「単一の」URL を取得する。例えば:

$curl=curl_init('google.com');
curl_setopt($curl,CURLOPT_FOLLOWLOCATION,true);
curl_exec($curl);

今、FOLLOWLOCATIONをfalseに設定したいと思います。curl_close($curl) を実行し、最初からすべてを実行するか、オプションを設定して次のように再度実行する必要があります。

curl_setopt($curl,CURLOPT_FOLLOWLOCATION,false);
curl_exec($curl);

2.単一のハンドルを使用して「複数の」URL を取得します。例えば:

$curl = curl_init('google.com');
curl_exec($curl);

今、私はstackoverflow.comを手に入れたいです。ハンドルを閉じて最初からやり直すか、ハンドルを閉じずに別の URL を設定するか。このような:

$curl = curl_init('stackoverflow.com');
curl_exec($curl);

3. 複数のハンドルを使用して、複数の URL を取得します。これは私のコードです:

$CONNECTIONS=10;
$urls=fopen('urls.txt','r');
while(!feof($urls))
{
   $curl_array=array();
   $curl=curl_multi_init();
   for($i=0;$i<$CONNECTIONS&&!feof($urls);$i++)             
            //create 10 connections unless we have reached end of file
   {
        $url=fgets($urls);                    //get next url from file
        $curl_array[$i]=curl_init($url);      
        curl_multi_add_handle($curl,$curl_array[$i]);
   }
   $running=NULL;
   do
   {
       curl_multi_exec($curl,$running);
   }while($running>0);
   for($i=0;$i<$CONNECTIONS;$i++)    
   {
       $response=curl_multi_getcontent($curl_array[$i]);
       curl_multi_remove_handle($curl,$curl_array[$i]);
       curl_close(($curl_array[$i]));
   }
   curl_multi_close($curl);
}

ご覧のとおり、各シングル ハンドルの内容を取得した後、マルチ ハンドルからハンドルを削除し、シングル ハンドルを閉じてから、for ループの後でマルチ ハンドルを閉じています。この慣行は正しいですか、それともハンドルを閉めすぎていますか?
ありがとう

4

1 に答える 1

3

いつハンドルを閉めますか?

簡単に言えば、完了したら閉じます。

特定の質問に対処するには:

  1. curl ハンドル (単一のリソース) を再利用する予定がある場合は、完了したら閉じます。
  2. 複数の curl ハンドル (複数のリソース) がある場合は、curl_multi_*示したようにそれらを関数と一緒に実行するか、それらを順番に実行して、そのリソースを使い終わったら curl ハンドルを閉じることができます (#1 を参照)。
  3. これは私には正しいように見えます。

curl ハンドルを再利用する場合は、キャッシング、リダイレクト、および同じリソースへの複数のリクエストに影響を与える可能性のあるその他のオプション設定などに注意してください。

各リソースを 1 回要求するようにコードを作成することをお勧めします。

于 2013-02-05T17:02:43.193 に答える