X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=include%2Fpoller.php;h=44f4895cdbda1991d9d12d1c0e59dee33b055eab;hb=de689583e2741a2caee0e266a19a07d1ad4ed043;hp=b4f5df4bf5a9fcd2a1704fb145a988bd885bdf33;hpb=e856ab9a09c74e621b2df5a7d325d71575f06b5e;p=friendica.git diff --git a/include/poller.php b/include/poller.php index b4f5df4bf5..44f4895cdb 100644 --- a/include/poller.php +++ b/include/poller.php @@ -35,14 +35,21 @@ function poller_run($argv, $argc){ $a->start_process(); - if ($a->max_processes_reached()) + if (poller_max_connections_reached()) { return; + } - if (poller_max_connections_reached()) + if ($a->maxload_reached()) { return; + } + + if(($argc <= 1) OR ($argv[1] != "no_cron")) { + poller_run_cron(); + } - if (App::maxload_reached()) + if ($a->max_processes_reached()) { return; + } // Checking the number of workers if (poller_too_much_workers()) { @@ -50,16 +57,6 @@ function poller_run($argv, $argc){ return; } - if(($argc <= 1) OR ($argv[1] != "no_cron")) { - poller_run_cron(); - } else - // Sleep four seconds before checking for running processes again to avoid having too many workers - sleep(4); - - // Checking number of workers - if (poller_too_much_workers()) - return; - $starttime = time(); while ($r = poller_worker_process()) { @@ -193,9 +190,7 @@ function poller_max_connections_reached() { $max = get_config("system", "max_connections"); // Fetch the percentage level where the poller will get active - $maxlevel = get_config("system", "max_connections_level"); - if ($maxlevel == 0) - $maxlevel = 75; + $maxlevel = Config::get("system", "max_connections_level", 75); if ($max == 0) { // the maximum number of possible user connections can be a system variable @@ -311,13 +306,13 @@ function poller_kill_stale_workers() { } } +/** + * @brief Checks if the number of active workers exceeds the given limits + * + * @return bool Are there too much workers running? + */ function poller_too_much_workers() { - - - $queues = get_config("system", "worker_queues"); - - if ($queues == 0) - $queues = 4; + $queues = Config::get("system", "worker_queues", 4); $maxqueues = $queues; @@ -326,9 +321,7 @@ function poller_too_much_workers() { // Decrease the number of workers at higher load $load = current_load(); if($load) { - $maxsysload = intval(get_config('system','maxloadavg')); - if($maxsysload < 1) - $maxsysload = 50; + $maxsysload = intval(Config::get("system", "maxloadavg", 50)); $maxworkers = $queues; @@ -389,6 +382,11 @@ function poller_too_much_workers() { return($active >= $queues); } +/** + * @brief Returns the number of active poller processes + * + * @return integer Number of active poller processes + */ function poller_active_workers() { $workers = q("SELECT COUNT(*) AS `processes` FROM `process` WHERE `command` = 'poller.php'"); @@ -478,8 +476,11 @@ function poller_worker_process() { return $r; } +/** + * @brief Call the front end worker + */ function call_worker() { - if (!get_config("system", "frontend_worker")) { + if (!Config::get("system", "frontend_worker") OR !Config::get("system", "worker")) { return; } @@ -487,11 +488,46 @@ function call_worker() { fetch_url($url, false, $redirects, 1); } +/** + * @brief Call the front end worker if there aren't any active + */ function call_worker_if_idle() { - if (!get_config("system", "frontend_worker")) { + if (!Config::get("system", "frontend_worker") OR !Config::get("system", "worker")) { + return; + } + + // Do we have "proc_open"? Then we can fork the poller + if (function_exists("proc_open")) { + // When was the last time that we called the worker? + // Less than one minute? Then we quit + if ((time() - get_config("system", "worker_started")) < 60) { + return; + } + + set_config("system", "worker_started", time()); + + // Do we have enough running workers? Then we quit here. + if (poller_too_much_workers()) { + // Cleaning dead processes + poller_kill_stale_workers(); + get_app()->remove_inactive_processes(); + + return; + } + + poller_run_cron(); + + logger('Call poller', LOGGER_DEBUG); + + $args = array("php", "include/poller.php", "no_cron"); + $a = get_app(); + $a->proc_run($args); return; } + // We cannot execute background processes. + // We now run the processes from the frontend. + // This won't work with long running processes. poller_run_cron(); clear_worker_processes(); @@ -503,12 +539,26 @@ function call_worker_if_idle() { } } +/** + * @brief Removes long running worker processes + */ function clear_worker_processes() { + $timeout = Config::get("system", "frontend_worker_timeout", 10); + + /// @todo We should clean up the corresponding workerqueue entries as well q("DELETE FROM `process` WHERE `created` < '%s' AND `command` = 'worker.php'", - dbesc(datetime_convert('UTC','UTC',"now - 10 minutes"))); + dbesc(datetime_convert('UTC','UTC',"now - ".$timeout." minutes"))); } +/** + * @brief Runs the cron processes + */ function poller_run_cron() { + logger('Add cron entries', LOGGER_DEBUG); + + // Check for spooled items + proc_run(PRIORITY_HIGH, "include/spool_post.php"); + // Run the cron job that calls all other jobs proc_run(PRIORITY_MEDIUM, "include/cron.php");