【发布时间】:2020-05-10 00:18:06
【问题描述】:
我在生产服务器(PHP 7.0.32)上随机(每天大约 20 次)收到此错误:
PHP Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 4787537204 bytes)
到目前为止,错误的“存在”相当低,但因为我不确定哪里出了问题,所以我担心未来和更大的问题。
当错误发生时,我在页面顶部运行此代码:
$curTime = time();
$dataIds = array("1", "2", "3", "4", "5", "6", "7", "8", "9", "10");
$end = array();
$update = array();
$dbUpdate = array();
foreach($dataIds as $id) {
$f = fopen( "./data/{$id}.json", "r");
if ($f === false) {
continue;
}
$data = fread($f, 1024);
fclose($f);
$data = json_decode($data, true);
if (!isset($data['input'])) {
continue;
}
$endDate = $data['input'][0]['end'];
$updateDate = $data['input'][0]['start'];
$dbUpdateDate = $data['input'][0]['update'];
$end[$id] = ($endDate !== "") ? strtotime($endDate." UTC") : $curTime;
$update[$id] = ($updateDate !== "") ? strtotime($updateDate." UTC") : $curTime;
$dbUpdate[$id] = ($dbUpdateDate !== "") ? strtotime($dbUpdateDate." UTC") : $curTime;
}
并且在这一行触发了错误:
$end[$id] = ($endDate !== "") ? strtotime($endDate." UTC") : $curTime;
我无法在开发服务器上重现该问题,我不确定是什么原因导致此问题以及如何调试此问题(我无法在生产服务器上启用调试功能)。在致命错误之前没有其他警告或通知。
json 数据文件很小,大约 500 字节。但是,它们是从 cron 作业更新的。所以理论上我可以打开不完整的文件。但在这种情况下,json_decode 会返回 null,因为我已经测试过。
json 示例:
{
"input": [{
"id": "1",
"start": "2019-11-15 06:00:00",
"end": "2019-11-18 12:00:00",
"update": "2019-11-15 10:52:44"
}]
}
【问题讨论】:
-
这个问题归结为:为什么 PHP 试图为看似相对简单的事情分配 4.4 GB 的 RAM。
-
您确定您的服务器没有被病毒感染,并且没有包含文件,尽管某些手段做得更多?
-
@MartinBarker AFAIK,这不会导致
strtotime请求 4GB。而要影响 PHP 本身,病毒必须处于 sudo 模式,这不太可能。另外,没有其他类似的问题。 -
@MartinPerry 我认为确实不太可能提升权限,任何具有 root 访问权限和 SSH 终端的用户也是病毒的入口点。哦,看有腻子保存的配置,告诉我私钥在哪里,以及它连接到的服务器地址......或者使用非官方 repo 进行 PHP 安装还强制包含可能被利用的内容
-
@MartinBarker 我有来自官方仓库的 PHP 并且 SSH 被锁定到 IP。