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只准备一次,然后存储在 MySQL 服务器上以供 PHP 脚本的所有后续调用使用?还是每次调用PHP脚本时都要重新准备?

4

2 回答 2

4

不幸的是,答案是无关紧要的。

即使准备好的语句在持久连接的整个生命周期中保持准备状态,一旦当前脚本结束,PHP 也无法引用它。鉴于语句句柄最终无论如何都会超出范围,即使语句可以持续存在,它也可能不会持续存在。这是推测,但 PDO 很可能会在此处自行清理。

真正的问题是PDO 默认模拟预准备语句。也就是说,它对占位符进行本地转义和替换。这意味着服务器永远不会看到真正的准备、绑定和执行。如果您想使用真正的准备,请关闭仿真。

于 2012-12-28T11:12:05.780 回答
1

尽管您可以欺骗 PHP 在单个持久连接内的请求之间保留准备好的语句(使用“文本”准备好的语句而不是“二进制”语句和其他一些技巧),但这需要太多的努力,但收入几乎看不到。

无论如何,对于性能来说,它是无关紧要的。如果您确实需要加快查询速度,请考虑使用 HandlerSocket,它可以大大提高某些查询的速度。

于 2012-12-28T11:54:37.540 回答