PHP脚本中的一般“Killed”错误
Posted
技术标签:
【中文标题】PHP脚本中的一般“Killed”错误【英文标题】:Generic "Killed" error in PHP script 【发布时间】:2010-10-31 11:20:35 【问题描述】:我正在做一个调用 php 脚本的 CRON 作业,该脚本使用循环执行大量数据库工作。
当我限制数据集时它可以正常执行,但是当我针对完整数据集运行它时,脚本会出错并显示一条消息:
Killed
set_time_limit 为 (0),memory_limit 为 (-1)
这是它一直死掉的代码部分:
echo "I'm in _getMemberDemographicAttrs\n";
if (! empty ( $member_id ))
$query .= ' AND member_id = ' . $member_id;
$result = mysql_query ( $query, $this->_db );
if ($result)
while ( $rule = mysql_fetch_assoc ( $result ) )
$rules [] = $rule;
if (! empty ( $rules ))
mysql_free_result ( $result );
echo "I'm leaving _getMemberDemographicAttrs\n";
return $rules;
输出如下:
I'm in _getMemberDemographicAttrs<br/>
I'm leaving _getMemberDemographicAttrs<br/>
I'm in _getMemberDemographicAttrs<br/>
I'm leaving _getMemberDemographicAttrs<br/>
I'm in _getMemberDemographicAttrs<br/>
Killed
我从未见过这种通用的 Killed
错误消息,我想知道是什么导致它被杀死?
【问题讨论】:
我刚刚在 PHP 7.4 上遇到了这个错误,罪魁祸首是一个匿名类,它覆盖了一个方法。我在父类的基方法中添加了一个参数,但在匿名子类中忘记了参数。由于某种原因,PHP 没有正确解析这个并占用内存,直到 OOM 杀手Killed
进程。将缺少的参数添加到 anon 类解决了这个问题。老实说,这听起来像是 PHP 中的一个错误。
【参考方案1】:
您可能正在触发 Linux 内存不足 (OOM) 杀手。检查dmesg
以获取有关它的消息。它说明发生这种情况时哪个进程被杀死。
【讨论】:
谢谢。我发现Linux正在杀死该进程。我通过减少脚本中 PHP 的内存限制来解决它,这允许 PHP 以不同的方式管理其内存并避免崩溃。 谢谢。正是我需要的。 对我来说,问题是通过从 PHP 5.6 升级到 PHP 7 解决的。显然这取决于许多因素,但 PHP 7 的工作效率更高,因此值得一试。 对我来说,我正在运行 PHP7,但我已经被杀死了,尽管我有 3GB 的可用内存!并且PHP内存限制设置为-1,我正在尝试@Fuser97381解决方案。【参考方案2】:重现此Killed
错误的简单方法:
我能够使用PHP 5.3.10
在Ubuntu 12.10
上重现此错误。
创建一个名为 m.php
的 PHP 脚本并保存:
<?php
function repeat()
repeat();
repeat();
?>
运行它:
el@apollo:~/foo$ php m.php
Killed
程序占用 100% CPU 大约 15 秒,然后停止并显示 Killed
消息。看dmesg | grep php
有线索:
el@apollo:~/foo$ dmesg | grep php
[2387779.707894] Out of memory: Kill process 2114 (php) score 868 or
sacrifice child
所以在我的例子中,PHP 程序停止并打印“Killed”,因为它由于无限循环而耗尽了内存。
解决方案:
-
增加此 PHP 程序的可用 RAM 量或可用内存量。
将问题分解为按顺序运行的较小块。
重写程序,使其具有更小的内存需求或递归不那么深。
【讨论】:
【参考方案3】:在我的 CloudLinux PHP 7.1 上,它发生在 2 个进程在没有锁的情况下读取和写入同一个文件时。
【讨论】:
以上是关于PHP脚本中的一般“Killed”错误的主要内容,如果未能解决你的问题,请参考以下文章