]> git.mxchange.org Git - friendica.git/blobdiff - src/Core/Worker.php
Coding standards
[friendica.git] / src / Core / Worker.php
index 619cb5bfa32957d73ed9ec780c4cdeb9599c0ddc..f21513f33c33c72f2f71cae0b91189b5bdda1577 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * @copyright Copyright (C) 2020, Friendica
+ * @copyright Copyright (C) 2010-2021, the Friendica project
  *
  * @license GNU AGPL version 3 or any later version
  *
@@ -311,6 +311,10 @@ class Worker
                }
 
                $argv = json_decode($queue['parameter'], true);
+               if (!is_array($argv)) {
+                       $argv = [];
+               }
+
                if (!empty($queue['command'])) {
                        array_unshift($argv, $queue['command']);
                }
@@ -1085,95 +1089,6 @@ class Worker
                self::$db_duration_write += (microtime(true) - $stamp);
        }
 
-       /**
-        * Call the front end worker
-        *
-        * @return void
-        * @throws \Friendica\Network\HTTPException\InternalServerErrorException
-        */
-       public static function callWorker()
-       {
-               if (!DI::config()->get("system", "frontend_worker")) {
-                       return;
-               }
-
-               $url = DI::baseUrl() . '/worker';
-               DI::httpRequest()->fetch($url, 1);
-       }
-
-       /**
-        * Call the front end worker if there aren't any active
-        *
-        * @return void
-        * @throws \Friendica\Network\HTTPException\InternalServerErrorException
-        */
-       public static function executeIfIdle()
-       {
-               self::checkDaemonState();
-
-               if (!DI::config()->get("system", "frontend_worker")) {
-                       return;
-               }
-
-               // Do we have "proc_open"? Then we can fork the worker
-               if (function_exists("proc_open")) {
-                       // When was the last time that we called the worker?
-                       // Less than one minute? Then we quit
-                       if ((time() - DI::config()->get("system", "worker_started")) < 60) {
-                               return;
-                       }
-
-                       DI::config()->set("system", "worker_started", time());
-
-                       // Do we have enough running workers? Then we quit here.
-                       if (self::tooMuchWorkers()) {
-                               // Cleaning dead processes
-                               self::killStaleWorkers();
-                               DI::modelProcess()->deleteInactive();
-
-                               return;
-                       }
-
-                       self::runCron();
-
-                       Logger::info('Call worker');
-                       self::spawnWorker();
-                       return;
-               }
-
-               // We cannot execute background processes.
-               // We now run the processes from the frontend.
-               // This won't work with long running processes.
-               self::runCron();
-
-               self::clearProcesses();
-
-               $workers = self::activeWorkers();
-
-               if ($workers == 0) {
-                       self::callWorker();
-               }
-       }
-
-       /**
-        * Removes long running worker processes
-        *
-        * @return void
-        * @throws \Friendica\Network\HTTPException\InternalServerErrorException
-        */
-       public static function clearProcesses()
-       {
-               $timeout = DI::config()->get("system", "frontend_worker_timeout", 10);
-
-               /// @todo We should clean up the corresponding workerqueue entries as well
-               $stamp = (float)microtime(true);
-               $condition = ["`created` < ? AND `command` = 'worker.php'",
-                               DateTimeFormat::utc("now - ".$timeout." minutes")];
-               DBA::delete('process', $condition);
-               self::$db_duration = (microtime(true) - $stamp);
-               self::$db_duration_write += (microtime(true) - $stamp);
-       }
-
        /**
         * Runs the cron processes
         *
@@ -1232,19 +1147,26 @@ class Worker
                }
 
                // We now are in the new worker
+               $pid = getmypid();
+
                DBA::connect();
                /// @todo Reinitialize the logger to set a new process_id and uid
-               
-               self::IPCSetJobState(true, getmypid());
-               Logger::info('Worker spawned', ['pid' => getmypid()]);
+               DI::process()->setPid($pid);
+
+               $cycles = 0;
+               while (!self::IPCJobsExists($pid) && (++$cycles < 100)) {
+                       usleep(10000);
+               }
+
+               Logger::info('Worker spawned', ['pid' => $pid, 'wait_cycles' => $cycles]);
 
                self::processQueue($do_cron);
 
                self::unclaimProcess();
 
-               self::IPCSetJobState(false, getmypid());
+               self::IPCSetJobState(false, $pid);
                DI::process()->end();
-               Logger::info('Worker ended', ['pid' => getmypid()]);
+               Logger::info('Worker ended', ['pid' => $pid]);
                exit();
        }