假设我有这个代码:
<?php
$pdo = new PDO(
'mysql:host=127.0.0.1;dbname=test_sql',
'root',
'',
array(
PDO::ATTR_PERSISTENT => true));
header('Content-Type: text/plain');
for ($i = 30; $i > 0; $i--) {
echo 'SQL says ' . $pdo->query('SELECT CONCAT(CONNECTION_ID(), "/", NOW()) AS x')->fetchAll(PDO::FETCH_ASSOC)[0]['x'] . ' END|';
sleep(1);
}
它在 Apache 中运行,因此如果我打开浏览器到此页面并运行 SHOW PROCESSLIST
在 mysql 中,我看到 1 个连接。一旦页面加载完成(30 秒后),我仍然会在 MySQL 中看到该连接(因为它是持久的,好吧)。
但是现在,如果我在同一页面上打开 2 个选项卡(无论是否是同一个浏览器,我们在这里不关心它,因为它没有影响),然后我会看到 2 个连接在 SHOW PROCESSLIST
.
所以我认为 PHP 保持持久连接打开,但不会在“PHP 实例”之间共享它。有办法这样做吗?与为 2 个 PHP 实例运行的 mysql 服务器有 1 个单一连接(无论此连接是否是持久连接,但我怀疑非持久连接是否有效)?
最佳答案
PHP 没有真正的连接池。每个“PHP 实例”都保留并重用其自己的持久连接。
无法让多个 PHP 进程/线程共享其连接。
也许有一个第 3 方代理可以执行此操作,但这并不真正重要:)
由于通常不希望将所有内容都限制在有限数量的 MySQL 线程中,因此共享少量连接也没有好处。
关于php - 两个 PHP 实例(在 Apache 中)可以共享同一个 PDO 持久连接吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54199172/