diff --git a/src/Worker/Cron.php b/src/Worker/Cron.php index 1901766d3a..acb5132afb 100644 --- a/src/Worker/Cron.php +++ b/src/Worker/Cron.php @@ -24,6 +24,7 @@ namespace Friendica\Worker; use Friendica\Core\Hook; use Friendica\Core\Logger; use Friendica\Core\Worker; +use Friendica\Database\DBA; use Friendica\DI; use Friendica\Model\Tag; @@ -54,6 +55,10 @@ class Cron copy($basepath . '/.htaccess-dist', $basepath . '/.htaccess'); } + if (DI::config()->get('system', 'delete_sleeping_processes')) { + self::deleteSleepingProcesses(); + } + // Fork the cron jobs in separate parts to avoid problems when one of them is crashing Hook::fork(PRIORITY_MEDIUM, 'cron'); @@ -137,4 +142,25 @@ class Cron DI::config()->set('system', 'last_cron', time()); } + + /** + * Kill sleeping database processes + * + * @return void + */ + private static function deleteSleepingProcesses() + { + Logger::info('Looking for sleeping processes'); + + $processes = DBA::p("SHOW FULL PROCESSLIST"); + while ($process = DBA::fetch($processes)) { + if (($process['Command'] != 'Sleep') || ($process['Time'] < 300) || ($process['db'] != DBA::databaseName())) { + continue; + } + + DBA::e("KILL ?", $process['Id']); + Logger::notice('Killed sleeping process', ['id' => $process['Id']]); + } + DBA::close($processes); + } } diff --git a/static/defaults.config.php b/static/defaults.config.php index 2bc2bea5b1..893f77cbd5 100644 --- a/static/defaults.config.php +++ b/static/defaults.config.php @@ -194,6 +194,10 @@ return [ // If it is not running and hadn't been terminated normally, it will be started automatically. 'daemon_watchdog' => false, + // delete_sleeping_processes (Boolean) + // Periodically delete waiting database processes. + 'delete_sleeping_processes' => false, + // diaspora_test (Boolean) // For development only. Disables the message transfer. 'diaspora_test' => false,