Rewrite Process Model/Core
authorPhilipp <admin@philipp.info>
Tue, 15 Sep 2020 16:16:44 +0000 (18:16 +0200)
committerPhilipp <admin@philipp.info>
Tue, 15 Sep 2020 16:16:44 +0000 (18:16 +0200)
bin/worker.php
src/Core/Process.php
src/Core/Worker.php
src/DI.php
src/Model/Process.php
src/Module/Worker.php

index 1b70a20..46eff10 100755 (executable)
@@ -23,6 +23,7 @@
 
 use Dice\Dice;
 use Friendica\App;
+use Friendica\Core\Process;
 use Friendica\Core\Update;
 use Friendica\Core\Worker;
 use Friendica\DI;
@@ -76,4 +77,4 @@ Worker::processQueue($run_cron);
 
 Worker::unclaimProcess();
 
-Worker::endProcess();
+DI::process()->end();
index fd6b17f..08284b2 100644 (file)
@@ -23,6 +23,7 @@ namespace Friendica\Core;
 
 use Friendica\App;
 use Friendica\Core\Config\IConfig;
+use Friendica\Model;
 use Psr\Log\LoggerInterface;
 
 /**
@@ -56,12 +57,48 @@ class Process
         */
        private $basePath;
 
-       public function __construct(LoggerInterface $logger, App\Mode $mode, IConfig $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)
        {
-               $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 = getmypid();
+       }
+
+       /**
+        * 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);
        }
 
        /**
index 7758e06..80ec169 100644 (file)
@@ -22,6 +22,7 @@
 namespace Friendica\Core;
 
 use Friendica\Core;
+use Friendica\Core\Process as ProcessAlias;
 use Friendica\Database\DBA;
 use Friendica\DI;
 use Friendica\Model\Process;
@@ -72,7 +73,7 @@ class Worker
                }
 
                // We now start the process. This is done after the load check since this could increase the load.
-               self::startProcess();
+               DI::process()->start();
 
                // Kill stale processes every 5 minutes
                $last_cleanup = DI::config()->get('system', 'worker_last_cleaned', 0);
@@ -1092,7 +1093,7 @@ class Worker
                        if (self::tooMuchWorkers()) {
                                // Cleaning dead processes
                                self::killStaleWorkers();
-                               Process::deleteInactive();
+                               DI::modelProcess()->deleteInactive();
 
                                return;
                        }
@@ -1360,31 +1361,6 @@ class Worker
                return true;
        }
 
-       /**
-        * Log active processes into the "process" table
-        */
-       public static function startProcess()
-       {
-               $trace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 1);
-
-               $command = basename($trace[0]['file']);
-
-               Process::deleteInactive();
-
-               Process::insert($command);
-       }
-
-       /**
-        * Remove the active process from the "process" table
-        *
-        * @return bool
-        * @throws \Exception
-        */
-       public static function endProcess()
-       {
-               return Process::deleteByPid();
-       }
-
        /**
         * Set the flag if some job is waiting
         *
index cb61666..4db53f2 100644 (file)
@@ -314,6 +314,13 @@ abstract class DI
        //
        // "Model" namespace instances
        //
+       /**
+        * @return Model\Process
+        */
+       public static function modelProcess()
+       {
+               return self::$dice->create(Model\Process::class);
+       }
 
        /**
         * @return Model\User\Cookie
index 18b5f78..cc8a184 100644 (file)
@@ -21,7 +21,7 @@
 
 namespace Friendica\Model;
 
-use Friendica\Database\DBA;
+use Friendica\Database\Database;
 use Friendica\Util\DateTimeFormat;
 
 /**
@@ -29,29 +29,33 @@ use Friendica\Util\DateTimeFormat;
  */
 class Process
 {
+       /** @var Database */
+       private $dba;
+
+       public function __construct(Database $dba)
+       {
+               $this->dba = $dba;
+       }
+
        /**
         * Insert a new process row. If the pid parameter is omitted, we use the current pid
         *
         * @param string $command
-        * @param string $pid
+        * @param int $pid The process id to insert
         * @return bool
         * @throws \Exception
         */
-       public static function insert($command, $pid = null)
+       public function insert(string $command, int $pid)
        {
                $return = true;
 
-               if (is_null($pid)) {
-                       $pid = getmypid();
-               }
-
-               DBA::transaction();
+               $this->dba->transaction();
 
-               if (!DBA::exists('process', ['pid' => $pid])) {
-                       $return = DBA::insert('process', ['pid' => $pid, 'command' => $command, 'created' => DateTimeFormat::utcNow()]);
+               if (!$this->dba->exists('process', ['pid' => $pid])) {
+                       $return = $this->dba->insert('process', ['pid' => $pid, 'command' => $command, 'created' => DateTimeFormat::utcNow()]);
                }
 
-               DBA::commit();
+               $this->dba->commit();
 
                return $return;
        }
@@ -59,33 +63,29 @@ class Process
        /**
         * Remove a process row by pid. If the pid parameter is omitted, we use the current pid
         *
-        * @param string $pid
+        * @param int $pid The pid to delete
         * @return bool
         * @throws \Exception
         */
-       public static function deleteByPid($pid = null)
+       public function deleteByPid(int $pid)
        {
-               if ($pid === null) {
-                       $pid = getmypid();
-               }
-
-               return DBA::delete('process', ['pid' => $pid]);
+               return $this->dba->delete('process', ['pid' => $pid]);
        }
 
        /**
         * Clean the process table of inactive physical processes
         */
-       public static function deleteInactive()
+       public function deleteInactive()
        {
-               DBA::transaction();
+               $this->dba->transaction();
 
-               $processes = DBA::select('process', ['pid']);
-               while($process = DBA::fetch($processes)) {
+               $processes = $this->dba->select('process', ['pid']);
+               while($process = $this->dba->fetch($processes)) {
                        if (!posix_kill($process['pid'], 0)) {
-                               self::deleteByPid($process['pid']);
+                               $this->deleteByPid($process['pid']);
                        }
                }
-               DBA::close($processes);
-               DBA::commit();
+               $this->dba->close($processes);
+               $this->dba->commit();
        }
 }
index bd06c40..d73ed1d 100644 (file)
@@ -22,6 +22,7 @@
 namespace Friendica\Module;
 
 use Friendica\BaseModule;
+use Friendica\Core\Process;
 use Friendica\Core\System;
 use Friendica\Core\Worker as WorkerCore;
 use Friendica\Database\DBA;
@@ -57,7 +58,7 @@ class Worker extends BaseModule
                        return;
                }
 
-               WorkerCore::startProcess();
+               DI::process()->start();
 
                DI::logger()->notice('Front end worker started.', ['pid' => getmypid()]);
 
@@ -79,7 +80,7 @@ class Worker extends BaseModule
 
                WorkerCore::unclaimProcess();
 
-               WorkerCore::endProcess();
+               DI::process()->end();
 
                System::httpExit(200, 'Frontend worker stopped.');
        }