PHP cURL请求未在2秒内得到响应时能否继续执行后续代码?
解决方案
完全可以实现,cURL内置了超时控制参数,你只需要增加2个配置项即可实现2秒超时自动终止请求,不阻塞后续代码执行。
核心配置说明
CURLOPT_TIMEOUT:设置整个cURL请求执行的最大秒数,设置为2即可达到你要的2秒超时效果CURLOPT_CONNECTTIMEOUT:可选配置,设置建立连接阶段的最大超时秒数,建议设置为1,避免连接阶段消耗过多时间
注意:如果是PHP运行在CLI模式下,超时配置不受PHP本身的max_execution_time限制,cURL的超时配置可以独立生效
修改后的完整代码
<?php $responseHeaders = []; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $link); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "GET"); // 新增超时配置 curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 1); // 连接超时1秒 curl_setopt($ch, CURLOPT_TIMEOUT, 2); // 总请求超时2秒 curl_setopt($ch, CURLOPT_HTTPHEADER, [ "Accept: application/json", "Content-Type: application/json" ]); curl_setopt($ch, CURLOPT_HEADERFUNCTION, function ($curl, $header) use (&$responseHeaders) { $len = strlen($header); $header = explode(':', $header, 2); if (count($header) < 2) return $len; $responseHeaders[strtolower(trim($header[0]))][] = trim($header[1]); return $len; }); $response = curl_exec($ch); $err = curl_error($ch); $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); // 可选,获取响应状态码判断超时情况 curl_close($ch); // 超时判断示例 if (str_contains($err, 'Operation timed out')) { // 自定义超时后的处理逻辑,直接跳过即可 $response = null; } // 后续代码正常执行
补充说明
如果你需要精确到毫秒级的超时控制,可以使用CURLOPT_TIMEOUT_MS和CURLOPT_CONNECTTIMEOUT_MS参数,单位为毫秒,对应2秒超时设置为2000即可。超时后curl_exec会返回false,通过curl_error可以拿到超时相关的错误信息,你可以根据错误类型做后续的兼容处理。
内容的提问来源于stack exchange,提问作者Fil
相关产品推荐
相关产品推荐

