我应该在php cli中的每个查询后关闭mysql_connection吗?

时间:2014-08-07 10:03:26

标签: php mysql zend-framework

我写了一个php cli脚本作为一个小小的在线游戏主机。(是的,我知道它很奇怪。)

Mysql查询通常在此脚本中使用。我担心连接会占用资源,因此每次我需要运行查询时,我都会编写如下代码:

    $con = mysql_connect("localhost","xxx","xxx");
    mysql_select_db("xxx",$con);
    mysql_query($sql)
    $con = null;

当它有很多时,它真的很令人沮丧。 #_#

我的问题是我应该只使用一个连接,并在脚本中的任何地方使用它,并在退出时将其设置为null?我认为应该有一些与Zend引擎的连接池。

PS。  每个剧本负责一个游戏室,因此一次最多可以有100个,并且回声可以持续24小时。

感谢您的帮助!

3 个答案:

答案 0 :(得分:2)

连接应该来保存资源。这就是你想要的。如果您经常分配/取消分配连接,则每次都要做更多的工作。

如果您有一个长时间运行的进程必须不断与MySQL通信,请打开一个连接并保持打开状态。它被称为持久连接。什么都不会发生。但是如果你经常打开/关闭连接,你就会进行TCP握手,迫使操作系统分配文件描述符,而CPU必须做更多工作,因为操作系统不断为你创建/销毁的每个连接创建一个新线程。这非常浪费。

然而,保持连接打开是不够的。连接可能会死亡。您需要一个数据库连接包装器,它可以确定是否建立了连接,如果没有,则建立连接。相同的包装器应该处理断开/重新连接。

换句话说,请勿关闭连接。以这样一种方式重写代码,即可以调用一个负责连接/重新连接的函数/对象,并返回你使用的连接资源。

答案 1 :(得分:0)

根据我的经验,如果您为脚本的一次传递使用一个连接,或者每次需要mysql时连接+断开连接,那么资源就没有任何差异。 "只有"区别在于PHP文件的行数。

我使用函数连接和断开连接:

function mysql_start($mysql_host, $mysql_user, $mysql_pass){
    mysql_connect($mysql_host, $mysql_user, $mysql_pass) or die ('Error #10020_1!');
    mysql_query("SET CHARACTER SET utf8");
    mysql_query("SET NAMES utf8");
}

function mysql_stop(){
    mysql_close();
}

然后我只是在文件的开头调用函数connect并在结束时停止..

另外,为了让事情变得干净,我不会使用" mysql_select_db"功能。我总是在FROM查询部分中选择数据库,如:

SELECT
    A.something AS something,
    B.something_else AS something_else,
    ...
FROM database_name.table_name AS A, other_database_name.other_table_name AS B 
WHERE 
    ....

但要回答你的问题 - 在我的环境和我的数据脚本类型中进行一些测试后,资源分配或速度没有差别......

答案 2 :(得分:0)

首先:考虑使用mysqli_而不是mysql_,因为自PHP5.5起不推荐使用mysql_ *函数。

下一步:每次调用mysqli_connect时,都会建立与数据库服务器的连接。当数据库服务器位于同一机器上并且通过套接字配置与数据库的连接时,这几乎可以立即实现。但是当数据库服务器位于不同的计算机上时,可能需要一段时间。所以当你打开很多连接(在关闭旧连接之后)可能会使你的应用程序变慢一点。

所以我总是选择在开始时打开一个连接,并在处理完所有查询后关闭它。