当前位置:Gxlcms > PHP教程 > 使用curl_multi实现并发请求步骤分析

使用curl_multi实现并发请求步骤分析

时间:2021-07-01 10:21:17 帮助过:8人阅读

这次给大家带来使用curl_multi实现并发请求步骤分析,使用curl_multi实现并发请求的注意事项有哪些,下面就是实战案例,一起来看一下。

  1. class CurlMultiUtil {
  2. /**
  3. * 根据url,postData获取curl请求对象,这个比较简单,可以看官方文档
  4. */
  5. private static function getCurlObject($url,$postData=array(),$header=array()){
  6. $options = array();
  7. $url = trim($url);
  8. $options[CURLOPT_URL] = $url;
  9. $options[CURLOPT_TIMEOUT] = 3;
  10. $options[CURLOPT_RETURNTRANSFER] = true;
  11. foreach($header as $key=>$value){
  12. $options[$key] =$value;
  13. }
  14. if(!empty($postData) && is_array($postData)){
  15. $options[CURLOPT_POST] = true;
  16. $options[CURLOPT_POSTFIELDS] = http_build_query($postData);
  17. }
  18. if(stripos($url,'https') === 0){
  19. $options[CURLOPT_SSL_VERIFYPEER] = false;
  20. }
  21. $ch = curl_init();
  22. curl_setopt_array($ch,$options);
  23. return $ch;
  24. }
  25. /**
  26. * [request description]
  27. * @param [type] $chList
  28. * @return [type]
  29. */
  30. private static function request($chList){
  31. $downloader = curl_multi_init();
  32. // 将三个待请求对象放入下载器中
  33. foreach ($chList as $ch){
  34. curl_multi_add_handle($downloader,$ch);
  35. }
  36. $res = array();
  37. // 轮询
  38. do {
  39. while (($execrun = curl_multi_exec($downloader, $running)) == CURLM_CALL_MULTI_PERFORM);
  40. if ($execrun != CURLM_OK) {
  41. break;
  42. }
  43. // 一旦有一个请求完成,找出来,处理,因为curl底层是select,所以最大受限于1024
  44. while ($done = curl_multi_info_read($downloader)){
  45. // 从请求中获取信息、内容、错误
  46. // $info = curl_getinfo($done['handle']);
  47. $output = curl_multi_getcontent($done['handle']);
  48. // $error = curl_error($done['handle']);
  49. $res[] = $output;
  50. // 把请求已经完成了得 curl handle 删除
  51. curl_multi_remove_handle($downloader, $done['handle']);
  52. }
  53. // 当没有数据的时候进行堵塞,把 CPU 使用权交出来,避免上面 do 死循环空跑数据导致 CPU 100%
  54. if ($running) {
  55. $rel = curl_multi_select($downloader, 1);
  56. if($rel == -1){
  57. usleep(1000);
  58. }
  59. }
  60. if($running == false){
  61. break;
  62. }
  63. }while(true);
  64. curl_multi_close($downloader);
  65. return $res;
  66. }
  67. /**
  68. * [get description]
  69. * @param [type] $urlArr
  70. * @return [type]
  71. */
  72. public static function get($urlArr){
  73. $data = array();
  74. if (!empty($urlArr)) {
  75. $chList = array();
  76. foreach ($urlArr as $key => $url) {
  77. $chList[] = self::getCurlObject($url);
  78. }
  79. $data = self::request($chList);
  80. }
  81. return $data;
  82. }
  83. }

相信看了本文案例你已经掌握了方法,更多精彩请关注Gxl网其它相关文章!

推荐阅读:

PHP使用file_get_contents发送http请求步骤详解

PHP通过strace定位排解故障位置并解决

以上就是使用curl_multi实现并发请求步骤分析的详细内容,更多请关注Gxl网其它相关文章!

人气教程排行