私は、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
エラーメッセージを見たことがなく、何が原因でそれが強制終了されるのか疑問に思っていますか?
Linuxのメモリ不足(OOM)キラーをトリガーしている可能性があります。 dmesg
でメッセージを確認してください。これは、これが発生したときにどのプロセスが強制終了されたかを示します。
このKilled
エラーを再現する簡単な方法:
Ubuntu 12.10
を使用してPHP 5.3.10
でこのエラーを再現できました。
PHP m.php
というスクリプトを作成して保存します。
<?php
function repeat(){
repeat();
}
repeat();
?>
それを実行します:
el@apollo:~/foo$ php m.php
Killed
プログラムは約15秒間100%のCPUを消費し、次に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」を停止して出力しました。
ソリューション:
CloudLinuxでの私の場合、PHP 7.1、2つのプロセスがロックなしで同じファイルを読み書きしているときに発生しました。