PHP使用Curl通过代理获取网页内容无返回问题排查
先把你的代码贴出来方便参考:
function url_get_contents2 ($url) { $proxy = '###.###.###.###:8080'; //$proxyauth = 'user:password'; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL,$url); curl_setopt($ch, CURLOPT_PROXY, $proxy); //curl_setopt($ch, CURLOPT_PROXYUSERPWD, $proxyauth); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_HEADER, 1); $curl_scraped_page = curl_exec($ch); curl_close($ch); return $curl_scraped_page; } echo url_get_contents2("https://www.whatismybrowser.com/");
我之前也碰到过类似的头疼问题,换了N个代理都没效果,后来排查出几个常见的坑,你可以逐一验证:
代理本身失效或协议不匹配
很多公开代理看起来存活,但实际已经无法使用;另外如果目标URL是HTTPS,而你的代理是HTTP类型,需要明确指定代理类型,比如加上curl_setopt($ch, CURLOPT_PROXYTYPE, CURLPROXY_HTTP);。要是代理需要账号密码,你注释掉的CURLOPT_PROXYUSERPWD也会直接导致请求失败。SSL证书验证阻断请求
目标网站是HTTPS,CURL默认会严格验证SSL证书。如果你的服务器缺少根证书,或者代理做了中间证书劫持,请求会直接被拦截。可以先临时关闭验证测试:curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);注意:这只是临时测试方案,正式环境建议配置正确的证书路径,不要长期关闭验证。
未设置超时导致无响应假象
代理响应过慢时,CURL可能会一直等待默认超时时间,看起来像没有返回。可以手动设置超时参数:curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10); // 连接超时10秒 curl_setopt($ch, CURLOPT_TIMEOUT, 15); // 整体请求超时15秒服务器层面的限制
你的服务器可能开启了防火墙或SELinux,禁止了对外的代理请求。可以先尝试不用代理直接请求目标URL,如果能正常返回,那大概率是服务器限制了代理的使用;如果也不能返回,那就是服务器本身的网络连通性问题。最关键:开启CURL错误排查
你的代码完全没做错误捕获,根本不知道问题出在哪!一定要在curl_exec之后加上错误检查:if(curl_errno($ch)) { echo 'CURL Error: ' . curl_error($ch); }这会直接输出具体错误原因,比如代理连接失败、证书不匹配、超时等,比瞎猜效率高太多。
建议你先加上错误排查代码,拿到具体错误信息后再针对性解决问题。
内容的提问来源于stack exchange,提问作者AAA

