我有两个虚拟服务器。
旧版本:Ubuntu 12.04 和 PHP 7.2。新版本:CentOS 7.9 和 PHP 8.0。
两台服务器上都运行着同一个应用程序。cron 会定期从另一个网站获取一些详细信息。类似于以下代码
file_get_contents("http://mirror.facebook.net/centos/timestamp.txt")
在旧服务器上,它运行良好。我从来没有遇到过问题。在新服务器上,我有时会收到此消息
Warning: file_get_contents(mirror.facebook.net/centos/timestamp.txt): Failed to open stream: HTTP request failed! HTTP/1.0 502 Bad Gateway
我不知道为什么会发生这种情况。它影响了大约 1% 的呼叫。
有人知道我应该去哪里查找以及该做什么来解决这个问题吗?
[编辑]我实现了如下所述的错误和时间跟踪。
首先是代码:
$t0 = microtime(true);
$jsonString = file_get_contents($pageUrl);
if ($jsonString === false) {
$t1 = microtime(true);
var_dump(sprintf(
'Fehler beim Abruf der URL %s',
$pageUrl,
));
var_dump($t1 - $t0);
var_dump(error_get_last());
return 0;
}
现在来看结果。
array(4) {
["type"]=>
int(2)
["message"]=>
string(145) "file_get_contents(https://www.example.com/): Failed to open stream: HTTP request failed! HTTP/1.0 502 Bad Gateway
"
["file"]=>
string(62) "/path/to/src/Service/WebcrawlerService.php"
["line"]=>
int(61)
}
不幸的是,结果并没有提供更多细节。它仍然是 502
答案1
我怀疑您的新服务器偶尔会遇到网络超时(DNS?)。要深入了解,请尝试在失败后立即记录详细错误file_get_contents()
以及失败前请求的持续时间:
$t0 = microtime(true);
if (($data = @file_get_contents("http://mirror.facebook.net/centos/timestamp.txt")) === false) {
$t1 = microtime(true);
var_dump($t1 - $t0); // duration
var_dump(error_get_last());
}
这些输出结合起来可能会给你提供关于后续步骤的提示。