X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=include%2Fcron.php;h=c60284b738a7d819f4c6f6e4601b7517a4032eb4;hb=6ff5c23d50095e5407bf69f8a4ec2220c5d2d408;hp=ea7fd2c6060606c9d61a18f8ec97c96d5fa8cbe6;hpb=ff739b0a2320350e27cb5bbb9d915d81734363e3;p=friendica.git diff --git a/include/cron.php b/include/cron.php index ea7fd2c606..c60284b738 100644 --- a/include/cron.php +++ b/include/cron.php @@ -30,44 +30,36 @@ function cron_run(&$argv, &$argc){ require_once('include/session.php'); require_once('include/datetime.php'); - require_once('library/simplepie/simplepie.inc'); require_once('include/items.php'); require_once('include/Contact.php'); require_once('include/email.php'); require_once('include/socgraph.php'); - require_once('include/pidfile.php'); require_once('mod/nodeinfo.php'); load_config('config'); load_config('system'); - $maxsysload = intval(get_config('system','maxloadavg')); - if($maxsysload < 1) - $maxsysload = 50; - if(function_exists('sys_getloadavg')) { - $load = sys_getloadavg(); - if(intval($load[0]) > $maxsysload) { - logger('system: load ' . $load[0] . ' too high. cron deferred to next scheduled run.'); + // Don't check this stuff if the function is called by the poller + if (App::callstack() != "poller_run") { + if (App::maxload_reached()) + return; + if (App::is_already_running('cron', 'include/cron.php', 540)) return; - } } - $lockpath = get_lockpath(); - if ($lockpath != '') { - $pidfile = new pidfile($lockpath, 'cron'); - if($pidfile->is_already_running()) { - logger("cron: Already running"); - if ($pidfile->running_time() > 9*60) { - $pidfile->kill(); - logger("cron: killed stale process"); - // Calling a new instance - proc_run('php','include/cron.php'); - } - exit; - } - } + $last = get_config('system','last_cron'); + $poll_interval = intval(get_config('system','cron_interval')); + if(! $poll_interval) + $poll_interval = 10; + if($last) { + $next = $last + ($poll_interval * 60); + if($next > time()) { + logger('cron intervall not reached'); + return; + } + } $a->set_baseurl(get_config('system','url')); @@ -75,6 +67,18 @@ function cron_run(&$argv, &$argc){ logger('cron: start'); + // run queue delivery process in the background + + proc_run('php',"include/queue.php"); + + // run the process to discover global contacts in the background + + proc_run('php',"include/discover_poco.php"); + + // run the process to update locally stored global contacts in the background + + proc_run('php',"include/discover_poco.php", "checkcontact"); + // expire any expired accounts q("UPDATE user SET `account_expired` = 1 where `account_expired` = 0 @@ -97,19 +101,18 @@ function cron_run(&$argv, &$argc){ // Check OStatus conversations // Check only conversations with mentions (for a longer time) - check_conversations(true); + ostatus::check_conversations(true); // Check every conversation - check_conversations(false); + ostatus::check_conversations(false); - // Follow your friends from your legacy OStatus account - // Doesn't work - // ostatus_check_follow_friends(); + // Set the gcontact-id in the item table if missing + item_set_gcontact(); // update nodeinfo data nodeinfo_cron(); - // To-Do: Regenerate usage statistics + /// @TODO Regenerate usage statistics // q("ANALYZE TABLE `item`"); // once daily run birthday_updates and then expire in background @@ -121,45 +124,21 @@ function cron_run(&$argv, &$argc){ update_contact_birthdays(); - update_suggestions(); + proc_run('php',"include/discover_poco.php", "suggestions"); set_config('system','last_expire_day',$d2); + proc_run('php','include/expire.php'); } - $last = get_config('system','cache_last_cleared'); - - if($last) { - $next = $last + (3600); // Once per hour - $clear_cache = ($next <= time()); - } else - $clear_cache = true; - - if ($clear_cache) { - // clear old cache - Cache::clear(); - - // clear old item cache files - clear_cache(); + // Clear cache entries + cron_clear_cache($a); - // clear cache for photos - clear_cache($a->get_basepath(), $a->get_basepath()."/photo"); - - // clear smarty cache - clear_cache($a->get_basepath()."/view/smarty3/compiled", $a->get_basepath()."/view/smarty3/compiled"); - - // clear cache for image proxy - if (!get_config("system", "proxy_disabled")) { - clear_cache($a->get_basepath(), $a->get_basepath()."/proxy"); - - $cachetime = get_config('system','proxy_cache_time'); - if (!$cachetime) $cachetime = PROXY_DEFAULT_TIME; - - q('DELETE FROM `photo` WHERE `uid` = 0 AND `resource-id` LIKE "pic:%%" AND `created` < NOW() - INTERVAL %d SECOND', $cachetime); - } + // Repair missing Diaspora values in contacts + cron_repair_diaspora($a); - set_config('system','cache_last_cleared', time()); - } + // Repair entries in the database + cron_repair_database(); $manual_id = 0; $generation = 0; @@ -185,15 +164,16 @@ function cron_run(&$argv, &$argc){ 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 + if (get_config("system", "worker")) + $interval = false; + $sql_extra = (($manual_id) ? " AND `id` = $manual_id " : ""); reload_plugins(); $d = datetime_convert(); - if(! $restart) - proc_run('php','include/cronhooks.php'); - // Only poll from those with suitable relationships, // and which have a polling address and ignore Diaspora since // we are unable to match those posts with a Diaspora GUID and prevent duplicates. @@ -299,10 +279,138 @@ function cron_run(&$argv, &$argc){ logger('cron: end'); + set_config('system','last_cron', time()); + return; } +/** + * @brief Clear cache entries + * + * @param App $a + */ +function cron_clear_cache(&$a) { + + $last = get_config('system','cache_last_cleared'); + + if($last) { + $next = $last + (3600); // Once per hour + $clear_cache = ($next <= time()); + } else + $clear_cache = true; + + if (!$clear_cache) + return; + + // clear old cache + Cache::clear(); + + // clear old item cache files + clear_cache(); + + // clear cache for photos + clear_cache($a->get_basepath(), $a->get_basepath()."/photo"); + + // clear smarty cache + clear_cache($a->get_basepath()."/view/smarty3/compiled", $a->get_basepath()."/view/smarty3/compiled"); + + // clear cache for image proxy + if (!get_config("system", "proxy_disabled")) { + clear_cache($a->get_basepath(), $a->get_basepath()."/proxy"); + + $cachetime = get_config('system','proxy_cache_time'); + if (!$cachetime) $cachetime = PROXY_DEFAULT_TIME; + + q('DELETE FROM `photo` WHERE `uid` = 0 AND `resource-id` LIKE "pic:%%" AND `created` < NOW() - INTERVAL %d SECOND', $cachetime); + } + + // Delete the cached OEmbed entries that are older than one year + q("DELETE FROM `oembed` WHERE `created` < NOW() - INTERVAL 1 YEAR"); + + // Delete the cached "parse_url" entries that are older than one year + q("DELETE FROM `parsed_url` WHERE `created` < NOW() - INTERVAL 1 YEAR"); + + // Maximum table size in megabyte + $max_tablesize = intval(get_config('system','optimize_max_tablesize')) * 1000000; + if ($max_tablesize == 0) + $max_tablesize = 100 * 1000000; // Default are 100 MB + + // Minimum fragmentation level in percent + $fragmentation_level = intval(get_config('system','optimize_fragmentation')) / 100; + if ($fragmentation_level == 0) + $fragmentation_level = 0.3; // Default value is 30% + + // Optimize some tables that need to be optimized + $r = q("SHOW TABLE STATUS"); + foreach($r as $table) { + + // Don't optimize tables that are too large + if ($table["Data_length"] > $max_tablesize) + continue; + + // Don't optimize empty tables + if ($table["Data_length"] == 0) + continue; + + // Calculate fragmentation + $fragmentation = $table["Data_free"] / ($table["Data_length"] + $table["Index_length"]); + + logger("Table ".$table["Name"]." - Fragmentation level: ".round($fragmentation * 100, 2), LOGGER_DEBUG); + + // Don't optimize tables that needn't to be optimized + if ($fragmentation < $fragmentation_level) + continue; + + // So optimize it + logger("Optimize Table ".$table["Name"], LOGGER_DEBUG); + q("OPTIMIZE TABLE `%s`", dbesc($table["Name"])); + } + + set_config('system','cache_last_cleared', time()); +} + +/** + * @brief Repair missing values in Diaspora contacts + * + * @param App $a + */ +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) { + foreach ($r AS $contact) { + if (poco_reachable($contact["url"])) { + $data = probe_url($contact["url"]); + if ($data["network"] == NETWORK_DIASPORA) { + logger("Repair contact ".$contact["id"]." ".$contact["url"], LOGGER_DEBUG); + q("UPDATE `contact` SET `batch` = '%s', `notify` = '%s', `poll` = '%s', pubkey = '%s' WHERE `id` = %d", + dbesc($data["batch"]), dbesc($data["notify"]), dbesc($data["poll"]), dbesc($data["pubkey"]), + intval($contact["id"])); + } + } + } + } +} + +/** + * @brief Do some repairs in database entries + * + */ +function cron_repair_database() { + + // 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"); + + /// @todo + /// - remove thread entries without item + /// - remove sign entries without item + /// - remove children when parent got lost + /// - set contact-id in item when not present +} + if (array_search(__file__,get_included_files())===0){ - cron_run($_SERVER["argv"],$_SERVER["argc"]); - killme(); + cron_run($_SERVER["argv"],$_SERVER["argc"]); + killme(); }