关于php curl支持并发请求,并毫秒控制超时

[b]为什么这么做?[/b]
目前的接口话的服务调用,为了保证性能和稳定性,我们都会对调用的第三方接口做并发,超时控制。

[b]代码实现(网上找的现成的)[/b]

public static function curlMultiRequest($urls, $options = array()) {
$ch= array();
$results = array();
$mh = curl_multi_init();

foreach($urls as $key => $val) {
$ch[$key] = curl_init();
if ($options) {
curl_setopt_array($ch[$key], $options);
}
curl_setopt($ch[$key], CURLOPT_URL, $val);
curl_multi_add_handle($mh, $ch[$key]);
}

$running = null;
do {
curl_multi_exec($mh, $running);
} while ($running > 0);

// Get content and remove handles.
foreach ($ch as $key => $val) {
$results[$key] = curl_multi_getcontent($val);
curl_multi_remove_handle($mh, $val);
}
curl_multi_close($mh);

return $results;
}

调用方式:

$urls = [
'http://www.baidu.com',
'http://www.qq.com'
];

$opts = [
CURLOPT_HEADER => false,
CURLOPT_TIMEOUT_MS => 50,//执行脚本超时
//CURLOPT_CONNECTTIMEOUT_MS => 50,//网络选址超时
CURLOPT_RETURNTRANSFER => true,
CURLOPT_NOSIGNAL => true, //这个是设定毫秒必须设定
];

curlMultiRequest($urls,$opts);


[b]注意事项[/b]
1.支持毫秒 cURL 7.16.2中被加入。从PHP 5.2.3起可使用
2.CURLOPT_TIMEOUT_MS,CURLOPT_CONNECTTIMEOUT_MS 未定义时

if (!defined('CURLOPT_CONNECTTIMEOUT_MS')) {
define('CURLOPT_CONNECTTIMEOUT_MS', 156);
}

if (!defined('CURLOPT_TIMEOUT_MS')) {
define('CURLOPT_TIMEOUT_MS', 155);
}


[list]
参考资料:
[*]http://stackoverflow.com/questions/9062798/php-curl-timeout-is-not-working
[*]http://www.laruence.com/2014/01/21/2939.html
[/list]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Hello!请放心,我不会透露任何关于您的信息。 关于您的问题,可以使用PHPcurl_multi_init函数以及相关函数来实现并发请求。具体步骤如下: 1. 初始化一个curl多个句柄:curl_multi_init。 2. 循环添加每个要请求curl句柄:curl_multi_add_handle。 3. 执行curl句柄并等待请求完成:curl_multi_exec。 4. 使用curl_multi_select等待io事件准备就绪。 5. 获取请求结果:curl_multi_getcontent。 下面是一个简单的示例代码: ``` $urls = array( 'http://www.example.com/api/endpoint1', 'http://www.example.com/api/endpoint2', 'http://www.example.com/api/endpoint3', ); $handles = array(); $results = array(); // 初始化curl多个句柄 $multi_handle = curl_multi_init(); // 循环添加每个要请求curl句柄 foreach ($urls as $url) { $handle = curl_init($url); curl_setopt_array($handle, array( CURLOPT_RETURNTRANSFER => true, CURLOPT_SSL_VERIFYHOST => false, CURLOPT_SSL_VERIFYPEER => false, )); curl_multi_add_handle($multi_handle, $handle); $handles[] = $handle; } // 执行curl句柄并等待请求完成 do { $status = curl_multi_exec($multi_handle, $running); } while ($status === CURLM_CALL_MULTI_PERFORM || $running); // 使用curl_multi_select等待io事件准备就绪 if ($status !== CURLM_OK) { die("Error: " . curl_multi_strerror($status)); } do { $status = curl_multi_select($multi_handle, 1); if ($status === -1) { usleep(10); } // 获取请求结果 while ($info = curl_multi_info_read($multi_handle)) { $handle = $info['handle']; $content = curl_multi_getcontent($handle); $results[] = $content; curl_multi_remove_handle($multi_handle, $handle); curl_close($handle); } } while ($status === -1 || !empty($handles)); curl_multi_close($multi_handle); // 输出结果 print_r($results); ``` 希望这个回答对您有帮助!如果您有其它问题,请随时提出。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值