PHPのドキュメントに以下のような文章がある。
持続的接続は、スクリプトの実行終了時にも閉じられないリンクです。 持続的接続が要求された時、PHPは(前もってオープンされたままになって いる)同じ持続的接続が既にオープンされていないかどうかを確認します。
そして、存在する場合には、それを使用します。存在しない場合には、そ のリンクを作成します。
‘同じ’接続とは、同じホスト、同じユーザー名、 同じパスワード(利用可能な場合)でオープンされた接続のことを意味します。
これはいったいどういうこっちゃ?ってことで調べてみた。
同じ接続情報で接続した場合
[php]
$conn = pg_connect("host=localhost port=5432 dbname=DB_NAME user=USER_NAME password=PASSWORD");
echo pg_connection_status($conn);//PGSQL_CONNECTION_OK
$conn2 = pg_connect("host=localhost port=5432 dbname=DB_NAME user=USER_NAME password=PASSWORD");
echo pg_connection_status($conn2);//PGSQL_CONNECTION_OK
[/php]
ここまでは別段問題はない。
で、クエリ処理を行っていざクローズという時に変なことが起こる。
[php highlight=”2″]
pg_close($conn);
echo pg_connection_status($conn);//PGSQL_CONNECTION_OK
pg_close($conn2);
echo pg_connection_status($conn);//PGSQL_CONNECTION_BAD
[/php]
ん?2行目でcloseしたはずの$connがとじていないぞ?
しかも$conn2をクローズして初めて$connがクローズされるようだ。
これがドキュメントにある、同じ持続的接続がある場合、再利用するってことなんだな。
異なるユーザで接続した場合
先にこっちを載せておいたほうが良かったかな。
[php]
$conn = pg_connect("host=localhost port=5432 dbname=DB_NAME user=USER_NAME password=PASSWORD");
pg_connection_status($conn);//PGSQL_CONNECTION_OK
$conn2 = pg_connect("host=localhost port=5432 dbname=DB_NAME user=USER_NAME2 password=PASSWORD2");
pg_connection_status($conn2);//PGSQL_CONNECTION_OK
//クエリ処理
pg_close($conn);
echo pg_connection_status($conn);//PGSQL_CONNECTION_BAD
pg_close($conn2);
echo pg_connection_status($conn);//PGSQL_CONNECTION_BAD
[/php]
これはそのまんま。問題ないね。
同じ接続情報で接続した場合 パート2
PHPのPostgreSQL接続に関するドキュメントに以下の内容があった。
同じ connection_string 引数で 2 回 pg_connect() 関数がコールされた場合は、 connect_type に PGSQL_CONNECT_FORCE_NEW を指定していない限り 既存の接続が返されます。
つまりは最初の例でも
[php highlight=”3″]
$conn = pg_connect("host=localhost port=5432 dbname=DB_NAME user=USER_NAME password=PASSWORD");
echo pg_connection_status($conn);//PGSQL_CONNECTION_OK
$conn2 = pg_connect("host=localhost port=5432 dbname=DB_NAME user=USER_NAME password=PASSWORD", PGSQL_CONNECT_FORCE_NEW);
echo pg_connection_status($conn2);//PGSQL_CONNECTION_OK
[/php]
こうやってやることによって$connと$conn2は全く別のコネクションとなりクローズ処理も別々にやる必要がでてくる。
まとめ
大規模開発においてはDBの接続先が複数発生する場合が多々ある。そこで(プログラムにおける)DBリソースの管理は適切に行わなう必要がある。
なるべく、同じ接続先には同一コネクションを再利用することを心がけ、限りある資源は有効に活用しましょう。

