[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