web-dev-qa-db-ja.com

PHPスクリプトの一般的な「強制終了」エラー

私は、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エラーメッセージを見たことがなく、何が原因でそれが強制終了されるのか疑問に思っていますか?

48
Pro777

Linuxのメモリ不足(OOM)キラーをトリガーしている可能性があります。 dmesgでメッセージを確認してください。これは、これが発生したときにどのプロセスが強制終了されたかを示します。

68
Steve Madsen

この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プログラムは、無限ループのためにメモリが足りなくなったため、「Kill​​ed」を停止して出力しました。

ソリューション:

  1. RAM使用可能な量またはこのプログラムで使用可能なメモリ量PHPプログラム。
  2. 問題を、順次動作する小さなチャンクに分解します。
  3. 必要なメモリが少なくなるように、または再帰でそれほど深くならないようにプログラムを書き直してください。
16
Eric Leschinski

CloudLinuxでの私の場合、PHP 7.1、2つのプロセスがロックなしで同じファイルを読み書きしているときに発生しました。

0
Boy