2009-09-23 114 views
11

我在使用PHP中的mysqli类时遇到了麻烦,而且我无法在任何地方找到答案。PHP mysqli重新连接问题

在我的脚本中,一个类创建一个mysqli连接,它在整个函数中使用它。之后,这个脚本分叉了。这个连接也是由孩子们使用的,但是当孩子死亡时,我遇到了父母关闭连接的问题(MYSQL Server Has Away)。

在我切换到mysqli(刚刚使用mysql)之前,我只是简单地调用了mysql_ping,以确保在父进程中执行查询之前数据库连接已经存在。 Mysqli有一个类似的ping功能,但它实际上并没有重新连接,如果连接不见了。我尝试使用mysqli.reconnect = ON全局设置,但没有运气(使用php.ini和ini_set)。

php mysql_connect函数允许你获取一个已经存在的连接,所以如果我使用的是mysql而不是mysqli,那么我可以简单地在子进程分叉后重新使用子连接。但mysqli似乎没有任何这样的功能...

我能做的唯一的事情就是调用mysqli-> ping(),如果返回false,则重新连接到父级数据库。这是非常低效率,我宁愿弄清楚如何正确使用mysqli(并且不需要手动重新连接)必须更改回mysql ..

有什么建议吗?

回答

13

mysqli_ping()的医生说,如果你设置的全局选项mysqli.reconnect为1(在php.ini)当它检测到连接已经消失,那么mysqli_ping()将重新连接。

+3

工作。我没有意识到你不能使用ini_set来修改这个变量,并且作为我的天才,我之前在php.ini中添加了这一行,不知道已经有一个mysli.reconnect = Offline文件。但删除那个,只使用mysqli.reconnect工作,并使mysqli-> ping()执行就像mysql_ping。谢谢您的帮助! – 2009-09-24 16:43:36

0

ü可以尝试一些有点不同..不是..坪尝试发送一个非常简单的低强度的查询像现在“选择( )“,看看你是否有更好的结果。

+0

可能有帮助的原因... mysql将你看作是一个活跃用户,而不是仅仅持有连接并占用资源的人..我相信my.ini/my.cnf中有一些超时设置会影响该行为..如果你有机会获得,你也可以看看它。 – 2009-09-24 01:54:31

0

难道你不能使用持久连接吗?另外,fork()真的有必要吗?

-2

我想你需要在my.cng中设置mysqli.reconnect,这是mysql的配置,而不是php.ini,我无法通过ini_set设置更改重新连接,但是我的系统管理员在我的系统管理员中完成了它。 CNF。

所以,点点困惑,其他人已经php.ini文件中做了....

+0

不正确。 'my.cnf'只涉及MySQL服务器,所以通常对PHP客户端没有影响,'mysqli'只存在于PHP中。[mysqli.reconnect](http://www.php.net/manual/) en/mysqli.configuration.php#ini.mysqli.reconnect)*是一个PHP配置设置。 – Synchro 2014-05-06 12:22:02

1
function IsConnected() { 
    if (empty($this->_connectionID) === FALSE && mysqli_ping($this->_connectionID) === TRUE) { 
     return true; // still have connect 
    } 
    $this->_connectionID = false; 
    return false; // lose connection 
}