(Apache中的)两个PHP实例可以共享相同的PDO持久连接吗?

时间:2019-01-15 12:46:46

标签: php mysql

说我有这个代码:

<?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中运行,因此,如果我打开浏览器到此页面并在mysql中运行SHOW PROCESSLIST,那么我会看到1个连接。页面加载完成后(30秒后),我仍然会在MySQL中看到该连接(因为它是永久的,可以)。

但是现在,如果我在同一页面上打开2个标签页(无论是否使用相同的浏览器,由于它没有影响,我们在这里都不在乎),那么我会看到 2 个连接在SHOW PROCESSLIST中。

所以我想PHP使持久连接保持打开状态,但是不会在“ PHP实例”之间共享它。有办法吗?要为2个PHP实例运行的mysql服务器建立一个单一连接(无论该连接是否持久,但我怀疑非持久连接是否可以工作)?

1 个答案:

答案 0 :(得分:0)

PHP没有真正的连接池。每个“ PHP实例”都保留并重用其自己的持久连接。

无法让多个PHP进程/线程共享它们的连接。

也许有一个第三方代理可以做到这一点,但这并不是很重要:)

由于通常不希望将所有内容都限制在有限数量的MySQL线程中,因此共享少量连接也是没有好处的。