[PHP-users 20533]Re: pg_free_result呼び出しタイミングについて

Sumito_Oda oda @ bst.jp
2004年 2月 23日 (月) 04:12:44 JST


織田です。

>自動的に開放されるのですか。

MLの過去ログの
[リソース変数の開放のタイミング]
http://ns1.php.gr.jp/pipermail/php-users/2002-September/010173.html
を参照してください。このlink,plinkのcloseと同じように、
resultのfreeもGC処理のエントリに入っています(MySQLの場合)
Cが読めるならPHPのソースの/ext/pgsql/pgsql.cを参照すれば、
Postgresの場合はどうなってるのか正確にわかる筈です。

>PG_QUERYのあとPG_FETCH_ROWなどで取得後にいちいちPG_FREE_RESULT
>する必要がないのですね。

一律に必要の有無を決めることはできません。

仕組みとして、
・普通の変数と同じタイミングでリソース変数もGCされる、またその時
 にはリソース変数に設定された処理、この場合はFREEが行われる。
 http://www.php.net/manual/ja/zend.variables.resource.php
・GCのタイミングのひとつはスクリプトの終了時である。
・スクリプトの動作中のGC処理、例えば unset($wkResult)や
 それと等価な処理が行われた場合(リファレンスカウンタが0)、
 どういったタイミングで実際の処理が行われるかは
 私はPHPのGC処理の動作には詳しくないので判りません(注1)
があるということだけ。

>C言語的に考えるとMALLOCなどで確保した領域がRESULTとして返される
>のであればFREEが必要なのかな、と思っていたのですが、FREEされてい
>るのですね。

はい。この場合、PHP側のGC処理に連動して自動的にMySQLクライアント側
でもFREE処理されているので、PHPスクリプトだけ見ればFREEしなくても
構わない(場合もある)です。

>ただ、ここでおっしゃっているスクリプトの終了とは、PG_QUERYの後と
>なるのでしょうか。

違います、その命令を実行したプログラム(スクリプト)の終了のことです。
また、それ以外の意図した時にfree_resultを行うのであれば、用意された
DB関数を使用すべきです。スクリプト実行中に意図してGC処理を呼ぶこと
は出来ないと思います(注1)

(注1)
http://ns1.php.gr.jp/pipermail/php-users/2002-September/010192.html
の中で、大垣さんが
>unsetを使った場合、次のOPコードを実行する前に削除されます。
と述べられているので、意図して呼べると考えて良いのかも知れません。

-- 
Sumito_Oda mailto:oda @ bst.jp


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