[PHP-users 8700] Re: PHP の拡張性?

Yasuo Ohgaki php-users@php.gr.jp
Wed, 17 Jul 2002 10:38:53 +0900


大垣です。
説明が悪かったようですね。と、いう事でもう少し詳しく、、、

Yamaguchi Hiroshi wrote:
>>全てのスクリプト系言語(Perl, Python, Ruby, bash,
>>etc)と最近の言語(Java, VB, C#)はガーベッジコレク
>>ション機能をもっています。Java、PHPはリファレンスカ
>>ウント機能もサポートしてます。
> 
> 多分、私が勘違いしているのだと思うのですが、
> 私が調べた限りは、ガベージコレクションとはプログラムが
> オブジェクトなどを使用し終えたときに自動的にメモリを開放
> する機能だと思うのですが、PHPはどういうタイミングで「使
> 用し終えた」ことを判断しているのでしょう。

zvalのrefcountが0になった次のopコードで、ほとんどの場合、
リリースされます。

# zvalとはPHP(ZendEngine)の変数を格納する構造体です。

<?php
$var = "text"; // zval points to $var has refcount = 1
$foo = $var;   // the zval has refcount = 2 now

unset($var);   // the zval has refcount = 1
unset($foo);   // the zval has refcount = 0

call_some_function(); // the zval is cleaned up before calling it
?>

注意:PHP4の場合、オブジェクトはJavaのようにハンドルで
扱われません。したがって、上記のような動作にはなりません。
PHP5からは上記のような動作になります。
この意味がわからない場合、singletonクラスをPHP4とPHP5
で実装するとわかると思います。

> 
> mysql_connect関数によって生成されたリソースが使われな
> くなったときに、リファレンスカウンタを見て自動的にガベー
>> コレクションされるのは理解できるのですが、PHP(Webサー
> バ)の開始時にロードされた関数モジュール(php_*.soやphp
> _*.dll)などはPHPモジュールの一部としてメモリ上に常駐し て
> いるのだと思ったのですが(そういった意味ではいわきりさん
>> 説明は大いに納得したのですが)、組み込まれたモジュール自
> 体がガベージコレクションで制御されるという意味がよく分か
>> ませんでした。

モジュールにはガーベッジコレクションという概念はありません。
ガーベッジコレクションされるのはzvalで管理されている変数、
リソースです。

# persistentなリソース等の場合はガーベッジコレクション
# の対象にはなりません。

# 覚えていませんが、dl()されたモジュールはシャットダ
# ウン後にアンロードされたと思います。(この「シャット
# ダウン」と言うのはリクエストシャットダウンの事で、サー
# バーをシャットダウンの事ではありません)

モジュールを追加するオーバーヘッドは大まかに言うと

1) コードセグメントメモリ消費量の増加(普通無視できる)
2) データセグメントメモリ消費量の増加(普通無視できる)
3) モジュール初期化(普通無視できる)
4) リクエスト初期化(オーバーヘッドが大きいモジュールは無視できない)

dl()を使うと

5) モジュールロード(無視できない。かなり大きいオーバーヘッド)

# dl()はマルチスレッドサーバーでは使わない方が良いです。
# 正しく動作しません。

# 何か忘れていたら追加お願いします。他の方:)

モジュールを沢山載せている場合、モジュールソース中の
RINIT()マクロで定義されている初期化コードがリクエスト
の度に実行されます。これが、気にしなければならないオー
バーヘッドです。

PHPで1行書くと何百、何千というCのコードが実行されます。
オーバーヘッドが大きいモジュールもありますが、多くのモ
ジュールRINIT()は全くないかあってもCコードで数行〜
数十行しかありません。

--
Yasuo Ohgaki