【问题标题】:PHP Socket Server Loses Connection to MySQL OvernightPHP Socket 服务器一夜之间失去与 MySQL 的连接
【发布时间】:2020-03-27 19:44:19
【问题描述】:

我有一个 PHP 套接字服务器,它等待连接,然后与数据库对话以解决它们。我在测试时它工作得很好,但是当我把它放在一边时,第二天早上它就不再与数据库对话了。

当我查看我的日志时,我看到了:

200327 11:54:37    24 Connect   dbuser@localhost as anonymous on dbname
       24 Quit  

我希望看到更多这样的东西:

200327 11:54:20    23 Connect   dbuser@localhost as anonymous on dbname
           23 Query SELECT * FROM table1 WHERE num=4
           23 Query SELECT * FROM table2 WHERE num='4' AND info='deleted'
           23 Query SELECT * FROM table3 WHERE num='4'
           23 Quit  

但是由于某种原因,在服务器运行了一段时间后,在初始连接之后查询就再也没有通过了。

我唯一能想到的可能是我的 PDO 对象以某种方式超时,因为我在启动服务器时创建了一次。

$dbh = new PDO($dbName,$dbUser,$dbPass);

对可能发生的事情有任何想法,如果在流程开始时创建 PDO 对象不正确,如何更好地管理该资源?

PHP 是 PHP 7.0.33,MySQL 是 10.1.44-MariaDB-0+deb9u1 Debian 9.11。

【问题讨论】:

  • 您是否有任何错误/调试日志记录可以帮助您了解代码的实际作用?
  • 这可能与mysql服务器的wait_timeout变量有关,默认为8小时dev.mysql.com/doc/refman/8.0/en/…
  • 阿迪森:一些。我可以看到套接字服务器接收到连接,然后它运行应该生成前两个 MySQL 连接的命令。然后它返回的结果要么是“SELECT * FROM table1 WHERE num=4”,要么是 MySQL 函数没有返回。显然是后者,因为数据在表中。
  • Markownikow:谢谢,听起来很可能就是这样,因为现在除了我之外没有人在使用这个测试服务器。我很乐意接受这个答案,特别是如果您对编写服务器的最佳实践有任何建议,该服务器可能会或可能不会在任何八小时内获得连接。
  • Shannon A.:谢谢,我发布了答案

标签: php mysql


【解决方案1】:

Mysql 服务器将在 "wait_timout" 秒后关闭非活动连接。该变量在此处描述: https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_wait_timeout

我建议每次请求到达套接字时在客户端(php)上打开新连接并在工作完成后关闭,因为增加 wait_timeout 可能导致过多的挂起连接(除非 php 服务器永远不会关闭并重用相同的数据库连接)

【讨论】:

  • 对于将来看到这个的人来说,这是正确的答案。我把new PDO的创建从服务器启动中取出来了,而是在每次执行新命令时都创建它,unset解析命令后的句柄,现在我不再遇到数据库句柄消失的问题.
猜你喜欢
  • 2015-09-22
  • 2011-03-28
  • 2010-12-25
  • 1970-01-01
  • 1970-01-01
  • 2022-06-16
  • 2015-02-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多