]> git.mxchange.org Git - friendica.git/blobdiff - boot.php
Bugfix: Avoid warning when posting items and the worker isn't active
[friendica.git] / boot.php
index ea14428fd0565f2fc6fe5fbb4ba8a5d468d34044..88f7ad7829fff1e30d40290b2794d2834fd089a1 100644 (file)
--- a/boot.php
+++ b/boot.php
@@ -38,7 +38,7 @@ define ( 'FRIENDICA_PLATFORM',     'Friendica');
 define ( 'FRIENDICA_CODENAME',     'Asparagus');
 define ( 'FRIENDICA_VERSION',      '3.5.1-dev' );
 define ( 'DFRN_PROTOCOL_VERSION',  '2.23'    );
-define ( 'DB_UPDATE_VERSION',      1203      );
+define ( 'DB_UPDATE_VERSION',      1208      );
 
 /**
  * @brief Constant with a HTML line break.
@@ -53,7 +53,7 @@ define ( 'ATOM_TIME',              'Y-m-d\TH:i:s\Z' );
 
 /**
  * @brief Image storage quality.
- * 
+ *
  * Lower numbers save space at cost of image detail.
  * For ease of upgrade, please do not change here. Change jpeg quality with
  * $a->config['system']['jpeg_quality'] = n;
@@ -95,7 +95,7 @@ define ( 'DEFAULT_DB_ENGINE',  'MyISAM'  );
 
 /**
  * @name SSL Policy
- * 
+ *
  * SSL redirection policies
  * @{
  */
@@ -106,7 +106,7 @@ define ( 'SSL_POLICY_SELFSIGN',     2 );
 
 /**
  * @name Logger
- * 
+ *
  * log levels
  * @{
  */
@@ -119,7 +119,7 @@ define ( 'LOGGER_ALL',             4 );
 
 /**
  * @name Cache
- * 
+ *
  * Cache levels
  * @{
  */
@@ -127,11 +127,15 @@ define ( 'CACHE_MONTH',            0 );
 define ( 'CACHE_WEEK',             1 );
 define ( 'CACHE_DAY',              2 );
 define ( 'CACHE_HOUR',             3 );
+define ( 'CACHE_HALF_HOUR',        4 );
+define ( 'CACHE_QUARTER_HOUR',     5 );
+define ( 'CACHE_FIVE_MINUTES',     6 );
+define ( 'CACHE_MINUTE',           7 );
 /* @}*/
 
 /**
  * @name Register
- * 
+ *
  * Registration policies
  * @{
  */
@@ -142,7 +146,7 @@ define ( 'REGISTER_OPEN',          2 );
 
 /**
  * @name Contact_is
- * 
+ *
  * Relationship types
  * @{
  */
@@ -153,7 +157,7 @@ define ( 'CONTACT_IS_FRIEND',   3);
 
 /**
  * @name Update
- * 
+ *
  * DB update return values
  * @{
  */
@@ -205,7 +209,7 @@ define ( 'ACCOUNT_TYPE_COMMUNITY',   3 );
 
 /**
  * @name CP
- * 
+ *
  * Type of the community page
  * @{
  */
@@ -216,7 +220,7 @@ define ( 'CP_GLOBAL_COMMUNITY',    1 );
 
 /**
  * @name Network
- * 
+ *
  * Network and protocol family types
  * @{
  */
@@ -288,7 +292,7 @@ define ( 'ZCURL_TIMEOUT' , (-1));
 
 /**
  * @name Notify
- * 
+ *
  * Email notification options
  * @{
  */
@@ -310,7 +314,7 @@ define ( 'NOTIFY_SYSTEM',   0x8000 );
 
 /**
  * @name Term
- * 
+ *
  * Tag/term types
  * @{
  */
@@ -330,7 +334,7 @@ define ( 'TERM_OBJ_PHOTO', 2 );
 
 /**
  * @name Namespaces
- * 
+ *
  * Various namespaces we may need to parse
  * @{
  */
@@ -353,7 +357,7 @@ define ( 'NAMESPACE_ATOM1',           'http://www.w3.org/2005/Atom' );
 
 /**
  * @name Activity
- * 
+ *
  * Activity stream defines
  * @{
  */
