[PHP-users 10186] Re: リソース変数の開放のタイミング

Yasuo Ohgaki php-users@php.gr.jp
Wed, 18 Sep 2002 12:41:33 +0900


大垣です。

桝形 誠二 wrote:
>>リソースが削除されるのは参照数が0になった時、またはスクリプトが
>>終了しリソースが必要なくなった時です。
> 
> 
> という事は( 適当な例ですみません )、
> 
> <?
> $Connect = mysql_connect( ... ); // refcount = 1

$Connect refcount=1

> $Result  = mysql_db_query( ... ); // refcount = 2

ここで$Connectのrefcountが2になる事はありません。
$Connect refcount=1
$Result refcount=1

> mysql_free_result( $Result ); // refcount = 1

$Result refcount=0

> // 上記処理では結果領域は実際には開放されない。
> mysql_close( $Connect );  // refcount = 0

$Result refcount=0
$Connect refcount=0

> // 上記処理で結果領域の開放とmysql_closeが行われる。
> ?>
> 
> と、いう事になる。。。と解釈しました。
> 間違っていたら指摘して下さい。
> 
> 間違っていたとしたら、リソースはそれぞれ独立して
> 参照しているのでしょうか?

リソースも変数も同じです。作成された時はrefcount=1,
代入されるとrefcountが1づつ増えます。

> 
> また、参照数が0になった時に削除されるとなると専用の
> 関数ではなく、unset関数等で削除しようとしても同様の
> 事になるのでしょうか?

ほぼ同じですが、多少動作が違います。
ユーザーレベルでは同じと考えても差し支えないと思います。

専用関数と使うとその関数のコール中に削除。unsetを使った
場合、次のOPコードを実行する前に削除されます。

# と言っても、PHPはメモリをキャッシュしているので本当
# 全部のメモリをシステムに返す訳ではありません。

--
Yasuo Ohgaki