解析php中curl

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了解析php中curl相关的知识,希望对你有一定的参考价值。

参考技术A php的multi_curl功能慎用 因为某些版本的curl和php的搭配有Bug 所以你调试过没问题的代码很可能在别的机器上不正确  

  相信许多人对php手册中语焉不详的curl_multi一族的函数头疼不已 它们文档少 给的例子 更是简单的让你无从借鉴 我也曾经找了许多网页 都没见一个完整的应用例子 •curl_multi_add_handle •curl_multi_close •curl_multi_exec •curl_multi_getcontent •curl_multi_info_read •curl_multi_init •curl_multi_remove_handle •curl_multi_select 一般来说 想到要用这些函数时 目的显然应该是要同时请求多个url 而不是一个一个依次请求 否则不如自己循环去调curl_exec好了

   步骤总结如下 第一步 调用curl_multi_init 第二步 循环调用curl_multi_add_handle 这一步需要注意的是 curl_multi_add_handle的第二个参数是由curl_init而来的子handle 第三步 持续调用curl_multi_exec 第四步 根据需要循环调用curl_multi_getcontent获取结果 第五步 调用curl_multi_remove_handle 并为每个字handle调用curl_close 第六步 调用curl_multi_close 这里有一个网上找的简单例子 其作者称为dirty的例子 (稍后我会说明为何dirty)

复制代码 代码如下: * Here s a quick and dirty example for curl multi from PHP tested on PHP RC CLI / FreeBSD */

  $connomains = array( " " " );

  $mh = curl_multi_init();

  foreach ($connomains as $i => $url)      $conn[$i]=curl_init($url);       curl_setopt($conn[$i] CURLOPT_RETURNTRANSFER );       curl_multi_add_handle ($mh $conn[$i]);

  do $n=curl_multi_exec($mh $active); while ($active);

  foreach ($connomains as $i => $url)       $res[$i]=curl_multi_getcontent($conn[$i]);       curl_close($conn[$i]);

  print_r($res);

   整个使用过程差不多就是这样 但是 这个简单代码有个致命弱点 就是在do循环的那段 在整个url请求期间是个死循环 它会轻易导致CPU占用 % 现在我们来改进它 这里要用到一个几乎没有任何文档的函数curl_multi_select了 虽然C的curl库对select有说明 但是 php里的接口和用法确与C中有不同 把上面do的那段改成下面这样

复制代码 代码如下: do                         $mrc = curl_multi_exec($mh $active);                 while ($mrc == CURLM_CALL_MULTI_PERFORM);                 while ($active and $mrc == CURLM_OK)                         if (curl_multi_select($mh) != )                                 do                                         $mrc = curl_multi_exec($mh $active);                                 while ($mrc == CURLM_CALL_MULTI_PERFORM);                                        

   因 为$active要等全部url数据接受完毕才变成false 所以这里用到了curl_multi_exec的返回值判断是否还有数据 当有数据的时候 就不停调用curl_multi_exec 暂时没有数据就进入select阶段 新数据一来就可以被唤醒继续执行 这里的好处就是CPU的无谓消耗没有 了

   另外 还有一些细节的地方可能有时候要遇到 控制每一个请求的超时时间 在curl_multi_add_handle之前通过curl_setopt去做 curl_setopt($ch CURLOPT_TIMEOUT $timeout);

  判断是否超时了或者其他错误 在curl_multi_getcontent之前用 curl_error($conn[$i]);

lishixinzhi/Article/program/PHP/201311/21124

关于在php中使用curl发送get请求时参数传递问题的解析

get请求是最简单的请求,不过要注意自己的请求是http请求还是https的请求,因为https请求时要关闭SSL验证,不然验证通不过,没有办法请求到数据。

GET请求的参数

get传递参数和正常请求url传递参数的方式一样

 1 function get_info($card){
 2   $url ="http://www.sdt.com/api/White/CardInfo?cardNo=".$bank_card; 
 3   $ch = curl_init();
 4   //设置选项,包括URL
 5   curl_setopt($ch, CURLOPT_URL, $url);
 6   curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
 7   curl_setopt($ch, CURLOPT_HEADER, 0);
 8   //执行并获取HTML文档内容
 9   $output = curl_exec($ch);
10   //释放curl句柄
11   curl_close($ch);
12   return $output;
13 }

HTTPS请求时要注意SSL验证

function get_bankcard_info($bank_card){
  $url="https://ccdcapi.alipay.com/validateAndCacheCardInfo.json?_input_charset=utf-8&cardNo=".$bank_card."&cardBinCheck=true";
  $ch = curl_init();
  //设置选项,包括URL
  curl_setopt($ch, CURLOPT_URL, $url);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  curl_setopt($ch, CURLOPT_HEADER, 0);
  curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);//绕过ssl验证
  curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
  //执行并获取HTML文档内容
  $output = curl_exec($ch);

  //释放curl句柄
  curl_close($ch);
  return $output;
}

以上是关于解析php中curl的主要内容,如果未能解决你的问题,请参考以下文章

php curl详细解析和常见大坑

带有curl的php解析器xml,仅显示我想要的标签[重复]

CURL解析超时的解决方案

lamp架构-访问控制-禁止php解析屏蔽curl命令访问

关于在php中使用curl发送get请求时参数传递问题的解析

如何使用 CURL 解析 html 文件中的内容? [关闭]