如何让PHP读取需下载的远程JSON文件并自动获取每日更新?
如何让PHP直接读取触发下载的远程JSON文件
这个问题的核心在于目标链接返回的响应头包含Content-Disposition: attachment,所以浏览器会触发下载,但PHP不受这个响应头限制,只要正确发起HTTP请求就能获取到JSON内容。以下是两种可行的实现方案:
方法1:使用file_get_contents(简单快捷)
如果你的服务器开启了allow_url_fopen(默认大多是开启的),可以用这个方法,同时模拟浏览器请求头避免被服务器拦截:
// 创建请求上下文,添加浏览器UA $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" ] ]); // 获取远程JSON内容 $jsonContent = file_get_contents('https://prices.csgotrader.app/latest/prices_v6.json', false, $context); // 解析并处理数据 if ($jsonContent !== false) { $data = json_decode($jsonContent, true); if ($data !== null) { // 这里写你的业务逻辑,比如打印数据片段 print_r(array_slice($data, 0, 5)); } else { echo 'JSON解析失败: ' . json_last_error_msg(); } } else { echo '无法获取远程内容,请检查服务器网络或allow_url_fopen设置'; }
方法2:使用cURL(更稳定,推荐生产环境)
cURL不受allow_url_fopen限制,且能更灵活地处理请求,适合复杂场景:
$ch = curl_init(); // 设置请求地址 curl_setopt($ch, CURLOPT_URL, 'https://prices.csgotrader.app/latest/prices_v6.json'); // 要求返回响应内容而非直接输出 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 模拟浏览器UA 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'); // 可选:如果服务器SSL证书校验失败,临时禁用(不推荐生产环境,建议配置正确证书) // curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 执行请求 $jsonContent = curl_exec($ch); $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); // 处理响应 if ($httpCode === 200 && $jsonContent !== false) { $data = json_decode($jsonContent, true); if ($data !== null) { // 处理你的数据 print_r($data); } else { echo 'JSON解析失败: ' . json_last_error_msg(); } } else { echo '请求失败,HTTP状态码: ' . $httpCode; }
额外优化建议
因为目标文件每日更新,没必要每次请求都拉取最新内容,可以添加本地缓存逻辑:
- 将获取到的JSON内容保存到本地文件(比如
local_prices.json) - 每次请求前检查本地文件的修改时间,如果超过24小时再重新拉取远程内容,否则直接读取本地文件
内容的提问来源于stack exchange,提问作者Zaiga
相关产品推荐
相关产品推荐

