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

使用CURL实现file_get_contents时返回NULL的问题求助

解决自定义CURL版file_get_contents调用Shopee API返回NULL的问题

嘿,我帮你分析下为啥你的file_get_contents_curl函数返回NULL,结合你的代码和Shopee API的场景,主要是几个关键的CURL配置遗漏了,咱们一步步来排查和解决:

1. 核心配置缺失导致的问题

你的代码里只设置了CURLOPT_AUTOREFERER和CURLOPT_HEADER,但最关键的几个选项没加:

  • CURLOPT_RETURNTRANSFER:如果不开启这个,CURL会直接把响应内容输出到页面,而不是返回给变量,这直接导致你拿到NULL。
  • CURLOPT_URL:你居然没把传入的$url设置到CURL句柄里!这相当于CURL不知道要请求哪个地址,肯定返回空啊。
  • HTTPS相关配置:因为请求的是HTTPS地址,默认的SSL验证可能会因为本地证书问题导致请求失败,需要针对性配置。

2. 修正后的完整代码

我给你补全并修正了函数,你可以直接用:

$url = "https://shopee.co.id/api/v1/search_items/?by=pop&order=desc&keyword=yi 067&newest=0&limit=50&page_type=shop&match_id=16775174";
$html = file_get_contents_curl($url);
var_dump($html);

function file_get_contents_curl($url) {
    $ch = curl_init();
    
    // 必须设置请求的目标URL
    curl_setopt($ch, CURLOPT_URL, $url);
    // 让CURL返回响应内容,而不是直接输出
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    // 自动设置Referer
    curl_setopt($ch, CURLOPT_AUTOREFERER, true);
    // 不返回响应头
    curl_setopt($ch, CURLOPT_HEADER, 0);
    // 临时关闭SSL验证(生产环境建议配置CA证书,不要关这个)
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
    // 设置请求超时时间,避免卡住
    curl_setopt($ch, CURLOPT_TIMEOUT, 30);
    // 模拟浏览器的User-Agent,避免被反爬拦截
    curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36');
    
    $response = curl_exec($ch);
    
    // 调试必备:检查CURL请求是否出错
    if(curl_errno($ch)){
        echo 'CURL错误信息: ' . curl_error($ch);
        $response = null;
    }
    
    curl_close($ch);
    return $response;
}

3. 实用的调试技巧

以后遇到CURL返回空的情况,一定要加调试步骤:

  • 用curl_errno()和curl_error()直接打印错误,比如证书问题、连接超时、URL无效等,一眼就能看到问题。
  • 开启Verbose模式查看详细请求日志,能帮你排查请求头、响应状态码等细节:
// 开启Verbose日志,写入临时文件
$verboseLogFile = fopen('php://temp', 'w+');
curl_setopt($ch, CURLOPT_VERBOSE, true);
curl_setopt($ch, CURLOPT_STDERR, $verboseLogFile);

// 执行请求后读取日志
rewind($verboseLogFile);
$logContent = stream_get_contents($verboseLogFile);
echo "CURL请求日志:\n" . $logContent;
fclose($verboseLogFile);

4. 针对Shopee API的额外注意点

Shopee的公开API有反爬机制,如果还是拿不到数据,你可能需要:

  • 从浏览器开发者工具(F12)里复制正常请求的Cookie、Referer等头信息,用CURLOPT_HTTPHEADER添加到CURL里:
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Cookie: 你的浏览器Cookie',
    'Referer: https://shopee.co.id/'
]);
  • 注意请求频率,不要频繁调用,否则会被IP封禁。

最后提醒:生产环境中不要关闭CURLOPT_SSL_VERIFYPEER,建议下载官方CA证书,设置CURLOPT_CAINFO指向证书路径,保证请求的安全性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:17:56