使用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
相关产品推荐
相关产品推荐

