Merge pull request #5189 from annando/daemon-db
Force a database reconnection in the daemon to prevent lost connections
This commit is contained in:
commit
6eb70e4415
2 changed files with 33 additions and 4 deletions
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in a new issue