我在一个应用程序中使用phpgacl库进行授权。这个库正在使用mysql_pconnect连接到数据库。问题是连接没有得到重用,有时整个应用程序会因错误而崩溃——连接太多。我没有太多的并发用户,因此增加mysql中的最大连接数不会永久解决这个问题。我做了一个简单的测试来简化问题。我写了一个简单的php脚本/var/www/a.php
:
<?
mysql_pconnect('localhost', 'root', 'root');
?>
当我第一次点击localhost/a.php
时,我在mysqlprocesslist中看到了一个到数据库的连接。当我第二次点击链接时,我希望该连接能够被重用。但是,事实并非如此。创建了一个新的连接,我看到两个连接处于睡眠状态。每当我点击链接时,计数就会增加。
当我重新启动apache时,所有这些连接都会关闭。
我想知道php-mysql_pconnect是如何工作的,以及它是如何使用以前创建的mysql连接的。为什么在我上面提到的例子中没有发生这种情况?
其中一条评论写道:
You are probably using a multi-process web server such as Apache. Since
database connections cannot be shared among different processes a new
one is created if the request happen to come to a different web server
child process.
这是否意味着不建议将mysql_pconnect与apache一起使用?
每个DB连接都会随着php进程的结束而终止。因此,预计持久连接不会与其他web线程共享。mysql_pconnect
只能在不同的类之间共享应用程序运行时的DB连接,即。你的问题的解决方案是:
- 减少MySQL配置中数据库连接的超时
- 关闭应用程序中的数据库连接
- 为DB查询创建自己的守护进程(但它非常复杂)