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

PHP中file_get_contents仅部分脚本生效问题求助

问题分析与解决办法

问题背景

脚本里第一次调用file_get_contents完全正常,但第二次请求gts.nve.no的API时直接无响应,还拖慢了Web服务器。这个问题只在one.com的服务器上出现,本地和其他服务器都没问题,而且是最近才突然发生的。

相关代码

<?php

$adresse_sok = "https://example.com/adresser/v1/sok?sok=kirkegata&fuzzy=false&&utkoordsys=25833&treffPerSide=1&side=0&asciiKompatibel=true" ;

$adresse_response = file_get_contents($adresse_sok);
$adresse_data = json_decode($adresse_response,true);
$test = $adresse_data['adresser'][0];
$adressetekst = $adresse_data['adresser'][0]['adressetekst'];
$poststed = $adresse_data['adresser'][0]['poststed'];
$lat = round($adresse_data['adresser'][0]['representasjonspunkt']['lat']);
$lon = round($adresse_data['adresser'][0]['representasjonspunkt']['lon']);

$ost = $lat;
$nord = $lon;

$url = "https://gts.nve.no/api/GridTimeSeries/" . $lon . "/" . $lat . "/2022-12-24/2022-12-24/sd.json";

// 此处无响应
$response = file_get_contents($url);
$data = json_decode($response,true);

$snodybde = $data['Data'][0];

?>

响应头对比

one.com服务器上添加var_dump($http_response_header);后的输出:

array(10) { [0]=> string(15) "HTTP/1.1 200 OK" [1]=> string(13) "Server: nginx" [2]=> string(35) "Date: Thu, 24 Nov 2022 10:45:40 GMT" [3]=> string(30) "Content-Type: application/json" [4]=> string(19) "Content-Length: 781" [5]=> string(17) "Connection: close" [6]=> string(30) "Access-Control-Allow-Origin: *" [7]=> string(48) "Access-Control-Allow-Methods: GET, POST, OPTIONS" [8]=> string(112) "Access-Control-Allow-Headers: DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range" [9]=> string(59) "Access-Control-Expose-Headers: Content-Length,Content-Range" }

正常服务器的输出:

array(10) { [0]=> string(15) "HTTP/1.1 200 OK" [1]=> string(22) "Cache-Control: private" [2]=> string(45) "Content-Type: application/json; charset=utf-8" [3]=> string(26) "Server: Microsoft-IIS/10.0" [4]=> string(24) "X-AspNetMvc-Version: 5.2" [5]=> string(27) "X-AspNet-Version: 4.0.30319" [6]=> string(21) "X-Powered-By: ASP.NET" [7]=> string(35) "Date: Thu, 24 Nov 2022 10:42:49 GMT" [8]=> string(17) "Connection: close" [9]=> string(19) "Content-Length: 240" }

原因分析

从响应头能看到,one.com服务器收到的响应来自nginx,而正常服务器是IIS,说明gts.nve.no可能对one.com的IP段做了限流或者拦截。另外file_get_contents本身是个简单的HTTP客户端,对连接的容错性差,遇到服务器端的慢响应或者半开连接时容易卡住,拖慢整个服务器。

解决办法

  1. 换成cURL替代file_get_contents
    cURL能更灵活控制请求参数,比如设置超时时间、自定义User-Agent,避免被目标服务器识别为异常请求:
// 替换原file_get_contents($url)的代码
$ch = curl_init($url);
// 要求返回结果而不是直接输出
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// 设置10秒超时,避免无限等待
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
// 模拟浏览器UA,减少被拦截概率
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36");

$response = curl_exec($ch);
// 检查请求是否失败
if ($response === false) {
    error_log("请求失败: " . curl_error($ch));
    $snodybde = null; // 给默认值避免报错
} else {
    $data = json_decode($response, true);
    // 用null合并运算符避免数组索引不存在报错
    $snodybde = $data['Data'][0] ?? null;
}

curl_close($ch);
  1. 检查服务器PHP配置
    确认one.com服务器的allow_url_fopen是开启状态,同时调整default_socket_timeout到合理值(比如10秒),避免超时时间过长导致服务器阻塞。

  2. 添加请求缓存
    如果请求的参数不会频繁变化,把API返回结果缓存到文件或者内存中,比如用file_put_contents存到本地文件,下次请求先读缓存,减少对目标API的重复调用,降低被限流的概率。

  3. 联系服务商确认
    如果以上方法都没用,联系one.com的技术支持,确认服务器IP是否被gts.nve.no拉黑或者限流,必要时申请更换IP段。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 16:20:30