线上服务器file_get_contents失效及cURL下载图片损坏问题求助
问题排查与解决方案
一、网络层面限制排查(核心原因)
线上服务器和本地环境的网络差异是主要问题,优先排查以下两点:
- 目标网站反爬拦截:云服务器IP常被标记为爬虫IP,直接请求会被目标网站拒绝/超时。解决办法是给请求添加模拟浏览器的HTTP头:
针对file_get_contents:
针对cURL:$url = $_POST["url"]; $context = stream_context_create([ 'http' => [ 'header' => "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36\r\n" . "Referer: " . parse_url($url, PHP_URL_HOST) . "\r\n" ] ]); $content = file_get_contents($url, false, $context); $loc = "downloaded images/".basename($url); if(file_put_contents($loc, $content)){ echo "Downloaded successfully"; } else { echo error_get_last()['message']; }
也可以用服务器命令行直接测试请求:curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36");curl -v https://neindiabroadcast.com/wp-content/uploads/2022/11/20221122_071752.jpg,根据输出判断是连接超时还是被拒绝。 - 服务器出站规则限制:检查云服务器的安全组/防火墙,确保允许出站访问443端口(HTTPS协议),部分服务商默认会限制对外发起HTTP请求的权限。
二、cURL下载文件损坏的修复
你的cURL代码未处理请求失败场景,当请求出错时$result为false,写入文件就会生成损坏文件,同时优化传输方式:
set_time_limit(0); $loc = "downloaded images/".basename($_POST["url"]); $host = $_POST["url"]; $ch = curl_init(); curl_setopt($ch, CURLOPT_TIMEOUT, 28800); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); // 临时关闭SSL主机验证测试 curl_setopt($ch, CURLOPT_HEADER, false); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); curl_setopt($ch, CURLOPT_URL, $host); curl_setopt($ch, CURLOPT_REFERER, parse_url($host, PHP_URL_HOST)); curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"); // 直接让cURL写入文件,避免内存溢出导致文件损坏 $fp = fopen($loc, 'wb'); curl_setopt($ch, CURLOPT_FILE, $fp); $result = curl_exec($ch); if(curl_errno($ch)){ echo 'Curl error: ' . curl_error($ch); unlink($loc); // 删除损坏的空文件 } else { echo "Downloaded successfully"; } curl_close($ch); fclose($fp);
三、文件权限检查
线上服务器的downloaded images文件夹权限可能不足,导致写入的文件不完整:
- 确保文件夹所有者为PHP运行用户(如
www-data),权限设置为755,可通过代码临时设置:chmod("downloaded images/", 0755);,或用服务器命令行修改。
四、DNS解析验证
部分服务器DNS解析异常会导致无法访问目标域名,可尝试:
- 用目标域名的IP替换URL(通过
ping neindiabroadcast.com获取IP)测试; - 将服务器DNS更换为公共DNS(如
8.8.8.8)。
内容的提问来源于stack exchange,提问作者user20586864
相关产品推荐
相关产品推荐

