だいこんの日々2

軸足をtwitterとfacebookに移しつつも、技術的な話はここに書いていきます。

PHP 5.2.2とExceptionと私

通常、Windows上の開発環境で開発してるわけなんですが、こちらでは何も問題なかったわけです。
しかし、Linux上の実行環境に移行したら、「There is already an active transaction」というPDOExceptionが発生。あ?
S2Dao.PHP5を使うAppManagerを1つ追加しただけなんだけど。

で、追いかけていくとS2Dao.PHP5がトランザクションをbeginしているところで例外が発生している。Windowsでは何も問題おきなかったのに。
調べてもDAOPHP-3にしかたどり着かない。v1.1.2を使っているので問題ないはずだ。
S2Dao.PHP5と別にPDOにアクセスしてるライブラリがあるからか?でも今まで動いてたしなぁ。

ってことで、S2Dao.PHP5をひたすら追いかけると、どうやら例外がキャッチ出来ていないらしい。なんで?

        try {
            if(!$this->begin){
                $this->connection->beginTransaction();
            }
        } catch(Exception $e){
            // TODO: No Operation
        }

となっているのに、PDOExceptionがキャッチできない。
catchにPDOExceptionを追加してもダメ。
try〜catch自体が動いていない感じ。これはPHP自体がおかしいと考えたほうがよさそうだ。

Windows環境はPHP v5.2.1、Linux環境はPHP v5.2.2。これか?
PHPChangeLogを見てもそれらしきものは無し。mysqlのfetchでexception云々はあるけど、fetch以前の話だし。
PDOのバージョンでも変わったか?と思ったらPECLにつながらない(-_-; Googleのキャッシュから見るに、PDOもバージョンは変わってなさそう。

で、Linux環境のPHPをv5.2.0に戻してみた。

…動いた。

PHPって怖い!いつものことだけど。

まぁ、導入していたのは非公式ビルドのv5.2.2だったので何ともいえません。でもv5.2.0は#39364のバグがあるから早く移行したい…。セキュリティパッチは当たってるんだけどねぇ。

追記(5/29)
どうやらeAcceleratorのTicket #242が原因っぽい。PHP Bugs: #41406PHP Bugs: #41468でもオプティマイザが原因だとされてるし。すでに確かめる環境がないけど(^-^;