4

我对 curlinit()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 句柄,请注意缓存、重定向和其他可能影响对同一资源的多个请求的选项设置。

我鼓励你开发你的代码来请求每个资源一次。

于 2013-02-05T17:02:43.193 回答