From aa3f8ec09d85234d21190fde6097fba01407af45 Mon Sep 17 00:00:00 2001 From: Michael Date: Sun, 10 Jun 2018 22:04:09 +0000 Subject: [PATCH] Force a database reconnection in the daemon to prevent lost connections --- bin/daemon.php | 17 +++++++++++++---- include/dba.php | 20 ++++++++++++++++++++ 2 files changed, 33 insertions(+), 4 deletions(-) diff --git a/bin/daemon.php b/bin/daemon.php index a92446c65b..b8c8d2e342 100755 --- a/bin/daemon.php +++ b/bin/daemon.php @@ -97,24 +97,28 @@ logger('Starting worker daemon.', LOGGER_DEBUG); echo "Starting worker daemon.\n"; // Switch over to daemon mode. -if ($pid = pcntl_fork()) +if ($pid = pcntl_fork()) { return; // Parent +} fclose(STDIN); // Close all of the standard fclose(STDOUT); // file descriptors as we fclose(STDERR); // are running as a daemon. +dba::disconnect(); + register_shutdown_function('shutdown'); -if (posix_setsid() < 0) +if (posix_setsid() < 0) { return; +} -if ($pid = pcntl_fork()) +if ($pid = pcntl_fork()) { return; // Parent +} // We lose the database connection upon forking dba::connect($db_host, $db_user, $db_pass, $db_data); -unset($db_host, $db_user, $db_pass, $db_data); Config::set('system', 'worker_daemon_mode', true); @@ -139,6 +143,11 @@ while (true) { Worker::spawnWorker($do_cron); if ($do_cron) { + // We force a disconnect and reconnect of the database connection. + // This is done to ensure that the connection don't get lost over time. + dba::disconnect(); + dba::connect($db_host, $db_user, $db_pass, $db_data); + $last_cron = time(); } diff --git a/include/dba.php b/include/dba.php index 94f93ff813..6b98f243e4 100644 --- a/include/dba.php +++ b/include/dba.php @@ -92,6 +92,26 @@ class dba { return self::$connected; } + /** + * Disconnects the current database connection + */ + public static function disconnect() + { + if (is_null(self::$db)) { + return; + } + + switch (self::$driver) { + case 'pdo': + self::$db = null; + break; + case 'mysqli': + self::$db->close(); + self::$db = null; + break; + } + } + /** * Return the database object. * @return PDO|mysqli