连接数据库:
$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脚本时都重新准备好了吗?
答案 0 :(得分:4)
不幸的是答案是无关紧要的。
即使准备好的语句在持久连接的整个生命周期中仍然准备好,一旦当前脚本结束,PHP就无法引用它。鉴于语句句柄最终无论如何都会超出范围,很可能,即使语句可能持续存在,它可能也不会。这是猜测,但PDO很可能在此之后清理。
真正的问题是PDO, by default, emulates prepared statements。也就是说,它实现了本地转义和占位符的替换。这意味着服务器永远不会看到真实的准备,绑定和执行。如果你想使用真正的准备,请关闭仿真。
答案 1 :(得分:1)
虽然您可以欺骗PHP在单个持久连接中使用“文本”预处理语句而不是“二进制”语句之间保留准备好的语句并将其他黑客联系起来,但这需要付出太多努力,但收入几乎不可察觉。
无论如何,对于表演而言,它是无关紧要的。如果您在真正需要加速查询,请考虑使用HandlerSocket,这可以大大提高某些查询的速度。