由于某种原因,file_get_contents 一天又一天停止工作,并在 PHP 7.2.34 中返回“HTTP/1.1 406 Not Acceptable”错误

问题描述 投票:0回答:1

问题

我正在维护一个在由 Inmotion 托管的 服务器中运行并使用 PHP 7.2.34 的网页。我们将其称为“https://company-website.net/”

在此页面内,我们需要读取一个 JSON 文件。文件肯定在那里,可以转到 url 并打开它,JSON 文件位于“https://company-website.net/locale.json”

日复一日,在2024年1月10日file_get_contents突然返回了这个php错误

file_get_contents(https://company-website.net/locale.json):无法打开流:HTTP 请求失败! HTTP/1.1 406 不可接受

代码如下所示:

$fileUrl = 'https://'.$_SERVER['SERVER_NAME'].'/locale.json';
$file = file_get_contents($fileUrl);

我尝试了别的东西

我尝试设置一个 Accept 标头,就像在这个堆栈溢出线程上所说的那样(只是将 Accept-Language: en 更改为 Accept: /: PHP file_get_contents() 和设置请求标头

所以,代码是这样结束的:

$fileUrl = 'https://'.$_SERVER['SERVER_NAME'].'/locale.json';
$opts = [
    "http" => [
        "method" => "GET",
        "header" => "Accept: */*"
    ]
];
$context = stream_context_create($opts);
$file = file_get_contents($fileUrl, false, $context);

但是什么都没有

最后的解决方案

然后我最终更改了curl的文件获取内容,如该线程中所述: PHP file_get_contents() 返回“无法打开流:HTTP 请求失败!”

所以最终结果是这样的:

$fileUrl = 'https://'.$_SERVER['SERVER_NAME'].'/locale.json';
$curl_handle=curl_init();
curl_setopt($curl_handle, CURLOPT_URL, $fileUrl);
curl_setopt($curl_handle, CURLOPT_CONNECTTIMEOUT, 2);
curl_setopt($curl_handle, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl_handle, CURLOPT_USERAGENT, 'Company Name');
$file = curl_exec($curl_handle);
curl_close($curl_handle);

并且成功了

但我仍然很困惑为什么它一天又一天停止工作,不确定这是否与 PHP 弃用有关,Inmotion 改变了安全方面的一些东西,在这里真的迷失了。我仍然想尝试使用 file_get_contents 并了解问题可能是什么。如果有人能提供任何见解,我将非常感激。

php json file-get-contents
1个回答
0
投票

使用 PHP 7.2.34

PHP 7 中

file_get_contents
curl
最大的区别是
file_get_contents
默认使用http/1.0,而
curl
使用http/1.1。根据返回的406错误,我认为很有可能是这个原因。 (即使你使用http/1.0,服务器仍然会响应http/1.1错误,请参阅这个问题

另外,你的curl代码添加了UA,这可能是另一个问题。

尝试将这两项添加到上下文中:

"protocol_version" => "1.1"
"user_agent" => "Company Name"
© www.soinside.com 2019 - 2024. All rights reserved.