PHP也可以并发请求了

并发请求,不需要返回比如群发之类的可以用下面的函数

//并发POST请求
public function multiRequest($urls) {
	    $mh = curl_multi_init();
	    $urlHandlers = [];
	    $urlData = [];
	    // 初始化多个请求句柄为一个
	    foreach($urls as $value) {
	        $ch = curl_init();
	        $url = $value['url'];
	        $params = $value['params'];
	        curl_setopt($ch, CURLOPT_POST, TRUE);
            curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
            curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-type: application/json'));
	        curl_setopt($ch, CURLOPT_URL, $url);
	        // 设置数据通过字符串返回,而不是直接输出
	        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
	        $urlHandlers[] = $ch;
	        curl_multi_add_handle($mh, $ch);
	    }
	    $active = null;
	    // 检测操作的初始状态是否OK,CURLM_CALL_MULTI_PERFORM为常量值-1
	    do {
	        // 返回的$active是活跃连接的数量,$mrc是返回值,正常为0,异常为-1
	        $mrc = curl_multi_exec($mh, $active);
	    } while ($mrc == CURLM_CALL_MULTI_PERFORM);
	    // 如果还有活动的请求,同时操作状态OK,CURLM_OK为常量值0
	    while ($active && $mrc == CURLM_OK) {
	        // 持续查询状态并不利于处理任务,每50ms检查一次,此时释放CPU,降低机器负载
	        usleep(50000);
	        // 如果批处理句柄OK,重复检查操作状态直至OK。select返回值异常时为-1,正常为1(因为只有1个批处理句柄)
	        if (curl_multi_select($mh) != -1) {
	            do {
	                $mrc = curl_multi_exec($mh, $active);
	            } while ($mrc == CURLM_CALL_MULTI_PERFORM);
	        }
	    }
	    // 获取返回结果
	    foreach($urlHandlers as $index => $ch) {
	        $urlData[$index] = curl_multi_getcontent($ch);
	        // 移除单个curl句柄
	        curl_multi_remove_handle($mh, $ch);
	    }
	    curl_multi_close($mh);
	    return $urlData;
	}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值