[PHP-users 33308] Re: zend_mm_heap corrupted の対応方法を探しております(一応解決・・・?)

睦月 mutsuki @ mf.point.ne.jp
2008年 2月 20日 (水) 18:50:22 JST


睦月です。

大原さんに教えて頂いたパッチなど、色々と試しましたので結果のご報告です。

結論から先に申しますと、本質的な原因の究明には至りませんでしたが、暫定的
な対応は取れました。


<試したこと>
  1. 前回紹介して頂いたパッチを適用。
    > http://www.webhostingtalk.com/showthread.php?t=661186
    > http://cvs.php.net/viewvc.cgi/php-src/main/SAPI.c?r1=1.202.2.7.2.15&r2=1.202.2.7.2.16&pathrev=PHP_5_2&diff_format=u

  2. 5.2.6 を CVS から取ってくる。

  3. --enable-debug 付きで PHP をコンパイルし、memory leak の発生状況を
     調査し、PHPのソースを追っかける。


<結果>
  1. × 現象変わらず。
  2. × autoconf などの環境を準備できないため、諦める。
  3. △ 一応原因と思われるコードの特定ができ、現象が発生していた部分につ
        いては解決。


3. で特定した原因ですが、Ethna から呼び出している PEAR.php の raiseError 
関数の、エラーオブジェクトのインスタンス生成部でした。

使用していた PEAR.php が 1.4.9 と古いのですが、一応原因箇所を残しておき
ます。
PEAR::raiseError 内でエラークラスのインスタンスを生成する際に &new を使
用しないように直したのみとなります。

--- PEAR.php	Wed Feb 20 14:24:30 2008
+++ PEAR.php	Wed Feb 20 17:40:30 2008
@@ -560,10 +560,10 @@
             $ec = 'PEAR_Error';
         }
         if ($skipmsg) {
-            $a = &new $ec($code, $mode, $options, $userinfo);
+            $a = new $ec($code, $mode, $options, $userinfo);
             return $a;
         } else {
-            $a = &new $ec($message, $code, $mode, $options, $userinfo);
+            $a = new $ec($message, $code, $mode, $options, $userinfo);
             return $a;
         }
     }

(尚、PEAR.php 1.7.1 にて同様の対応が取られていた為、結局上記パッチはあ
てず、最新の PEAR に入れ替えて使用しています。)


こういった内容の切り分けの為にも E_STRICT を有効にしたいのですが、そのた
めにはまず Ethna と Pear から Strict メッセージを排除しないとならないた
め、対応していませんでした。
残念ながら日程的に E_STRICT 対応は見送るしかなさそうです。


以上、わかりづらい文章で申し訳ないのですが、ご報告まで。


--
睦月




PHP-users メーリングリストの案内