]> git.mxchange.org Git - friendica.git/blobdiff - src/Worker/Cron.php
Fill the item cache when storing item
[friendica.git] / src / Worker / Cron.php
index ad50707c49dd378ba056332153a40dc62beb45fd..0cf5e263232e9039193b58146ce29c27a28b50ef 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * @copyright Copyright (C) 2020, Friendica
+ * @copyright Copyright (C) 2010-2022, the Friendica project
  *
  * @license GNU AGPL version 3 or any later version
  *
@@ -26,7 +26,7 @@ use Friendica\Core\Logger;
 use Friendica\Core\Worker;
 use Friendica\Database\DBA;
 use Friendica\DI;
-use Friendica\Util\DateTimeFormat;
+use Friendica\Model\Tag;
 
 class Cron
 {
@@ -41,15 +41,35 @@ class Cron
                if ($last) {
                        $next = $last + ($poll_interval * 60);
                        if ($next > time()) {
-                               Logger::log('cron intervall not reached');
+                               Logger::notice('cron intervall not reached');
                                return;
                        }
                }
 
-               Logger::log('cron: start');
+               Logger::notice('start');
+
+               // Ensure to have a .htaccess file.
+               // this is a precaution for systems that update automatically
+               $basepath = $a->getBasePath();
+               if (!file_exists($basepath . '/.htaccess') && is_writable($basepath)) {
+                       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($a->queue['priority'], "cron");
+               Hook::fork(PRIORITY_MEDIUM, 'cron');
+
+               // Poll contacts
+               Worker::add(PRIORITY_MEDIUM, 'PollContacts');
+
+               // Update contact information
+               Worker::add(PRIORITY_LOW, 'UpdateContacts');
+
+               // Update server information
+               Worker::add(PRIORITY_LOW, 'UpdateGServers');
 
                // run the process to update server directories in the background
                Worker::add(PRIORITY_LOW, 'UpdateServerDirectories');
@@ -60,92 +80,79 @@ class Cron
                // Call possible post update functions
                Worker::add(PRIORITY_LOW, 'PostUpdate');
 
-               // Repair entries in the database
-               Worker::add(PRIORITY_LOW, 'RepairDatabase');
+               // Hourly cron calls
+               if (DI::config()->get('system', 'last_cron_hourly', 0) + 3600 < time()) {
 
-               // once daily run birthday_updates and then expire in background
-               $d1 = DI::config()->get('system', 'last_expire_day');
-               $d2 = intval(DateTimeFormat::utcNow('d'));
+                       // Update trending tags cache for the community page
+                       Tag::setLocalTrendingHashtags(24, 20);
+                       Tag::setGlobalTrendingHashtags(24, 20);
 
-               // Daily cron calls
-               if ($d2 != intval($d1)) {
+                       // Search for new contacts in the directory
+                       if (DI::config()->get('system', 'synchronize_directory')) {
+                               Worker::add(PRIORITY_LOW, 'PullDirectory');
+                       }
 
-                       Worker::add(PRIORITY_LOW, 'UpdateContactBirthdays');
+                       // Delete all done workerqueue entries                  
+                       Worker::add(PRIORITY_LOW, 'CleanWorkerQueue');
 
-                       Worker::add(PRIORITY_LOW, 'UpdatePhotoAlbums');
+                       // Clear cache entries
+                       Worker::add(PRIORITY_LOW, 'ClearCache');
 
-                       // update nodeinfo data
-                       Worker::add(PRIORITY_LOW, 'NodeInfo');
+                       DI::config()->set('system', 'last_cron_hourly', time());
+               }
 
-                       Worker::add(PRIORITY_LOW, 'UpdateGServers');
+               // Daily maintenance cron calls
+               if (Worker::isInMaintenanceWindow(true)) {
 
-                       Worker::add(PRIORITY_LOW, 'Expire');
+                       Worker::add(PRIORITY_LOW, 'UpdateContactBirthdays');
 
-                       Worker::add(PRIORITY_MEDIUM, 'DBClean');
+                       Worker::add(PRIORITY_LOW, 'UpdatePhotoAlbums');
+
+                       Worker::add(PRIORITY_LOW, 'ExpirePosts');
 
                        Worker::add(PRIORITY_LOW, 'ExpireConversations');
 
-                       Worker::add(PRIORITY_LOW, 'CleanItemUri');
+                       Worker::add(PRIORITY_LOW, 'RemoveUnusedTags');
+
+                       Worker::add(PRIORITY_LOW, 'RemoveUnusedContacts');
+
+                       Worker::add(PRIORITY_LOW, 'RemoveUnusedAvatars');
 
                        // check upstream version?
                        Worker::add(PRIORITY_LOW, 'CheckVersion');
 
-                       Worker::add(PRIORITY_LOW, 'CheckdeletedContacts');
+                       Worker::add(PRIORITY_LOW, 'CheckDeletedContacts');
 
                        if (DI::config()->get('system', 'optimize_tables')) {
                                Worker::add(PRIORITY_LOW, 'OptimizeTables');
                        }
        
-                       DI::config()->set('system', 'last_expire_day', $d2);
+                       DI::config()->set('system', 'last_cron_daily', time());
                }
 
-               // Hourly cron calls
-               if (DI::config()->get('system', 'last_cron_hourly', 0) + 3600 < time()) {
-
-                       // Search for new contacts in the directory
-                       if (DI::config()->get('system', 'synchronize_directory')) {
-                               Worker::add(PRIORITY_LOW, 'PullDirectory');
-                       }
+               Logger::notice('end');
 
-                       // Delete all done workerqueue entries
-                       DBA::delete('workerqueue', ['`done` AND `executed` < UTC_TIMESTAMP() - INTERVAL 1 HOUR']);
+               DI::config()->set('system', 'last_cron', time());
+       }
 
-                       // Optimizing this table only last seconds
-                       if (DI::config()->get('system', 'optimize_tables')) {
-                               // We are acquiring the two locks from the worker to avoid locking problems
-                               if (DI::lock()->acquire(Worker::LOCK_PROCESS, 10)) {
-                                       if (DI::lock()->acquire(Worker::LOCK_WORKER, 10)) {
-                                               DBA::e("OPTIMIZE TABLE `workerqueue`");
-                                               DBA::e("OPTIMIZE TABLE `process`");                     
-                                               DI::lock()->release(Worker::LOCK_WORKER);
-                                       }
-                                       DI::lock()->release(Worker::LOCK_PROCESS);
-                               }
+       /**
+        * 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;
                        }
 
-                       // Clear cache entries
-                       Worker::add(PRIORITY_LOW, 'ClearCache');
-
-                       DI::config()->set('system', 'last_cron_hourly', time());
-               }
-
-               // Ensure to have a .htaccess file.
-               // this is a precaution for systems that update automatically
-               $basepath = $a->getBasePath();
-               if (!file_exists($basepath . '/.htaccess') && is_writable($basepath)) {
-                       copy($basepath . '/.htaccess-dist', $basepath . '/.htaccess');
+                       DBA::e("KILL ?", $process['Id']);
+                       Logger::notice('Killed sleeping process', ['id' => $process['Id']]);
                }
-
-               // Poll contacts
-               Worker::add(PRIORITY_HIGH, 'PollContacts');
-
-               // Update contact information
-               Worker::add(PRIORITY_LOW, 'UpdatePublicContacts');              
-
-               Logger::log('cron: end');
-
-               DI::config()->set('system', 'last_cron', time());
-
-               return;
+               DBA::close($processes);
        }
 }