[PHP-users 3051] Re: mbregex のインストール

php-users@php.gr.jp php-users@php.gr.jp
Wed, 24 Oct 2001 04:57:29 +0900 (JST)


こんにちは、塚田と申します。

重松さん:
> あと、PHP 4.x の mbereg() は ruby ゆずりみたいですけど、
> GNU のコードの malloc() に失敗したときにそれを確認しないバグを
> そのまま引きずっているようなんですけど、これって、私の
> ソースコードの読みまちがいでしょうか?
> PHP-dev で同じネタを質問したのですが、情報を頂けなかったので、再度。
> # ruby は malloc() には失敗しないですが、PHP も失敗しない?

ご心配は理解しますが、バグでもないという反論をすると、
 ・メモリが足りなくならないように運用するものだ
     ワークステーションで作業していてメモリが足りなくなるのと、
     webサーバーで接続がたくさんきてメモリが足りなくなるのは、
     かなり状況が違うと思います。
     オブジェクト指向の実行環境でガーベージコレクタというのは、
     暗黙のデストラクタとか、メモリブロックのフラグメントの
     掃除などをうまく調整して、性能を向上させるものだと思いますが、
     webアプリケーションの場合は、ガーベージコレクタを起動しても、
     回収できる領域はそれほど無くて、かえって状況を悪くする
     という事態も考えられます。
     十分なメモリを用意して、手早く処理を行い、さっさと終了する
     というのが、HTTPのアプリケーションの基本だと思います。

 ・メモリが無ければ作業をやめるしかない
     必要なときに、それがないとどうしようもないのですが、
     その際に後始末をすべて書いていたら、例外処理が多く
     なってしまい、面白くありません。
     malloc() が失敗しないというのも、メモリが無かったら
     そこでプロセスを終了させているのだと思います。
     (ですから、nullポインタを読み書きして、例外が上がって、
       終了しても、たいして変わりが無い??)

以上は言い訳なのですが、
zend_alloc.h をみてみたら、 persist_alloc というのが
あったので、

  #define xmalloc(size) persist_alloc(emalloc(size))
  #define xcalloc(nmemb,size) persist_alloc(ecalloc(nmemb,size))
  #define xrealloc erealloc
  #define xfree efree

とすれば、少しは安心できるかもしれません。


-- zzz@_@ >
sender: Tsukada Takuya (塚田 卓也)
town: inaba hizume, Nagano City (長野市稲葉日詰)