- 2006-12-07 (木) 19:00
- PHP
PHP5.2.0にメモリリークのバグがあるようです。
どうやらPHP 5.2.0のZendEngine2にメモリリークバグがあるようでBTSにもPHP Bugs: #39438: Memory leak PHP Fatal error: Out of memoryとして報告があがっていました。
CVS版では既に修正されていますが、CVS版がすぐに適用できない場合もある(ない?)のでリコンパイルせずにこの問題を回避する方法を考えてみました。
メモリリークする事はもちろんまずいのですが、結局はPHPがメモリを確保する際にmemory_limitの制限に引っかかってしまう事によりFatal errorが発生しています。そこでmemory_limitの制限を外す or 上限値を上げる方法を試してみます。
バグを発生させるコードです。
(via [cvs] View of /ZendEngine2/tests/bug39438.phpt)
< ?php $i=0; $test2=array( 'a1_teasermenu' => array( 'downloadcounter' => 2777, 'versions' => array( '0.1.0' => array ( 'title' => 'A1 Teasermenu', 'description' => 'Displays a teaser for advanced subpages or a selection of advanced pages', 'state' => 'stable', 'reviewstate' => 0, 'category' => 'plugin', 'downloadcounter' => 2787, 'lastuploaddate' => 1088427240, 'dependencies' => array ( 'depends' => array( 'typo3' =>'', 'php' =>'', 'cms' => '' ), 'conflicts' => array('' =>'') ), 'authorname' => 'Mirko Balluff', 'authoremail' => 'balluff@amt1.de', 'ownerusername' => 'amt1', 't3xfilemd5' => '3a4ec198b6ea8d0bc2d69d9b7400398f', ) ) ) ); $test=array(); while($i<1200) { $test[]=$test2; $i++; } $out=serialize($test); echo "ok\n"; ?>
まずはPHP5.1.6(memory_limit=16M)で実行してみてみました。こちらはエラーになりません。
$ php516/bin/php -v PHP 5.1.6 (cli) (built: Oct 17 2006 20:22:42) Copyright (c) 1997-2006 The PHP Group Zend Engine v2.1.0, Copyright (c) 1998-2006 Zend Technologies $ php516/bin/php -f memory_leak_520.php -d memory_limit=16M ok
続いてPHP5.2.0(memory_limit=16M)で実行するとFatal errorが発生しました。
$ php -v PHP 5.2.0 (cli) (built: Nov 7 2006 14:33:45) Copyright (c) 1997-2006 The PHP Group Zend Engine v2.2.0, Copyright (c) 1998-2006 Zend Technologies $ php -f memory_leak_520.php -d memory_limit=16M PHP Fatal error: Allowed memory size of 16777216 bytes exhausted (tried to allocate 784851 bytes) in ~/memory_leak_520.php on line 36
memory_limit=24Mにするとエラーは発生しませんでした。
$ php -f memory_leak_520.php -d memory_limit=24M ok
memory_limitを無制限にした場合もエラーは発生しませんでした。
$ php -f memory_leak_520.php -d memory_limit=-1 ok
本来はバグを修正すべきですが、まあこんな方法もあるという事で。
- Newer: PHPソースからフローチャートを生成する
- Older: CakePHP1.1.11.4064リリース
トラックバック:0
- このエントリーのトラックバックURL
- /blog/2006/12/php520_memory_leak.html/trackback
- Listed below are links to weblogs that reference
- PHP5.2.0でOut of memory from Shin x blog