-/**
- * @brief Wrap calls to proc_close(proc_open()) and call hook
- * so plugins can take part in process :)
- *
- * @param (integer|array) priority or parameter array, $cmd atrings are deprecated and are ignored
- *
- * next args are passed as $cmd command line
- * or: proc_run(PRIORITY_HIGH, "include/notifier.php", "drop", $drop_id);
- * or: proc_run(array('priority' => PRIORITY_HIGH, 'dont_fork' => true), "include/create_shadowentry.php", $post_id);
- *
- * @note $cmd and string args are surrounded with ""
- *
- * @hooks 'proc_run'
- * array $arr
- */
-function proc_run($cmd) {
-
- $a = get_app();
-
- $proc_args = func_get_args();
-
- $args = array();
- if (!count($proc_args)) {
- return;
- }
-
- // Preserve the first parameter
- // It could contain a command, the priority or an parameter array
- // If we use the parameter array we have to protect it from the following function
- $run_parameter = array_shift($proc_args);
-
- // expand any arrays
- foreach ($proc_args as $arg) {
- if (is_array($arg)) {
- foreach ($arg as $n) {
- $args[] = $n;
- }
- } else {
- $args[] = $arg;
- }
- }
-
- // Now we add the run parameters back to the array
- array_unshift($args, $run_parameter);
-
- $arr = array('args' => $args, 'run_cmd' => true);
-
- call_hooks("proc_run", $arr);
- if (!$arr['run_cmd'] || ! count($args)) {
- return;
- }
-
- $priority = PRIORITY_MEDIUM;
- $dont_fork = get_config("system", "worker_dont_fork");
- $created = datetime_convert();
-
- if (is_int($run_parameter)) {
- $priority = $run_parameter;
- } elseif (is_array($run_parameter)) {
- if (isset($run_parameter['priority'])) {
- $priority = $run_parameter['priority'];
- }
- if (isset($run_parameter['created'])) {
- $created = $run_parameter['created'];
- }
- if (isset($run_parameter['dont_fork'])) {
- $dont_fork = $run_parameter['dont_fork'];
- }
- }
-
- $argv = $args;
- array_shift($argv);
-
- $parameters = json_encode($argv);
- $found = dba::select('workerqueue', array('id'), array('parameter' => $parameters, 'done' => false), array('limit' => 1));
-
- if (!dbm::is_result($found)) {
- dba::insert('workerqueue', array('parameter' => $parameters, 'created' => $created, 'priority' => $priority));
- }
-
- // Should we quit and wait for the poller to be called as a cronjob?
- if ($dont_fork) {
- return;
- }
-
- // If there is a lock then we don't have to check for too much worker
- if (!Lock::set('poller_worker', 0)) {
- return;
- }
-
- // If there are already enough workers running, don't fork another one
- $quit = poller_too_much_workers();
- Lock::remove('poller_worker');
-
- if ($quit) {
- return;
- }
-
- // Now call the poller to execute the jobs that we just added to the queue
- $args = array("include/poller.php", "no_cron");