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

线上服务器file_get_contents失效及cURL下载图片损坏问题求助

问题排查与解决方案

一、网络层面限制排查(核心原因)

线上服务器和本地环境的网络差异是主要问题,优先排查以下两点:

  • 目标网站反爬拦截:云服务器IP常被标记为爬虫IP,直接请求会被目标网站拒绝/超时。解决办法是给请求添加模拟浏览器的HTTP头:
    针对file_get_contents:
    $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:
    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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 17:01:08