破棄されたブログ

このブログは破棄されました。

PHP の持続的データベース接続とリソースがよくわからん

PHP では、あらゆるオブジェクト・変数・リソースが、参照が途切れた時点でガベージコレクションされるものだと思っていたのだけど、中にはそうでないものがあるらしい。
そのひとつが持続的データベース接続。

注意: 持続的データベース接続は特別で、ガベージコレクタにより破棄されません。

http://www.php.net/manual/ja/language.types.resource.php

持続的接続は、スクリプトの実行終了時にも閉じられないリンクです。 持続的接続が要求された時、PHPは(前もってオープンされたままになって いる)同じ持続的接続が既にオープンされていないかどうかを確認します。 そして、存在する場合には、それを使用します。存在しない場合には、そのリンクを作成します。

http://www.php.net/manual/ja/features.persistent-connections.php

持続的接続 は非持続的接続で使用できない いかなる 機能も提供しません。

http://www.php.net/manual/ja/features.persistent-connections.php

答えはかなり簡単です。効率です。持続的接続は、SQLサーバーへ接続する オーバーヘッドが大きい場合には有効です。

http://www.php.net/manual/ja/features.persistent-connections.php

持続的接続でテーブルをロックする場合にスクリプト が何らかの理由でロックを外し損ねると、それ以降に実行されるスクリプト がその接続を使用すると永久にブロックしつづけてしまい、ウェブサーバーか データベースサーバーを再起動しなければならなくなる

http://www.php.net/manual/ja/features.persistent-connections.php

トランザクションを使用している場合に、トランザクションブロック が終了する前にスクリプトが終了してしまうと、そのブロックは次に同じ接 続を使用して実行されるスクリプトに引き継がれる

http://www.php.net/manual/ja/features.persistent-connections.php

つまるところ、「持続的データベース接続ってのは SQL サーバへの接続を使いまわして再接続コストを削るためのものだけど、持続的接続のための特別な機能はねえからトランザクションとかロックとかには気をつけないとやべーぞ」ってことらしい。
あと、

リソースは特別な変数であり、外部リソースへのリファレンスを保持しています。

http://www.php.net/manual/ja/language.types.resource.php

ってことだけど、例えば、 MySQL のクエリ結果が外部リソースに保持され続けてしまって、リソースへのリンクを開こうとした時、メモリ不足になることはないのかな。どうだろ。
データベースがからむと途端に実験がしにくくなるな。。。

初めてのPHP5 増補改訂版

初めてのPHP5 増補改訂版

エキスパートのためのMySQL[運用+管理]トラブルシューティングガイド

エキスパートのためのMySQL[運用+管理]トラブルシューティングガイド

広告を非表示にする