0

最近、奇妙なバグをデバッグしました。解決策は見つかりましたが、完全に満足できるものではありません。

IntSmarty を使用して Web サイトをローカライズし、ローカライズされた文字列を独自のラッパーを使用してデータベースに保存します。そのデストラクタで、IntSmarty はそれが持っている可能性のある新しい文字列を保存し、データベース呼び出しを行います。

MDB2 の Singleton インスタンスを使用して MySQL に対してクエリを実行し、接続後に SetCharset() 関数を使用して文字セットを UTF-8 に変更しました。IntSmarty によって保存された文字列は、最終的な挿入が行われたときに ISO-8859-1 として解釈されることがわかりました。クエリ ログを詳しく調べたところ、IntSmarty のデストラクタが呼び出される前に MySQL 接続が切断されたことがわかりました。その後、再確立されましたが、新しい接続で「SET NAMES utf8」クエリは発行されませんでした。これにより、保存された文字列が MySQL によって ISO-8859-1 として解釈されました。

MDB2 でデフォルトの文字セットを設定するオプションはないようです。この問題に対する私たちの解決策は、MySQL サーバーの構成を変更することでした。

init-connect='SET NAMES utf8'

my.cnf に。これは、文字セットが常に同じであるという問題を解決するだけです。

では、すべてのクエリが実行される前に接続が切断されるのを防ぐ方法はありますか? MDB2 インスタンスを強制的に破棄することはできますか?

永続的な接続をオンにすることは機能しますが、望ましい答えではありません。

4

1 に答える 1

1

PHP5のドキュメントから:

デストラクタ メソッドは、特定のオブジェクトへのすべての参照が削除されるとすぐに、またはオブジェクトが明示的に破棄されるか、シャットダウン シーケンスの任意の順序で呼び出されます。

PHP ドキュメント

(私のものを強調)

おそらく起こっているのは、スクリプトがオブジェクトを明示的に破棄していないため、PHP がスクリプトの最後に到達すると、感じた順序でクリーンアップを開始することです。この場合、最初にデータベース リンクを閉じます。 .

スクリプトが実際に終了する前に IntSmarty オブジェクトを明示的に破棄すると、問題が解決するはずです。

于 2008-09-18T05:47:57.920 に答える