X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=boot.php;h=dea9b8e8cd955ed361473fd83ce961f91020336e;hb=35813ab377971f0787c99353746098875304bf84;hp=298010dd0d36cd6060aea172d73213a4f70bcb69;hpb=230bfcebea921b072d797fc7a5c5958e5b257a56;p=friendica.git diff --git a/boot.php b/boot.php index 298010dd0d..dea9b8e8cd 100644 --- a/boot.php +++ b/boot.php @@ -38,7 +38,7 @@ define ( 'FRIENDICA_PLATFORM', 'Friendica'); define ( 'FRIENDICA_CODENAME', 'Asparagus'); define ( 'FRIENDICA_VERSION', '3.5-dev' ); define ( 'DFRN_PROTOCOL_VERSION', '2.23' ); -define ( 'DB_UPDATE_VERSION', 1199 ); +define ( 'DB_UPDATE_VERSION', 1200 ); /** * @brief Constant with a HTML line break. @@ -386,6 +386,20 @@ define ( 'GRAVITY_LIKE', 3); define ( 'GRAVITY_COMMENT', 6); /* @}*/ +/** + * @name Priority + * + * Process priority for the worker + * @{ + */ +define('PRIORITY_UNDEFINED', 0); +define('PRIORITY_CRITICAL', 10); +define('PRIORITY_HIGH', 20); +define('PRIORITY_MEDIUM', 30); +define('PRIORITY_LOW', 40); +define('PRIORITY_NEGLIGIBLE',50); +/* @}*/ + // Normally this constant is defined - but not if "pcntl" isn't installed if (!defined("SIGTERM")) @@ -560,6 +574,7 @@ class App { $this->performance["start"] = microtime(true); $this->performance["database"] = 0; + $this->performance["database_write"] = 0; $this->performance["network"] = 0; $this->performance["file"] = 0; $this->performance["rendering"] = 0; @@ -1241,13 +1256,46 @@ class App { logger("killed stale process"); // Calling a new instance if ($task != "") - proc_run('php', $task); + proc_run(PRIORITY_MEDIUM, $task); } return true; } } return false; } + + function proc_run($args) { + + // Add the php path if it is a php call + if (count($args) && ($args[0] === 'php' OR is_int($args[0]))) { + + // If the last worker fork was less than 10 seconds before then don't fork another one. + // This should prevent the forking of masses of workers. + if (get_config("system", "worker")) { + if ((time() - get_config("system", "proc_run_started")) < 10) + return; + + // Set the timestamp of the last proc_run + set_config("system", "proc_run_started", time()); + } + + $args[0] = ((x($this->config,'php_path')) && (strlen($this->config['php_path'])) ? $this->config['php_path'] : 'php'); + } + + // add baseurl to args. cli scripts can't construct it + $args[] = $this->get_baseurl(); + + for($x = 0; $x < count($args); $x ++) + $args[$x] = escapeshellarg($args[$x]); + + $cmdline = implode($args," "); + + if(get_config('system','proc_windows')) + proc_close(proc_open('cmd /c start /b ' . $cmdline,array(),$foo,dirname(__FILE__))); + else + proc_close(proc_open($cmdline." &",array(),$foo,dirname(__FILE__))); + + } } /** @@ -1363,7 +1411,7 @@ function check_db() { $build = DB_UPDATE_VERSION; } if($build != DB_UPDATE_VERSION) - proc_run('php', 'include/dbupdate.php'); + proc_run(PRIORITY_CRITICAL, 'include/dbupdate.php'); } @@ -1651,7 +1699,9 @@ function login($register = false, $hiddens=false) { * @brief Used to end the current process, after saving session state. */ function killme() { - session_write_close(); + if (!get_app()->is_backend()) + session_write_close(); + exit; } @@ -1736,10 +1786,11 @@ function get_max_import_size() { * @brief Wrap calls to proc_close(proc_open()) and call hook * so plugins can take part in process :) * - * @param string $cmd program to run + * @param (string|integer) $cmd program to run or priority * * next args are passed as $cmd command line * e.g.: proc_run("ls","-la","/tmp"); + * or: proc_run(PRIORITY_HIGH, "include/notifier.php", "drop", $drop_id); * * @note $cmd and string args are surrounded with "" * @@ -1753,7 +1804,7 @@ function proc_run($cmd){ $args = func_get_args(); $newargs = array(); - if(! count($args)) + if (!count($args)) return; // expand any arrays @@ -1763,8 +1814,7 @@ function proc_run($cmd){ foreach($arg as $n) { $newargs[] = $n; } - } - else + } else $newargs[] = $arg; } @@ -1773,62 +1823,55 @@ function proc_run($cmd){ $arr = array('args' => $args, 'run_cmd' => true); call_hooks("proc_run", $arr); - if(! $arr['run_cmd']) + if (!$arr['run_cmd'] OR !count($args)) return; - if(count($args) && $args[0] === 'php') { - - if (get_config("system", "worker")) { - $argv = $args; - array_shift($argv); - - $parameters = json_encode($argv); - $found = q("SELECT `id` FROM `workerqueue` WHERE `parameter` = '%s'", - dbesc($parameters)); - - if (!$found) - q("INSERT INTO `workerqueue` (`parameter`, `created`, `priority`) - VALUES ('%s', '%s', %d)", - dbesc($parameters), - dbesc(datetime_convert()), - intval(0)); + if (!get_config("system", "worker") OR + (($args[0] != 'php') AND !is_int($args[0]))) { + $a->proc_run($args); + return; + } - // Should we quit and wait for the poller to be called as a cronjob? - if (get_config("system", "worker_dont_fork")) - return; + if (is_int($args[0])) + $priority = $args[0]; + else + $priority = PRIORITY_MEDIUM; - // Checking number of workers - $workers = q("SELECT COUNT(*) AS `workers` FROM `workerqueue` WHERE `executed` != '0000-00-00 00:00:00'"); + $argv = $args; + array_shift($argv); - // Get number of allowed number of worker threads - $queues = intval(get_config("system", "worker_queues")); + $parameters = json_encode($argv); + $found = q("SELECT `id` FROM `workerqueue` WHERE `parameter` = '%s'", + dbesc($parameters)); - if ($queues == 0) - $queues = 4; + if (!$found) + q("INSERT INTO `workerqueue` (`parameter`, `created`, `priority`) + VALUES ('%s', '%s', %d)", + dbesc($parameters), + dbesc(datetime_convert()), + intval($priority)); - // If there are already enough workers running, don't fork another one - if ($workers[0]["workers"] >= $queues) - return; + // Should we quit and wait for the poller to be called as a cronjob? + if (get_config("system", "worker_dont_fork")) + return; - // Now call the poller to execute the jobs that we just added to the queue - $args = array("php", "include/poller.php", "no_cron"); - } + // Checking number of workers + $workers = q("SELECT COUNT(*) AS `workers` FROM `workerqueue` WHERE `executed` != '0000-00-00 00:00:00'"); - $args[0] = ((x($a->config,'php_path')) && (strlen($a->config['php_path'])) ? $a->config['php_path'] : 'php'); - } + // Get number of allowed number of worker threads + $queues = intval(get_config("system", "worker_queues")); - // add baseurl to args. cli scripts can't construct it - $args[] = $a->get_baseurl(); + if ($queues == 0) + $queues = 4; - for($x = 0; $x < count($args); $x ++) - $args[$x] = escapeshellarg($args[$x]); + // If there are already enough workers running, don't fork another one + if ($workers[0]["workers"] >= $queues) + return; - $cmdline = implode($args," "); + // Now call the poller to execute the jobs that we just added to the queue + $args = array("php", "include/poller.php", "no_cron"); - if(get_config('system','proc_windows')) - proc_close(proc_open('cmd /c start /b ' . $cmdline,array(),$foo,dirname(__FILE__))); - else - proc_close(proc_open($cmdline." &",array(),$foo,dirname(__FILE__))); + $a->proc_run($args); } function current_theme(){ @@ -2253,7 +2296,7 @@ function current_load() { if (!is_array($load_arr)) return false; - return max($load_arr); + return max($load_arr[0], $load_arr[1]); } /**