[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 メーリングリストの案内