2009-06-04 8 views
45

私は、ループを使って多くのデータベース作業を行うPHPスクリプトを呼び出すCRONジョブを作成しています。私は、データセットを制限する場合PHPスクリプトの一般的な "Killed"エラー

は、それが適切に実行されますが、私は完全なデータセットに対してそれを実行すると、メッセージとスクリプトエラーアウト:(

Killed 

をset_time_limit(0)であるとのmemory_limitがあります -

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; 
    } 
} 

出力は次のようになります:

012 1)ここ

は、一貫してダイコードセクションであります

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エラーメッセージは見たことがありません。何が原因でそのファイルが強制終了されるのでしょうか?

答えて

62

Linuxのメモリ不足(OOM)の原因となっている可能性があります。それに関するメッセージについては、dmesgを確認してください。これが起こったときにどのプロセスが殺されたかを示します。このKilledエラーを再現する

+3

ありがとうございます。私は、Linuxがそのプロセスを殺していることに気付きました。私はスクリプトでPHPのメモリ制限を減らして解決しました。これにより、PHPはメモリを別に管理し、クラッシュを回避できました。 – Fuser97381

+0

ありがとうございます。ちょうど私が必要なもの。 – marlar

+0

私にとっては、PHP 5.6からPHP 7にアップグレードすることで問題は解決しました。明らかに多くの要素に依存しますが、PHP 7がより効率的に動作するので、チェックアウトする価値があります。 –

11

簡単な方法:

私はPHP 5.3.10Ubuntu 12.10でこのエラーを再現することができました。

m.phpと呼ばれるPHPスクリプトを作成し、それを保存します。

<?php 
    function repeat(){ 
     repeat(); 
    } 
    repeat(); 
?> 

を実行し、それ:

[email protected]:~/foo$ php m.php 
Killed 

プログラムはKilledメッセージで停止後、約15秒間、100%のCPUを取ります。 dmesg | grep phpを見て、手がかりがあります。それが原因無限ループにメモリを使い果たしたので

[email protected]:~/foo$ dmesg | grep php 
[2387779.707894] Out of memory: Kill process 2114 (php) score 868 or 
sacrifice child 

だから私の場合には、PHPプログラムが停止し、印刷された「殺しました」。

ソリューション:

  1. が利用可能か、このPHPプログラムで使用可能なメモリの量RAMの量を増やします。
  2. 問題を、連続して動作する小さなチャンクに分割します。
  3. プログラムを書き換えて、必要なメモリー量が少なくなるか、再帰で深くならないようにします。あなたが書いたコードは、このエラーの原因となっている、あなたが立ち往生感じ、それはそれをやっている理由のための損失で、その後は再び訪問する必要がある場合は、再び

    をこの問題を取得しないためにどのよう

PHPの構造、ループ、再帰の基本的なコア動作、およびこれらの構造を満たすためにメモリがどのように割り当てられるかを示します。http://eev.ee/blog/2012/04/09/php-a-fractal-of-bad-design/

関連する問題