]> git.mxchange.org Git - friendica.git/blobdiff - src/Core/Process.php
Merge pull request #9882 from MrPetovan/bug/po2php-plural-conversion
[friendica.git] / src / Core / Process.php
index 035f4bf0af46fab7e533df0bc71e4945cc1f0411..447d312d44d3e20bc152d85d1f761c52b5a2c55f 100644 (file)
@@ -1,9 +1,29 @@
 <?php
+/**
+ * @copyright Copyright (C) 2020, Friendica
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ *
+ */
 
 namespace Friendica\Core;
 
 use Friendica\App;
-use Friendica\Core\Config\Configuration;
+use Friendica\Core\Config\IConfig;
+use Friendica\Model;
 use Psr\Log\LoggerInterface;
 
 /**
@@ -15,7 +35,7 @@ use Psr\Log\LoggerInterface;
  *         - Using an process-id per node
  *         - Using memory locks for multi-node locking (redis, memcached, ..)
  */
-final class Process
+class Process
 {
        /**
         * @var LoggerInterface
@@ -28,7 +48,7 @@ final class Process
        private $mode;
 
        /**
-        * @var Configuration
+        * @var IConfig
         */
        private $config;
 
@@ -37,16 +57,63 @@ final class Process
         */
        private $basePath;
 
-       public function __construct(LoggerInterface $logger, App\Mode $mode, Configuration $config, string $basepath)
+       /** @var Model\Process */
+       private $processModel;
+
+       /**
+        * The Process ID of this process
+        *
+        * @var int
+        */
+       private $pid;
+
+       public function __construct(LoggerInterface $logger, App\Mode $mode, IConfig $config, Model\Process $processModel, string $basepath, int $pid)
        {
-               $this->logger   = $logger;
-               $this->mode     = $mode;
-               $this->config   = $config;
+               $this->logger = $logger;
+               $this->mode = $mode;
+               $this->config = $config;
                $this->basePath = $basepath;
+               $this->processModel = $processModel;
+               $this->pid = $pid;
+       }
+
+       /**
+        * Set the process id
+        *
+        * @param integer $pid
+        * @return void
+        */
+       public function setPid(int $pid)
+       {
+               $this->pid = $pid;
+       }
+
+       /**
+        * Log active processes into the "process" table
+        */
+       public function start()
+       {
+               $trace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 1);
+
+               $command = basename($trace[0]['file']);
+
+               $this->processModel->deleteInactive();
+               $this->processModel->insert($command, $this->pid);
+       }
+
+       /**
+        * Remove the active process from the "process" table
+        *
+        * @return bool
+        * @throws \Exception
+        */
+       public function end()
+       {
+               return $this->processModel->deleteByPid($this->pid);
        }
 
        /**
-        * @brief Checks if the maximum number of database processes is reached
+        * Checks if the maximum number of database processes is reached
         *
         * @return bool Is the limit reached?
         */
@@ -86,7 +153,7 @@ final class Process
        }
 
        /**
-        * @brief Checks if the minimal memory is reached
+        * Checks if the minimal memory is reached
         *
         * @return bool Is the memory limit reached?
         */
@@ -123,14 +190,14 @@ final class Process
                $reached = ($free < $min_memory);
 
                if ($reached) {
-                       $this->logger->debug('Minimal memory reached.', ['free' => $free, 'memtotal' => $meminfo['MemTotal'], 'limit' => $min_memory]);
+                       $this->logger->warning('Minimal memory reached.', ['free' => $free, 'memtotal' => $meminfo['MemTotal'], 'limit' => $min_memory]);
                }
 
                return $reached;
        }
 
        /**
-        * @brief Checks if the maximum load is reached
+        * Checks if the maximum load is reached
         *
         * @return bool Is the load reached?
         */
@@ -153,7 +220,7 @@ final class Process
                $load = System::currentLoad();
                if ($load) {
                        if (intval($load) > $maxsysload) {
-                               $this->logger->info('system load for process too high.', ['load' => $load, 'process' => $process, 'maxsysload' => $maxsysload]);
+                               $this->logger->warning('system load for process too high.', ['load' => $load, 'process' => $process, 'maxsysload' => $maxsysload]);
                                return true;
                        }
                }
@@ -169,6 +236,7 @@ final class Process
        public function run($command, $args)
        {
                if (!function_exists('proc_open')) {
+                       $this->logger->warning('"proc_open" not available - quitting');
                        return;
                }
 
@@ -186,6 +254,7 @@ final class Process
                }
 
                if ($this->isMinMemoryReached()) {
+                       $this->logger->warning('Memory limit reached - quitting');
                        return;
                }
 
@@ -195,9 +264,11 @@ final class Process
                        $resource = proc_open($cmdline . ' &', [], $foo, $this->basePath);
                }
                if (!is_resource($resource)) {
-                       $this->logger->debug('We got no resource for command.', ['cmd' => $cmdline]);
+                       $this->logger->warning('We got no resource for command.', ['command' => $cmdline]);
                        return;
                }
                proc_close($resource);
+
+               $this->logger->info('Executed "proc_open"', ['command' => $cmdline, 'callstack' => System::callstack(10)]);
        }
 }