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";
// 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();
}

View file

@ -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