【发布时间】:2015-04-14 18:42:53
【问题描述】:
我现在使用php-activerecord 有一段时间了,我非常喜欢它。 php-activerecord 是一个基于ActiveRecord pattern 的开源ORM 库。但是,我最近尝试将它与基于 Wrench 的 websocket 应用程序结合使用。
这非常有效,但要启动脚本,应用程序必须在 linux 上作为守护进程运行,以使 websocket 始终可用。一段时间不使用该应用程序然后尝试再次使用它会引发一些数据库异常:
一开始它会发出警告:
PHP Warning: Error while sending QUERY packet. PID=XXXXX in /home/user/domains/example.com/public_html/vendor/php-activerecord/php-activerecord/lib/Connection.php on line 322
然后它抛出一个致命错误:
PHP Fatal error: Uncaught exception 'ActiveRecord\DatabaseException' with message 'exception 'PDOException' with message 'SQLSTATE[HY000]: General error: 2006 MySQL server has gone away' in /home/user/domains/example.com/public_html/vendor/php-activerecord/php-activerecord/lib/Connection.php:322
堆栈跟踪:
#0 /home/user/domains/example.com/public_html/vendor/php-activerecord/php-activerecord/lib/Connection.php(322): PDOStatement->execute(Array)
#1 /home/user/domains/example.com/public_html/vendor/php-activerecord/php-activerecord/lib/Table.php(218): ActiveRecord\Connection->query('SELECT * FROM ...', Array)
#2 /home/user/domains/example.com/public_html/vendor/php-activerecord/php-activerecord/lib/Table.php(209): ActiveRecord\Table->find_by_sql('SELECT * FROM `...', Array, false, NULL)
#3 /home/user/domains/example.com/public_html/vendor/php-activerecord/php-activerecord/lib/Model.php(1567): ActiveRecord\Table->find(Array)
#4 in /home/user/domains/example.com/public_html/vendor/php-activerecord/lib/Connection.php on line 325
似乎 php-activerecord 在 websocket 服务器运行时一直保持 mysql 连接打开,如果它随后自动尝试重新连接并再次运行查询,这当然不成问题。但事实并非如此。
我读过一些关于设置MYSQL_OPT_RECONNECT 的内容。但我不确定这是否有效或如何使用 php-activerecord 设置该选项。有人在这方面有经验吗?
编辑:这是我的全局超时配置变量
VARIABLE_NAME VARIABLE_VALUE
DELAYED_INSERT_TIMEOUT 300
WAIT_TIMEOUT 28800
CONNECT_TIMEOUT 10
LOCK_WAIT_TIMEOUT 31536000
INNODB_ROLLBACK_ON_TIMEOUT OFF
THREAD_POOL_IDLE_TIMEOUT 60
NET_WRITE_TIMEOUT 60
INNODB_LOCK_WAIT_TIMEOUT 50
INTERACTIVE_TIMEOUT 28800
DEADLOCK_TIMEOUT_LONG 50000000
SLAVE_NET_TIMEOUT 3600
DEADLOCK_TIMEOUT_SHORT 10000
NET_READ_TIMEOUT 30
【问题讨论】:
-
您是否完全控制了数据库配置?你能列出你在配置中设置的所有超时吗?如果您的配置为空,请从 mysql 中选择您的全局变量并发布所有包含“超时”的行。
-
@Dimitri 是的,我有完全的控制权,我刚刚编辑了我的问题。
-
你检查过how to enable database auto-reconnect in PHP?。根据它,不可能在 PDO 中设置
MYSQL_OPT_RECONNECT(并且 php-activerecord 使用 PDO)。也许解决方法是每小时执行一次简单查询? -
您是否要让连接持续超过 8 小时?
-
IMO,
MYSQL_OPT_RECONNECT不是一个好的解决方案。在下面阅读我的答案。以实际实现为准。
标签: php mysql activerecord phpactiverecord wrench