php多卷曲问题

时间:2010-08-30 12:21:59

标签: php curl

我希望通过curl_exec获得多个页面,第一页正常,但所有其他页面 - 302 header,是什么原因?

$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, ROOT_URL);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
$content = curl_exec($curl); // here good content
curl_close($curl);

preg_match_all('/href="(\/users\/[^"]+)"[^>]+>\s*/i', $content, $p);

for ($j=0; $j<count($p[1]); $j++){
    $new_curl = curl_init();
    curl_setopt($new_curl, CURLOPT_URL, NEW_URL.$p[1][$j]);
    curl_setopt($new_curl, CURLOPT_RETURNTRANSFER, 0);
    $content = curl_exec($new_curl); // here 302    
    curl_close($new_curl);

preg_match('/[^@]+@[^"]+/i', $content, $p2);

}

像这样

2 个答案:

答案 0 :(得分:1)

您可能希望提供代码示例,以便我们了解您是否省略了某些内容。

302响应代码通常表示服务器正在将您重定向到其他位置(在Location响应标头中找到)。根据您使用的标志,CURL可以自动检索,也可以查看302响应并自行检索。

以下是如何让CURL遵循重定向(其中$ ch是卷曲连接的句柄):

curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);// allow redirects 

答案 1 :(得分:-1)

你可以使用更快的curl multi,并且可以并行获取所有url的数据。 你可以像这样使用它

//Initialize
$curlOptions = array(CURLOPT_RETURNTRANSFER => 1);//Add whatever u additionally want.
$curlHandl1 = curl_init($url1);
curl_setopt_array($curlHandl1, $curlOptions);

$curlHandl2 = curl_init($url2);
curl_setopt_array($curlHandl2, $curlOptions);

$multi = curl_multi_init();
curl_multi_add_handle($multi, $curlHandle1);
curl_multi_add_handle($multi, $curlHandle2);

//Run Handles
$running = null;
do {
  $status = curl_multi_exec($mh, $running);
} while ($mrc == CURLM_CALL_MULTI_PERFORM);

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

//Retrieve Results
$response1 = curl_multi_getcontent($curlHandle1);
$status1 = curl_getinfo($curlHandle1);

$response1 = curl_multi_getcontent($curlHandle1);
$status1 = curl_getinfo($curlHandle1);

您可以在此处找到更多信息http://www.php.net/manual/en/function.curl-multi-exec.php 查看Example1