X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=include%2Fcron.php;h=77332dcec6c2daa300b2222b496dfd2fee0cdbc8;hb=8d195dc4992ff1e1d083ef0777c24ee897e63875;hp=e2f41028044d970b3463e46502db47975c43552a;hpb=0c6ff4202d2056c710e384175864b3cf7f6f92b3;p=friendica.git diff --git a/include/cron.php b/include/cron.php index e2f4102804..77332dcec6 100644 --- a/include/cron.php +++ b/include/cron.php @@ -11,6 +11,8 @@ if (!file_exists("boot.php") AND (sizeof($_SERVER["argv"]) != 0)) { } require_once("boot.php"); +require_once("include/photos.php"); +require_once("include/user.php"); function cron_run(&$argv, &$argc){ @@ -27,7 +29,6 @@ function cron_run(&$argv, &$argc){ unset($db_host, $db_user, $db_pass, $db_data); }; - require_once('include/session.php'); require_once('include/datetime.php'); require_once('include/items.php'); @@ -35,13 +36,14 @@ function cron_run(&$argv, &$argc){ require_once('include/email.php'); require_once('include/socgraph.php'); require_once('mod/nodeinfo.php'); + require_once('include/post_update.php'); load_config('config'); load_config('system'); // Don't check this stuff if the function is called by the poller if (App::callstack() != "poller_run") { - if (App::maxload_reached()) + if ($a->maxload_reached()) return; if (App::is_already_running('cron', 'include/cron.php', 540)) return; @@ -69,51 +71,47 @@ function cron_run(&$argv, &$argc){ // run queue delivery process in the background - proc_run('php',"include/queue.php"); + proc_run(PRIORITY_NEGLIGIBLE, "include/queue.php"); // run the process to discover global contacts in the background - proc_run('php',"include/discover_poco.php"); + proc_run(PRIORITY_LOW, "include/discover_poco.php"); // run the process to update locally stored global contacts in the background - proc_run('php',"include/discover_poco.php", "checkcontact"); + proc_run(PRIORITY_LOW, "include/discover_poco.php", "checkcontact"); - // expire any expired accounts + // Expire and remove user entries + cron_expire_and_remove_users(); - q("UPDATE user SET `account_expired` = 1 where `account_expired` = 0 - AND `account_expires_on` != '0000-00-00 00:00:00' - AND `account_expires_on` < UTC_TIMESTAMP() "); - - // delete user and contact records for recently removed accounts - - $r = q("SELECT * FROM `user` WHERE `account_removed` = 1 AND `account_expires_on` < UTC_TIMESTAMP() - INTERVAL 3 DAY"); - if ($r) { - foreach($r as $user) { - q("DELETE FROM `contact` WHERE `uid` = %d", intval($user['uid'])); - q("DELETE FROM `user` WHERE `uid` = %d", intval($user['uid'])); - } - } + // If the worker is active, split the jobs in several sub processes + if (get_config("system", "worker")) { + // Check OStatus conversations + proc_run(PRIORITY_MEDIUM, "include/cronjobs.php", "ostatus_mentions"); - $abandon_days = intval(get_config('system','account_abandon_days')); - if($abandon_days < 1) - $abandon_days = 0; + // Check every conversation + proc_run(PRIORITY_MEDIUM, "include/cronjobs.php", "ostatus_conversations"); - // Check OStatus conversations - // Check only conversations with mentions (for a longer time) - ostatus::check_conversations(true); + // Call possible post update functions + proc_run(PRIORITY_LOW, "include/cronjobs.php", "post_update"); - // Check every conversation - ostatus::check_conversations(false); + // update nodeinfo data + proc_run(PRIORITY_LOW, "include/cronjobs.php", "nodeinfo"); + } else { + // Check OStatus conversations + // Check only conversations with mentions (for a longer time) + ostatus::check_conversations(true); - // Set the gcontact-id in the item table if missing - item_set_gcontact(); + // Check every conversation + ostatus::check_conversations(false); - // update nodeinfo data - nodeinfo_cron(); + // Call possible post update functions + // see include/post_update.php for more details + post_update(); - /// @TODO Regenerate usage statistics - // q("ANALYZE TABLE `item`"); + // update nodeinfo data + nodeinfo_cron(); + } // once daily run birthday_updates and then expire in background @@ -124,11 +122,15 @@ function cron_run(&$argv, &$argc){ update_contact_birthdays(); - proc_run('php',"include/discover_poco.php", "suggestions"); + proc_run(PRIORITY_LOW, "include/discover_poco.php", "suggestions"); set_config('system','last_expire_day',$d2); - proc_run('php','include/expire.php'); + proc_run(PRIORITY_LOW, 'include/expire.php'); + + proc_run(PRIORITY_LOW, 'include/dbclean.php'); + + cron_update_photo_albums(); } // Clear cache entries @@ -140,28 +142,78 @@ function cron_run(&$argv, &$argc){ // Repair entries in the database cron_repair_database(); + // Poll contacts + cron_poll_contacts($argc, $argv); + + logger('cron: end'); + + set_config('system','last_cron', time()); + + return; +} + +/** + * @brief Update the cached values for the number of photo albums per user + */ +function cron_update_photo_albums() { + $r = q("SELECT `uid` FROM `user` WHERE NOT `account_expired` AND NOT `account_removed`"); + if (!dbm::is_result($r)) { + return; + } + + foreach ($r AS $user) { + photo_albums($user['uid'], true); + } +} + +/** + * @brief Expire and remove user entries + */ +function cron_expire_and_remove_users() { + // expire any expired accounts + q("UPDATE user SET `account_expired` = 1 where `account_expired` = 0 + AND `account_expires_on` != '0000-00-00 00:00:00' + AND `account_expires_on` < UTC_TIMESTAMP() "); + + // delete user and contact records for recently removed accounts + $r = q("SELECT * FROM `user` WHERE `account_removed` AND `account_expires_on` < UTC_TIMESTAMP() - INTERVAL 3 DAY"); + if ($r) { + foreach($r as $user) { + q("DELETE FROM `contact` WHERE `uid` = %d", intval($user['uid'])); + q("DELETE FROM `user` WHERE `uid` = %d", intval($user['uid'])); + } + } +} + +/** + * @brief Poll contacts for unreceived messages + * + * @param Integer $argc Number of command line arguments + * @param Array $argv Array of command line arguments + */ +function cron_poll_contacts($argc, $argv) { $manual_id = 0; $generation = 0; $force = false; $restart = false; - if(($argc > 1) && ($argv[1] == 'force')) + if (($argc > 1) && ($argv[1] == 'force')) $force = true; - if(($argc > 1) && ($argv[1] == 'restart')) { + if (($argc > 1) && ($argv[1] == 'restart')) { $restart = true; $generation = intval($argv[2]); - if(! $generation) + if (!$generation) killme(); } - if(($argc > 1) && intval($argv[1])) { + if (($argc > 1) && intval($argv[1])) { $manual_id = intval($argv[1]); $force = true; } $interval = intval(get_config('system','poll_interval')); - if(! $interval) + if (!$interval) $interval = ((get_config('system','delivery_interval') === false) ? 3 : intval(get_config('system','delivery_interval'))); // If we are using the worker we don't need a delivery interval @@ -178,6 +230,10 @@ function cron_run(&$argv, &$argc){ // and which have a polling address and ignore Diaspora since // we are unable to match those posts with a Diaspora GUID and prevent duplicates. + $abandon_days = intval(get_config('system','account_abandon_days')); + if($abandon_days < 1) + $abandon_days = 0; + $abandon_sql = (($abandon_days) ? sprintf(" AND `user`.`login_date` > UTC_TIMESTAMP() - INTERVAL %d DAY ", intval($abandon_days)) : '' @@ -198,11 +254,11 @@ function cron_run(&$argv, &$argc){ dbesc(NETWORK_MAIL2) ); - if(! count($contacts)) { + if (!count($contacts)) { return; } - foreach($contacts as $c) { + foreach ($contacts as $c) { $res = q("SELECT * FROM `contact` WHERE `id` = %d LIMIT 1", intval($c['id']) @@ -264,24 +320,22 @@ function cron_run(&$argv, &$argc){ $update = true; break; } - if(!$update) + if (!$update) continue; } logger("Polling ".$contact["network"]." ".$contact["id"]." ".$contact["nick"]." ".$contact["name"]); - proc_run('php','include/onepoll.php',$contact['id']); + if (($contact['network'] == NETWORK_FEED) AND ($contact['priority'] <= 3)) { + proc_run(PRIORITY_MEDIUM, 'include/onepoll.php', $contact['id']); + } else { + proc_run(PRIORITY_LOW, 'include/onepoll.php', $contact['id']); + } if($interval) @time_sleep_until(microtime(true) + (float) $interval); } } - - logger('cron: end'); - - set_config('system','last_cron', time()); - - return; } /** @@ -325,10 +379,10 @@ function cron_clear_cache(&$a) { } // Delete the cached OEmbed entries that are older than one year - q("DELETE FROM `oembed` WHERE `created` < NOW() - INTERVAL 1 YEAR"); + q("DELETE FROM `oembed` WHERE `created` < NOW() - INTERVAL 3 MONTH"); // Delete the cached "parse_url" entries that are older than one year - q("DELETE FROM `parsed_url` WHERE `created` < NOW() - INTERVAL 1 YEAR"); + q("DELETE FROM `parsed_url` WHERE `created` < NOW() - INTERVAL 3 MONTH"); // Maximum table size in megabyte $max_tablesize = intval(get_config('system','optimize_max_tablesize')) * 1000000; @@ -380,7 +434,7 @@ function cron_repair_diaspora(&$a) { $r = q("SELECT `id`, `url` FROM `contact` WHERE `network` = '%s' AND (`batch` = '' OR `notify` = '' OR `poll` = '' OR pubkey = '') ORDER BY RAND() LIMIT 50", dbesc(NETWORK_DIASPORA)); - if ($r) { + if (dbm::is_result($r)) { foreach ($r AS $contact) { if (poco_reachable($contact["url"])) { $data = probe_url($contact["url"]); @@ -401,6 +455,16 @@ function cron_repair_diaspora(&$a) { */ function cron_repair_database() { + // Sometimes there seem to be issues where the "self" contact vanishes. + // We haven't found the origin of the problem by now. + $r = q("SELECT `uid` FROM `user` WHERE NOT EXISTS (SELECT `uid` FROM `contact` WHERE `contact`.`uid` = `user`.`uid` AND `contact`.`self`)"); + if (dbm::is_result($r)) { + foreach ($r AS $user) { + logger('Create missing self contact for user '.$user['uid']); + user_create_self_contact($user['uid']); + } + } + // Set the parent if it wasn't set. (Shouldn't happen - but does sometimes) // This call is very "cheap" so we can do it at any time without a problem q("UPDATE `item` INNER JOIN `item` AS `parent` ON `parent`.`uri` = `item`.`parent-uri` AND `parent`.`uid` = `item`.`uid` SET `item`.`parent` = `parent`.`id` WHERE `item`.`parent` = 0"); @@ -408,6 +472,12 @@ function cron_repair_database() { // There was an issue where the nick vanishes from the contact table q("UPDATE `contact` INNER JOIN `user` ON `contact`.`uid` = `user`.`uid` SET `nick` = `nickname` WHERE `self` AND `nick`=''"); + // Update the global contacts for local users + $r = q("SELECT `uid` FROM `user` WHERE `verified` AND NOT `blocked` AND NOT `account_removed` AND NOT `account_expired`"); + if (dbm::is_result($r)) + foreach ($r AS $user) + update_gcontact_for_user($user["uid"]); + /// @todo /// - remove thread entries without item /// - remove sign entries without item