define ( 'FRIENDICA_PLATFORM', 'Friendica');
define ( 'FRIENDICA_CODENAME', 'Asparagus');
-define ( 'FRIENDICA_VERSION', '3.5-dev' );
+define ( 'FRIENDICA_VERSION', '3.5' );
define ( 'DFRN_PROTOCOL_VERSION', '2.23' );
-define ( 'DB_UPDATE_VERSION', 1198 );
+define ( 'DB_UPDATE_VERSION', 1202 );
/**
* @brief Constant with a HTML line break.
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"))
*/
public $template_engine_instance = array();
+ public $process_id;
+
private $ldelim = array(
'internal' => '',
'smarty3' => '{{'
$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;
$this->query_string = '';
+ $this->process_id = uniqid("log", true);
+
startup();
set_include_path(
} else {
$r = q("SELECT `contact`.`avatar-date` AS picdate FROM `contact` WHERE `contact`.`thumb` like '%%/%s'",
$common_filename);
- if(! count($r)){
+ if(! dbm::is_result($r)){
$this->cached_profile_image[$avatar_image] = $avatar_image;
} else {
$this->cached_profile_picdate[$common_filename] = "?rev=".urlencode($r[0]['picdate']);
}
+ /**
+ * @brief Log active processes into the "process" table
+ */
+ function start_process() {
+ $trace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 1);
+
+ $command = basename($trace[0]["file"]);
+
+ $this->remove_inactive_processes();
+
+ $r = q("SELECT `pid` FROM `process` WHERE `pid` = %d", intval(getmypid()));
+ if(!dbm::is_result($r))
+ q("INSERT INTO `process` (`pid`,`command`,`created`) VALUES (%d, '%s', '%s')",
+ intval(getmypid()),
+ dbesc($command),
+ dbesc(datetime_convert()));
+ }
+
+ /**
+ * @brief Remove inactive processes
+ */
+ function remove_inactive_processes() {
+ $r = q("SELECT `pid` FROM `process`");
+ if(dbm::is_result($r))
+ foreach ($r AS $process)
+ if (!posix_kill($process["pid"], 0))
+ q("DELETE FROM `process` WHERE `pid` = %d", intval($process["pid"]));
+ }
+
+ /**
+ * @brief Remove the active process from the "process" table
+ */
+ function end_process() {
+ q("DELETE FROM `process` WHERE `pid` = %d", intval(getmypid()));
+ }
+
/**
* @brief Returns a string with a callstack. Can be used for logging.
*
$backend[] = "_well_known";
$backend[] = "api";
$backend[] = "dfrn_notify";
- $backend[] = "dfrn_poll";
$backend[] = "fetch";
$backend[] = "hcard";
$backend[] = "hostxrd";
$backend[] = "nodeinfo";
$backend[] = "noscrape";
$backend[] = "p";
- $backend[] = "photo";
- $backend[] = "photos";
$backend[] = "poco";
$backend[] = "post";
$backend[] = "proxy";
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__)));
+
+ }
}
/**
$build = DB_UPDATE_VERSION;
}
if($build != DB_UPDATE_VERSION)
- proc_run('php', 'include/dbupdate.php');
+ proc_run(PRIORITY_CRITICAL, 'include/dbupdate.php');
}
function check_plugins(&$a) {
$r = q("SELECT * FROM `addon` WHERE `installed` = 1");
- if(count($r))
+ if(dbm::is_result($r))
$installed = $r;
else
$installed = array();
* @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;
}
* @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 ""
*
$args = func_get_args();
$newargs = array();
- if(! count($args))
+ if (!count($args))
return;
// expand any arrays
foreach($arg as $n) {
$newargs[] = $n;
}
- }
- else
+ } else
$newargs[] = $arg;
}
$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(){
$r = q("select theme from user where uid = %d limit 1",
intval($a->profile_uid)
);
- if($r)
+ if(dbm::is_result($r))
$page_theme = $r[0]['theme'];
}
intval($uid)
);
- if($p && count($p)) {
+ if(dbm::is_result($p)) {
$tmp_dob = substr($p[0]['dob'],5);
if(intval($tmp_dob)) {
$y = datetime_convert($tz,$tz,'now','Y');
if (!is_array($load_arr))
return false;
- return max($load_arr);
+ return max($load_arr[0], $load_arr[1]);
}
/**