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

