You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用PHP Curl获取Casablanca iCal链接内容超时失败问题咨询

问题:PHP Curl请求Casablanca服务器iCal链接超时失效

此前正常运行的PHP Curl获取iCal链接代码近日突然失效。用Postman能成功获取目标Casablanca服务器的iCal内容,但用这段Curl代码请求时,无论设置10秒还是120秒超时,都会触发「connection timed out after X milliseconds」错误,var_dump无输出。更换其他服务器的iCal链接时Curl可正常工作,怀疑被目标服务器封禁,请求排查原因。

原代码

<?php    
$useragent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36';
$request_url = 'https://interface.casablanca.at/Export/ical.asmx/Get?Customer=A_6450_PEAK&q=QV82NDUwX1BFQUs6NQ';
$curl_timeout = 5; // seconds
$ch = curl_init();
if (strpos($request_url, 'https://') !== false) {
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
}
curl_setopt($ch, CURLOPT_URL, $request_url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_USERAGENT, $useragent);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $curl_timeout);
curl_setopt($ch, CURLOPT_TIMEOUT, $curl_timeout);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_MAXREDIRS, 5);
curl_setopt($ch, CURLOPT_ENCODING, ''); // handle all encodings

$content =  curl_exec($ch);
if (curl_errno($ch)) {     
  echo 'Error:' . curl_error($ch); 
}
curl_close($ch);
$info = curl_getinfo($ch);

var_dump($info);
var_dump($content);
?>

排查方向与修复建议

1. 确认IP封禁问题

Postman能成功请求,大概率是你的服务器IP被目标站点封禁——Postman通常使用本地IP,而PHP代码部署在服务器上,两者IP不同。验证方式:

  • 给Curl添加代理(使用Postman所在的本地IP),如果请求成功,即可确认是IP封禁。
  • 联系目标站点管理员,申请解封服务器IP。

2. 补全请求头信息

Postman会自动携带浏览器默认的多组请求头,你的代码仅设置了User-Agent,可能缺少关键头导致被拦截。建议补充以下常见头:

curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    'Accept: text/calendar, text/plain, */*',
    'Accept-Language: en-US,en;q=0.9',
    'Connection: keep-alive'
));

3. 调整超时设置

原代码超时仅5秒,目标服务器可能响应较慢,先调高超时时间测试:

$curl_timeout = 30; // 调整为30秒
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $curl_timeout);
curl_setopt($ch, CURLOPT_TIMEOUT, $curl_timeout);

4. 启用SSL验证

原代码禁用了CURLOPT_SSL_VERIFYPEER,部分服务器会拒绝这类不安全的请求。建议开启验证,并配置CA证书路径(服务器通常自带默认CA证书,如Linux的/etc/ssl/certs/ca-certificates.crt):

curl_setopt($ch, CURLOPT_CAINFO, '/etc/ssl/certs/ca-certificates.crt');
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);

5. 检查Cookie会话

Postman可能保存了目标站点的Cookie,而你的Curl代码未携带。可以用Postman导出请求的Curl命令,对比你的代码,补充缺失的Cookie或其他参数。

内容的提问来源于stack exchange,提问作者maidan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 07:14:58