1

データベースへの接続:

$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass,
               array(PDO::ATTR_PERSISTENT => true));

ステートメントの準備:

$stmt = $db->prepare('SELECT * FROM foo',
                     array(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true));

ステートメントはSELECT * FROM foo一度だけ準備され、その後のPHPスクリプトのすべての呼び出しのためにMySQLサーバーに保存されますか?それとも、PHPスクリプトが呼び出されるたびに再準備されますか?

4

2 に答える 2

4

残念ながら、答えは関係ありません。

プリペアドステートメントが持続的接続の存続期間を通じて準備されたままであったとしても、現在のスクリプトが終了すると、PHPはそれを参照する方法がありません。いずれにせよ、ステートメントハンドルが最終的にスコープ外になることを考えると、ステートメント存続できたとしても、おそらく存続しない可能性があります。これは推測ですが、PDOがここでそれ自体をクリーンアップする可能性が非常に高いです。

本当の問題は、PDOがデフォルトでプリペアドステートメントをエミュレートすることです。つまり、プレースホルダーのローカルエスケープと置換を行います。これは、サーバーが実際の準備、バインド、および実行を確認しないことを意味します。実際の準備を使用する場合は、エミュレーションをオフにします。

于 2012-12-28T11:12:05.780 に答える
1

PHPをだまして、単一の持続的接続内のリクエスト間でプリペアドステートメントを保持させることはできますが(「バイナリ」ステートメントの代わりに「テキスト」プリペアドステートメントを使用し、他のハックをいくつか使用する)、多大な労力が必要になりますが、収益はほとんど目立たなくなります。

とにかく、パフォーマンスのためにそれは全く無関係です。クエリを高速化する必要がある場合は、一部のクエリの速度を大幅に向上させることができるHandlerSocketの使用を検討してください

于 2012-12-28T11:54:37.540 に答える