[PHP-users 23901] Re: connection_status の使い方

Ryosuke Hosoi hosoi @ ryo.com
2004年 12月 13日 (月) 18:19:27 JST


ほそいです

From: mami <mm_tig @ yahoo.co.jp>
Subject: [PHP-users 23895] connection_status の使い方
Date: Sun, 12 Dec 2004 19:28:27 +0900
Message-ID: <20041212190445.9BC6.MM_TIG @ yahoo.co.jp>

> プログラムが正常に行われたら COMMIT し、タイムアウトなどで正
> 常に行われなかったら COMMIT しないというサンプルプログラムを
> 作ってみたのですが思い通りに動いてくれません。connection_status()
> の使い方がよく分かっていないためどこか間違っているんだと思い
> ます。
> 
> connection_status() の返り値は
> http://jp.php.net/manual/ja/features.connection-handling.php> 0 - NORMAL
> 1 - ABORTED
> 2 - TIMEOUT
> と書いているのですがタイムアウト時に 2 が返ってきていません。
> 0 が返ってきています。なので COMMIT されてしまいます。

phpのバージョンはいくつでしょうか?
こちらの環境(php-4.3.9)で試してみたところ、0/1/2が期待通りに
帰ってきました。

http://bugs.php.net/bug.php?id=14542
にある通り、4.3.0〜4.3.1でそのようなbugがあったようで
4.3.2で修正されてます

> ちなみに register_shutdown_function() を使わず プログラムの
> 一番下に COMMIT を書けば解決だとは思いますがどうしても
> register_shutdown_function() は使いたいので宜しくお願いしま
> す。
>
> <?
> set_time_limit(1);
> 
> register_shutdown_function("endFunc");
> 
> $conn = pg_connect("dbname=test user=postgres");
> pg_query($conn, "BEGIN");
> for($i=0; $i<100000000; $i++){
> 	pg_query($conn, "INSERT INTO test_tab (name_txt) VALUES('')");
> }
> 
> function endFunc(){
> 	global $conn;
> 	
> 	if(!connection_status()){
> 		pg_query($conn, "COMMIT");
> 	}
> }
> ?>

いらぬ突っ込みになるかもしれないんですが、どうして、
register_shutdown_function() が使いたいのでしょう?
BEGINとCOMMITが別ブロックなのがやな感じな気が^^;
ふつーに最後にcommitして、終了関数側で異例処理として
 	if(connection_status()){
 		pg_query($conn, "ROLLBACK");
 	}
とやるほうがよいような気が。。。

-- 
 Ryosuke Hosoi / 細井 良祐
 mailto:hosoi @ ryo.com http://www.ryo.com/
 PGP Public Key http://www.ryo.com/ryo/hosoi.ryo.com.asc
 fingerprint = 4F39 61B0 2034 3A5C DFE8  FBCB 7B99 90CF EBE1 A3F3


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