]> git.mxchange.org Git - friendica.git/blobdiff - boot.php
Merge pull request #2682 from annando/1607-api-generic-xml
[friendica.git] / boot.php
index 62baf116da28c57026b18cb01a670c9c17ede83d..bbfd671955215a1e5ebb4847a98654efdbaea41b 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-dev' );
 define ( 'DFRN_PROTOCOL_VERSION',  '2.23'    );
-define ( 'DB_UPDATE_VERSION',      1197      );
+define ( 'DB_UPDATE_VERSION',      1200      );
 
 /**
  * @brief Constant with a HTML line break.
@@ -475,6 +475,7 @@ class App {
        public  $performance = array();
        public  $callstack = array();
        public  $theme_info = array();
+       public  $backend = true;
 
        public $nav_sel;
 
@@ -516,6 +517,8 @@ class App {
         */
        public $template_engine_instance = array();
 
+       public $process_id;
+
        private $ldelim = array(
                'internal' => '',
                'smarty3' => '{{'
@@ -576,6 +579,8 @@ class App {
 
                $this->query_string = '';
 
+               $this->process_id = uniqid("log", true);
+
                startup();
 
                set_include_path(
@@ -940,7 +945,7 @@ class App {
                } 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']);
@@ -1111,6 +1116,77 @@ class App {
                return($this->is_friendica_app);
        }
 
+       /**
+        * @brief Checks if the site is called via a backend process
+        *
+        * This isn't a perfect solution. But we need this check very early.
+        * So we cannot wait until the modules are loaded.
+        *
+        * @return bool Is it a known backend?
+        */
+       function is_backend() {
+               $backend = array();
+               $backend[] = "_well_known";
+               $backend[] = "api";
+               $backend[] = "dfrn_notify";
+               $backend[] = "fetch";
+               $backend[] = "hcard";
+               $backend[] = "hostxrd";
+               $backend[] = "nodeinfo";
+               $backend[] = "noscrape";
+               $backend[] = "p";
+               $backend[] = "poco";
+               $backend[] = "post";
+               $backend[] = "proxy";
+               $backend[] = "pubsub";
+               $backend[] = "pubsubhubbub";
+               $backend[] = "receive";
+               $backend[] = "rsd_xml";
+               $backend[] = "salmon";
+               $backend[] = "statistics_json";
+               $backend[] = "xrd";
+
+               if (in_array($this->module, $backend))
+                       return(true);
+               else
+                       return($this->backend);
+       }
+
+       /**
+        * @brief Checks if the maximum number of database processes is reached
+        *
+        * @return bool Is the limit reached?
+        */
+       function max_processes_reached() {
+
+               // Is the function called statically?
+               if (!is_object($this))
+                       return(self::$a->max_processes_reached());
+
+               if ($this->is_backend()) {
+                       $process = "backend";
+                       $max_processes = get_config('system', 'max_processes_backend');
+                       if (intval($max_processes) == 0)
+                               $max_processes = 5;
+               } else {
+                       $process = "frontend";
+                       $max_processes = get_config('system', 'max_processes_frontend');
+                       if (intval($max_processes) == 0)
+                               $max_processes = 20;
+               }
+
+               $processlist = dbm::processlist();
+               if ($processlist["list"] != "") {
+                       logger("Processcheck: Processes: ".$processlist["amount"]." - Processlist: ".$processlist["list"], LOGGER_DEBUG);
+
+                       if ($processlist["amount"] > $max_processes) {
+                               logger("Processcheck: Maximum number of processes for ".$process." tasks (".$max_processes.") reached.", LOGGER_DEBUG);
+                               return true;
+                       }
+               }
+               return false;
+       }
+
        /**
         * @brief Checks if the maximum load is reached
         *
@@ -1118,14 +1194,26 @@ class App {
         */
        function maxload_reached() {
 
-               $maxsysload = intval(get_config('system', 'maxloadavg'));
-               if ($maxsysload < 1)
-                       $maxsysload = 50;
+               // Is the function called statically?
+               if (!is_object($this))
+                       return(self::$a->maxload_reached());
+
+               if ($this->is_backend()) {
+                       $process = "backend";
+                       $maxsysload = intval(get_config('system', 'maxloadavg'));
+                       if ($maxsysload < 1)
+                               $maxsysload = 50;
+               } else {
+                       $process = "frontend";
+                       $maxsysload = intval(get_config('system','maxloadavg_frontend'));
+                       if ($maxsysload < 1)
+                               $maxsysload = 50;
+               }
 
                $load = current_load();
                if ($load) {
                        if (intval($load) > $maxsysload) {
-                               logger('system: load '.$load.' too high.');
+                               logger('system: load '.$load.' for '.$process.' tasks ('.$maxsysload.') too high.');
                                return true;
                        }
                }
@@ -1425,7 +1513,7 @@ function run_update_function($x) {
 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();
@@ -1698,12 +1786,31 @@ function proc_run($cmd){
                        $found = q("SELECT `id` FROM `workerqueue` WHERE `parameter` = '%s'",
                                        dbesc($parameters));
 
+                       $funcname = str_replace(".php", "", basename($argv[0]))."_run";
+
+                       // Define the processes that have priority over any other process
+                       /// @todo Better check for priority processes
+                       $high_priority = array("delivery_run", "notifier_run", "pubsubpublish_run");
+                       $low_priority = array("queue_run", "gprobe_run", "discover_poco_run");
+
+                       if (in_array($funcname, $high_priority))
+                               $priority = 1;
+                       elseif (in_array($funcname, $low_priority))
+                               $priority = 3;
+                       else
+                               $priority = 2;
+
                        if (!$found)
+                               //  quickfix for the delivery problems, 2106-07-28
+                               /// @todo find better solution
+                               //q("INSERT INTO `workerqueue` (`function`, `parameter`, `created`, `priority`)
+                               //                      VALUES ('%s', '%s', '%s', %d)",
+                               //      dbesc($funcname),
                                q("INSERT INTO `workerqueue` (`parameter`, `created`, `priority`)
                                                        VALUES ('%s', '%s', %d)",
                                        dbesc($parameters),
                                        dbesc(datetime_convert()),
-                                       intval(0));
+                                       intval($priority));
 
                        // Should we quit and wait for the poller to be called as a cronjob?
                        if (get_config("system", "worker_dont_fork"))
@@ -1756,7 +1863,7 @@ 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'];
        }
 
@@ -1869,7 +1976,7 @@ function feed_birthday($uid,$tz) {
                        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');