Я использую php-activerecord в течение короткого времени, и я абсолютно люблю его. Php-activerecord - это библиотека ORM с открытым исходным кодом, основанная на шаблоне ActiveRecord. Тем не менее, я недавно пытался использовать его в сочетании с приложением websocket на основе Wrench.
Это работает отлично, но для запуска script приложение должно запускаться как демон на linux, чтобы веб-камеры всегда были доступны. Через некоторое время, не используя приложение, а затем попытавшись использовать его снова, он выдает некоторые исключения для базы данных:
Сначала он выдает предупреждение:
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 поддерживает соединение mysql все время, которое запускает сервер websocket, это не должно быть проблемой, если он автоматически попытается снова подключиться и запустить запрос. Но это не так.
Я прочитал кое-что о настройке 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