@@ -399,7 +403,7 @@ define ( 'ACTIVITY_OBJ_QUESTION', 'http://activityschema.org/object/question' );
 
 /**
  * @name Gravity
- * 
+ *
  * Item weight for query ordering
  * @{
  */
@@ -466,9 +470,9 @@ function startup() {
 /**
  *
  * class: App
- * 
+ *
  * @brief Our main application structure for the life of this page.
- * 
+ *
  * Primarily deals with the URL that got us here
  * and tries to make some sense of it, and
  * stores our page contents and config storage
@@ -781,60 +785,100 @@ class App {
                return($this->scheme);
        }
 
+       /**
+        * @brief Retrieves the Friendica instance base URL
+        *
+        * This function assembles the base URL from multiple parts:
+        * - Protocol is determined either by the request or a combination of
+        * system.ssl_policy and the $ssl parameter.
+        * - Host name is determined either by system.hostname or inferred from request
+        * - Path is inferred from SCRIPT_NAME
+        *
+        * Caches the result (depending on $ssl value) for performance.
+        *
+        * Note: $ssl parameter value doesn't directly correlate with the resulting protocol
+        *
+        * @param bool $ssl Whether to append http or https under SSL_POLICY_SELFSIGN
+        * @return string Friendica server base URL
+        */
        function get_baseurl($ssl = false) {
 
                // Is the function called statically?
-               if (!is_object($this))
-                       return(self::$a->get_baseurl($ssl));
+               if (!is_object($this)) {
+                       return self::$a->get_baseurl($ssl);
+               }
+
+               // Arbitrary values, the resulting url protocol can be different
+               $cache_index = $ssl ? 'https' : 'http';
+
+               // Cached value found, nothing to process
+               if (isset($this->baseurl[$cache_index])) {
+                       return $this->baseurl[$cache_index];
+               }
 
                $scheme = $this->scheme;
 
-               if((x($this->config,'system')) && (x($this->config['system'],'ssl_policy'))) {
-                       if(intval($this->config['system']['ssl_policy']) === intval(SSL_POLICY_FULL))
+               if ((x($this->config, 'system')) && (x($this->config['system'], 'ssl_policy'))) {
+                       if (intval($this->config['system']['ssl_policy']) === SSL_POLICY_FULL) {
                                $scheme = 'https';
+                       }
 
                        //      Basically, we have $ssl = true on any links which can only be seen by a logged in user
                        //      (and also the login link). Anything seen by an outsider will have it turned off.
 
-                       if($this->config['system']['ssl_policy'] == SSL_POLICY_SELFSIGN) {
-                               if($ssl)
+                       if ($this->config['system']['ssl_policy'] == SSL_POLICY_SELFSIGN) {
+                               if ($ssl) {
                                        $scheme = 'https';
-                               else
+                               } else {
                                        $scheme = 'http';
+                               }
                        }
                }
 
-               if (get_config('config','hostname') != "")
-                       $this->hostname = get_config('config','hostname');
+               if (get_config('config', 'hostname') != '') {
+                       $this->hostname = get_config('config', 'hostname');
+               }
 
-               $this->baseurl = $scheme . "://" . $this->hostname . ((isset($this->path) && strlen($this->path)) ? '/' . $this->path : '' );
-               return $this->baseurl;
+               $this->baseurl[$cache_index] = $scheme . "://" . $this->hostname . ((isset($this->path) && strlen($this->path)) ? '/' . $this->path : '' );
+
+               return $this->baseurl[$cache_index];
        }
 
+       /**
+        * @brief Initializes the baseurl components
+        *
+        * Clears the baseurl cache to prevent inconstistencies
+        *
+        * @param string $url
+        */
        function set_baseurl($url) {
                $parsed = @parse_url($url);
 
-               $this->baseurl = $url;
+               $this->baseurl = [];
 
                if($parsed) {
                        $this->scheme = $parsed['scheme'];
 
                        $hostname = $parsed['host'];
-                       if(x($parsed,'port'))
+                       if (x($parsed, 'port')) {
                                $hostname .= ':' . $parsed['port'];
-                       if(x($parsed,'path'))
-                               $this->path = trim($parsed['path'],'\\/');
+                       }
+                       if (x($parsed, 'path')) {
+                               $this->path = trim($parsed['path'], '\\/');
+                       }
 
-                       if (file_exists(".htpreconfig.php"))
+                       if (file_exists(".htpreconfig.php")) {
                                @include(".htpreconfig.php");
+                       }
 
-                       if (get_config('config','hostname') != "")
-                               $this->hostname = get_config('config','hostname');
+                       if (get_config('config', 'hostname') != '') {
+                               $this->hostname = get_config('config', 'hostname');
+                       }
 
-                       if (!isset($this->hostname) OR ($this->hostname == ""))
+                       if (!isset($this->hostname) OR ($this->hostname == '')) {
                                $this->hostname = $hostname;
+                       }
                }
-
        }
 
        function get_hostname() {
@@ -1015,9 +1059,9 @@ class App {
 
        /**
         * @brief Register template engine class
-        * 
+        *
         * If $name is "", is used class static property $class::$name
-        * 
+        *
         * @param string $class
         * @param string $name
         */
@@ -1035,7 +1079,7 @@ class App {
 
        /**
         * @brief Return template engine instance.
-        * 
+        *
         * If $name is not defined, return engine defined by theme,
         * or default
         *
@@ -1100,6 +1144,9 @@ class App {
        }
 
        function save_timestamp($stamp, $value) {
+               if (!isset($this->config['system']['profiler']) || !$this->config['system']['profiler'])
+                       return;
+
                $duration = (float)(microtime(true)-$stamp);
 
                if (!isset($this->performance[$value])) {
@@ -1131,23 +1178,33 @@ class App {
 
                $this->remove_inactive_processes();
 
+               q("START TRANSACTION");
+
                $r = q("SELECT `pid` FROM `process` WHERE `pid` = %d", intval(getmypid()));
-               if(!dbm::is_result($r))
+               if(!dbm::is_result($r)) {
                        q("INSERT INTO `process` (`pid`,`command`,`created`) VALUES (%d, '%s', '%s')",
                                intval(getmypid()),
                                dbesc($command),
                                dbesc(datetime_convert()));
+               }
+               q("COMMIT");
        }
 
        /**
         * @brief Remove inactive processes
         */
        function remove_inactive_processes() {
+               q("START TRANSACTION");
+
                $r = q("SELECT `pid` FROM `process`");
-               if(dbm::is_result($r))
-                       foreach ($r AS $process)
-                               if (!posix_kill($process["pid"], 0))
+               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"]));
+                               }
+                       }
+               }
+               q("COMMIT");
        }
 
        /**
@@ -1176,11 +1233,6 @@ class App {
                return implode(", ", $callstack);
        }
 
-       function mark_timestamp($mark) {
-               //$this->performance["markstart"] -= microtime(true) - $this->performance["marktime"];
-               $this->performance["markstart"] = microtime(true) - $this->performance["markstart"] - $this->performance["marktime"];
-       }
-
        function get_useragent() {
                return(FRIENDICA_PLATFORM." '".FRIENDICA_CODENAME."' ".FRIENDICA_VERSION."-".DB_UPDATE_VERSION."; ".$this->get_baseurl());
        }
@@ -1325,7 +1377,7 @@ class App {
        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 (count($args) && ($args[0] === 'php' OR !is_string($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.
@@ -1358,7 +1410,7 @@ class App {
 
 /**
  * @brief Retrieve the App structure
- * 
+ *
  * Useful in functions which require it but don't get it passed to them
  */
 function get_app() {
@@ -1612,7 +1664,7 @@ function run_update_function($x) {
  * and mark it uninstalled in the database (for now we'll remove it).
  * Then go through the config list and if we have a plugin that isn't installed,
  * call the install procedure and add it to the database.
- * 
+ *
  * @param App $a
  *
         */
@@ -1678,17 +1730,17 @@ function get_guid($size=16, $prefix = "") {
        }
 }
 
-/** 
+/**
  * @brief Wrapper for adding a login box.
- * 
+ *
  * @param bool $register
  *     If $register == true provide a registration link.
  *     This will most always depend on the value of $a->config['register_policy'].
  * @param bool $hiddens
- * 
+ *
  * @return string
  *     Returns the complete html for inserting into the page
- * 
+ *
  * @hooks 'login_hook'
  *     string $o
  */
@@ -1778,7 +1830,7 @@ function goaway($s) {
 
 /**
  * @brief Returns the user id of locally logged in user or false.
- * 
+ *
  * @return int|bool user id or false
  */
 function local_user() {
@@ -1789,7 +1841,7 @@ function local_user() {
 
 /**
  * @brief Returns contact id of authenticated site visitor or false
- * 
+ *
  * @return int|bool visitor_id or false
  */
 function remote_user() {
@@ -1845,14 +1897,15 @@ 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|integer) $cmd program to run or priority
- * 
+ * @param (string|integer|array) $cmd program to run, priority or parameter array
+ *
  * 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);
+ * 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
  */
@@ -1860,24 +1913,31 @@ function proc_run($cmd){
 
        $a = get_app();
 
-       $args = func_get_args();
+       $proc_args = func_get_args();
 
-       $newargs = array();
-       if (!count($args))
+       $args = array();
+       if (!count($proc_args)) {
                return;
+       }
 
-       // expand any arrays
+       // 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);
 
-       foreach($args as $arg) {
-               if(is_array($arg)) {
-                       foreach($arg as $n) {
-                               $newargs[] = $n;
+       // expand any arrays
+       foreach ($proc_args as $arg) {
+               if (is_array($arg)) {
+                       foreach ($arg as $n) {
+                               $args[] = $n;
                        }
-               } else
-                       $newargs[] = $arg;
+               } else {
+                       $args[] = $arg;
+               }
        }
 
-       $args = $newargs;
+       // Now we add the run parameters back to the array
+       array_unshift($args, $run_parameter);
 
        $arr = array('args' => $args, 'run_cmd' => true);
 
@@ -1885,16 +1945,24 @@ function proc_run($cmd){
        if (!$arr['run_cmd'] OR !count($args))
                return;
 
-       if (!get_config("system", "worker") OR
-               (($args[0] != 'php') AND !is_int($args[0]))) {
+       if (!get_config("system", "worker") OR (is_string($run_parameter) AND ($run_parameter != 'php'))) {
                $a->proc_run($args);
                return;
        }
 
-       if (is_int($args[0]))
-               $priority = $args[0];
-       else
-               $priority = PRIORITY_MEDIUM;
+       $priority = PRIORITY_MEDIUM;
+       $dont_fork = get_config("system", "worker_dont_fork");
+
+       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['dont_fork'])) {
+                       $dont_fork = $run_parameter['dont_fork'];
+               }
+       }
 
        $argv = $args;
        array_shift($argv);
@@ -1911,8 +1979,9 @@ function proc_run($cmd){
                        intval($priority));
 
        // Should we quit and wait for the poller to be called as a cronjob?
-       if (get_config("system", "worker_dont_fork"))
+       if ($dont_fork) {
                return;
+       }
 
        // Checking number of workers
        $workers = q("SELECT COUNT(*) AS `workers` FROM `workerqueue` WHERE `executed` != '0000-00-00 00:00:00'");
@@ -2011,9 +2080,9 @@ function current_theme(){
 
 /**
  * @brief Return full URL to theme which is currently in effect.
- * 
+ *
  * Provide a sane default if nothing is chosen or the specified theme does not exist.
- * 
+ *
  * @return string
  */
 function current_theme_url() {
@@ -2360,7 +2429,7 @@ function current_load() {
 
 /**
  * @brief get c-style args
- * 
+ *
  * @return int
  */
 function argc() {
@@ -2369,7 +2438,7 @@ function argc() {
 
 /**
  * @brief Returns the value of a argv key
- * 
+ *
  * @param int $x argv key
  * @return string Value of the argv key
  */
@@ -2382,12 +2451,12 @@ function argv($x) {
 
 /**
  * @brief Get the data which is needed for infinite scroll
- * 
+ *
  * For invinite scroll we need the page number of the actual page
  * and the the URI where the content of the next page comes from.
  * This data is needed for the js part in main.js.
  * Note: infinite scroll does only work for the network page (module)
- * 
+ *
  * @param string $module The name of the module (e.g. "network")
  * @return array Of infinite scroll data
  *     'pageno' => $pageno The number of the actual page