Home > PHP > PHP5.2.0でOut of memory

PHP5.2.0でOut of memory

  • 2006-12-07 (木) 19:00
  • PHP
  • このエントリーをはてなブックマークに追加
この記事の所要時間: 512

PHP5.2.0にメモリリークのバグがあるようです。

どうやらPHP 5.2.0のZendEngine2にメモリリークバグがあるようでBTSにもPHP Bugs: #39438: Memory leak PHP Fatal error: Out of memoryとして報告があがっていました。

PHP 5.2.0におけるメモリリークバグ - Sooey

CVS版では既に修正されていますが、CVS版がすぐに適用できない場合もある(ない?)のでリコンパイルせずにこの問題を回避する方法を考えてみました。

メモリリークする事はもちろんまずいのですが、結局はPHPがメモリを確保する際にmemory_limitの制限に引っかかってしまう事によりFatal errorが発生しています。そこでmemory_limitの制限を外す or 上限値を上げる方法を試してみます。

バグを発生させるコードです。
(via [cvs] View of /ZendEngine2/tests/bug39438.phpt

PHP:
  1. <?php
  2. $i=0;
  3. $test2=array(
  4.    'a1_teasermenu' => array(
  5.      'downloadcounter' => 2777,
  6.         'versions' => array(
  7.             '0.1.0' => array (
  8.                 'title' => 'A1 Teasermenu',
  9.                 'description' => 'Displays a teaser for advanced subpages or a selection of advanced pages',
  10.                 'state' => 'stable',
  11.                 'reviewstate' => 0,
  12.                 'category' => 'plugin',
  13.                 'downloadcounter' => 2787,
  14.                 'lastuploaddate' => 1088427240,
  15.                 'dependencies' => array (
  16.                       'depends' => array(
  17.                               'typo3' =>'',
  18.                               'php' =>'',
  19.                               'cms' => ''
  20.                        ),           
  21.                       'conflicts' => array('' =>'')         
  22.                 ),         
  23.                 'authorname' => 'Mirko Balluff',
  24.                 'authoremail' => 'balluff@amt1.de',
  25.                 'ownerusername' => 'amt1',
  26.                 't3xfilemd5' => '3a4ec198b6ea8d0bc2d69d9b7400398f',
  27.           )
  28.       )
  29.     )
  30. );
  31. $test=array();
  32. while($i&lt;1200) { 
  33.     $test[]=$test2;
  34.     $i++;
  35. }
  36. $out=serialize($test);
  37. echo "ok\n";
  38. ?>

まずはPHP5.1.6(memory_limit=16M)で実行してみてみました。こちらはエラーになりません。

CODE:
  1. $ php516/bin/php -v
  2. PHP 5.1.6 (cli) (built: Oct 17 2006 20:22:42)
  3. Copyright (c) 1997-2006 The PHP Group
  4. Zend Engine v2.1.0, Copyright (c) 1998-2006 Zend Technologies
  5. $ php516/bin/php -f memory_leak_520.php -d memory_limit=16M
  6. ok

続いてPHP5.2.0(memory_limit=16M)で実行するとFatal errorが発生しました。

CODE:
  1. $ php -v
  2. PHP 5.2.0 (cli) (built: Nov  7 2006 14:33:45)
  3. Copyright (c) 1997-2006 The PHP Group
  4. Zend Engine v2.2.0, Copyright (c) 1998-2006 Zend Technologies
  5. $ php -f memory_leak_520.php -d memory_limit=16M
  6. 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にするとエラーは発生しませんでした。

CODE:
  1. $ php -f memory_leak_520.php -d memory_limit=24M
  2. ok

memory_limitを無制限にした場合もエラーは発生しませんでした。

CODE:
  1. $ php -f memory_leak_520.php -d memory_limit=-1
  2. ok

本来はバグを修正すべきですが、まあこんな方法もあるという事で。

トラックバック:0

このエントリーのトラックバックURL
http://www.1x1.jp/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

Home > PHP > PHP5.2.0でOut of memory

検索
フィード
メタ情報

Return to page top