我现在使用php-activerecord有一段时间了,我非常喜欢它。php-activerecord 是一个基于ActiveRecord 模式的开源 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