curl_setopt($ch, CURLOPT_TIMEOUT_MS,200); //超时毫秒,cURL 7.16.2 中被加入。
从
PHP 5.2.3 起可使用
$data = curl_exec($ch);
$curl_errno = curl_errno($ch);
$curl_error = curl_error($ch);
curl_close($ch);
if($curl_errno >0){
echo "cURL Error ($curl_errno): $curl_error\n";
}else{
echo "Data received: $data\n";
}
}else{
// Server
sleep(10);
echo "Done.";
}
技巧:
1,cURL 版本 >= libcurl/7.21.0 版本,毫秒级超时是一定生效的,切记。
2,curl_multi 的毫秒级超时的问题,单次访问是支持 ms 级超时的,curl_multi 并行调多
个会不准。
二、流处理方式访问
HTTP
除了 curl,还经常使用 fsockopen、或 file 操作函数来进行 HTTP 协议的处理。
下面说说这方面的超时设置。
一般连接超时可以直接设置,但是流读取超时需要单独处理。
可以参考以下实现代码:
<?php
$tmCurrent = gettimeofday();
$intUSGone =($tmCurrent['sec']- $tmStart['sec'])*1000000
+($tmCurrent['usec']- $tmStart['usec']);
if($intUSGone > $this->_intReadTimeoutUS){
returnfalse;
}
或使用内置流处理函数
stream_set_timeout() 和 stream_get_meta_data() 处理:
<?php
// Timeout in seconds
$timeout =5;
$fp = fsockopen("example.com",80, $errno, $errstr, $timeout);if($fp){
fwrite($fp,"GET / HTTP/1.0\r\n");
fwrite($fp,"Host: example.com\r\n");