2012-04-28 3 views
2

私はPHPで長時間実行されている操作をしており、常にメモリ不足でクラッシュしました。なぜこのPHP関数のメモリリーク

だから私はとメモリ使用量のログを開始しました:私はすべての私のラムを食べに責任を「有罪」1を、見つけたコードの一部をコメントすることで

 $result = memory_get_usage()/1024; 
     echo $result; 

これはコードです:

 static private function from_camel_case($str) 
     { 
      $str[0] = strtolower($str[0]); 
      $func = create_function('$c', 'return "_" . strtolower($c[1]);'); 
      $result = preg_replace_callback('/([A-Z])/', $func, $str); 
      return $result; 
     } 

それは基本的にアンダースコアと小文字にキャメルケースにテキストを変換します。

なぜこのリークですか?

私はあなたが何度もそのコードを呼び出している場合は、再び問題がこのラインである私のMac OS Xのライオン

+0

'preg_replace'を使用して、大文字で始まる文字の前に' _'を付けてから、文字列全体に 'strtolower'を適用します。コールバックの使用や関数の作成を防ぐ – zerkms

+0

**メモリがリークしているわけではありません。メモリがどこに使われているのか分かりません。答えを見てください。 – salathe

答えて

3

呼び出すたびにcreate_functionを使用して関数を作成しています。 PHPの関数は常にグローバルです。つまり、スクリプトの終わりまで存在します。だから、あなたがそれを呼び出すたびに、それはいくらかのメモリを割り当て、それを決して割り当て解除しないのです。

関数を1回だけ作成するか、コールバックを使用して全体を書き換えてメモリリークを解消できることを確かめてください。

+0

確かに!それが問題だ。ありがとう!私はこの答えを受け入れることができる前に8分待たなければならない:( –

3

にMAMPでPHP 5.3.5を実行しています:

$func = create_function('$c', 'return "_" . strtolower($c[1]);');

ことコードは、呼び出すたびに新しい無名関数を作成します。 http://www.php.net/create_functionによれば、コードはグローバル名前空間に入れられるため、メソッドが完了すると関数は削除されません。

4

あなたはcreating a new function every time that function runsです。

あなたが5.3を使用しているので、あなたは匿名関数でcreate_functionを置き換えることができ、それが助けかどうかを確認:

static private function from_camel_case($str) 
    { 
     $str[0] = strtolower($str[0]); 
     $result = preg_replace_callback('/([A-Z])/', function($matches) { 
      return '_' . strtolower($matches[1]); 
     }, $str); 
     return $result; 
    } 

または通常の関数にコールバックを抽出する:

あなたが使用することができます
static private function from_camel_case($str) 
    { 
     $str[0] = strtolower($str[0]); 
     $result = preg_replace_callback('/([A-Z])/', array(__CLASS__, 'replace_case'), $str); 
     return $result; 
    } 

    static private function replace_case($matches) { 
     return '_' . strtolower($matches[1]); 
    } 
+0

あなたは古い 'create_function'呼び出しを削除するのを忘れていた。 –

+0

ああ、それは馬鹿だった! – DCoder

関連する問題