2012-03-28 7 views
2

私はある種の(基本的な)ロギングをpostgreSQLデータベースのユーザアクションとともに使用しています。 パフォーマンスを向上させるために、すべてのログ挿入を非同期に実行して、スクリプトを続行し、ログエントリが作成されるまで待機しません。PHPでPostgreSQLを使用して非同期プリペアドステートメントを実行し、その結果を無視する

SQLインジェクションを防止し、必要に応じてロードするために、どこにでもプリペアドステートメントを使用します。

が保留中のの結果が、私が文を準備するときに以前の非同期クエリからフェッチされている場合に問題が発生します。

したがって、私はすべての保留中の結果(もしあれば)を収集し、それらを無視して、PHPとPostgreSQLを満足するようにしてから、文を準備します。

しかし、私はそれを見ているように、私は結果を集めなければならないので、私は非同期的に実行することで得られるパフォーマンスを逃してしまいます。

準備された文を非同期的に実行する方法はありますか?結果を無視するようにdeliberatelly postgresに指示しますか?

すべてのヘルプはapreciatedされます私のPostgreSQLのクラスの中では、私は

pg_send_execute($this->resource, $name, $params); 

でプリペアドステートメントを呼び出していますし、

//Just in case there are pending results (workarround) 
while (pg_get_result($this->resource)!==FALSE); 
$stmt = pg_prepare($this->resource, $stmtname, $query); 

でそれらをprepairing。

更新:私が使用しているすべての非同期クエリはINSERT文だけなので、結果を無視するのは理論上安全です。

答えて

3

非同期の唯一の事柄はPostgreSQLサーバとの通信です。あなたのデータベースはすべてを順番に処理する必要があります。

私の提案:

あなたは、ロギング用のPostgreSQLを使用してログ記録の目的のために個別のデータベース接続を使用して、スクリプトとデータベースの間に座っ接続プールを取得する必要がある場合 - PostgreSQLの認証は高価であり、いくつかの時間がかかり、これはそれをカットします。 2番目の接続を取得するのには時間がかかりますが、この方法を使用すると、接続プールがない場合よりも高速になります。

信頼性の要件によっては、自動コミットを使用する必要があります(PHPがクラッシュしたときにログエントリを失うことはありません)。データベースの信頼性を気にしない場合(データがスキップされてデータが高速になるため)、またはレプリケーションを使用しない場合やログを必要としない場合は、UNLO​​GGEDテーブル(PostgreSQL 9.1以降で使用可能)を使用することができます複製された。

速度の最適化として、各挿入時に更新する必要があるため、ログテーブルにはインデックスがありません。必要な場合は、2番目のテーブルを作成し、バッチでデータを移動します(毎分または毎時間)。

+0

ありがとう、私はより建設的な答えより多くの、そのアプローチ:) – StormByte

関連する問題