Force a database reconnection in the daemon to prevent lost connections

This commit is contained in:
Michael 2018-06-10 22:04:09 +00:00
parent 1355798584
commit aa3f8ec09d
2 changed files with 33 additions and 4 deletions

View file

@ -97,24 +97,28 @@ logger('Starting worker daemon.', LOGGER_DEBUG);
echo "Starting worker daemon.\n"; echo "Starting worker daemon.\n";
// Switch over to daemon mode. // Switch over to daemon mode.
if ($pid = pcntl_fork()) if ($pid = pcntl_fork()) {
return; // Parent return; // Parent
}
fclose(STDIN); // Close all of the standard fclose(STDIN); // Close all of the standard
fclose(STDOUT); // file descriptors as we fclose(STDOUT); // file descriptors as we
fclose(STDERR); // are running as a daemon. fclose(STDERR); // are running as a daemon.
dba::disconnect();
register_shutdown_function('shutdown'); register_shutdown_function('shutdown');
if (posix_setsid() < 0) if (posix_setsid() < 0) {
return; return;
}
if ($pid = pcntl_fork()) if ($pid = pcntl_fork()) {
return; // Parent return; // Parent
}
// We lose the database connection upon forking // We lose the database connection upon forking
dba::connect($db_host, $db_user, $db_pass, $db_data); 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); Config::set('system', 'worker_daemon_mode', true);
@ -139,6 +143,11 @@ while (true) {
Worker::spawnWorker($do_cron); Worker::spawnWorker($do_cron);
if ($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(); $last_cron = time();
} }

View file

@ -92,6 +92,26 @@ class dba {
return self::$connected; 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 the database object.
* @return PDO|mysqli * @return PDO|mysqli