Esempio n. 1
0
 public function testLoggerNDC()
 {
     $logger = new Logger('testLogger');
     $layout = new LayoutSimple();
     $this->assertSame('testLogger [INFO] - test message' . PHP_EOL, $layout->formatMessage($logger, Logger::INFO, 'test message'));
     LoggerNDC::push('stack1');
     $this->assertSame('testLogger [INFO] stack1 - test message' . PHP_EOL, $layout->formatMessage($logger, Logger::INFO, 'test message'));
     LoggerNDC::push('stack2');
     $this->assertSame('testLogger [INFO] stack1 stack2 - test message' . PHP_EOL, $layout->formatMessage($logger, Logger::INFO, 'test message'));
     LoggerNDC::pop();
     $this->assertSame('testLogger [INFO] stack1 - test message' . PHP_EOL, $layout->formatMessage($logger, Logger::INFO, 'test message'));
     LoggerNDC::pop();
     $this->assertSame('testLogger [INFO] - test message' . PHP_EOL, $layout->formatMessage($logger, Logger::INFO, 'test message'));
 }
Esempio n. 2
0
 public function run()
 {
     $this->reinit();
     $processorPid = posix_getpid();
     $this->childrenInfo = [];
     try {
         Logger::getLogger('queue')->info('Begin');
         $this->beforeRun();
         $this->workersQty = 0;
         $this->freeWorkersNumbers = range(0, $this->maxWorkersQty - 1);
         $lastReinitTime = time();
         $waitPidAttemptQty = 0;
         while (true) {
             $this->getSignalHandler()->dispatch();
             if ($lastReinitTime + 15 < time()) {
                 $this->reinit();
                 $lastReinitTime = time();
             }
             $this->changeStatusFile();
             if ($this->workersQty) {
                 $this->processSignalChild();
             }
             if ($this->terminate) {
                 $this->terminate(array_keys($this->childrenInfo));
                 break;
             }
             if ($this->workersQty >= $this->maxWorkersQty) {
                 // логируем не на каждый шаг в цикле
                 if ($waitPidAttemptQty % 100 === 0) {
                     Logger::getLogger('queue')->debug('workersQty is max, wait');
                 }
                 usleep(10000);
                 ++$waitPidAttemptQty;
                 continue;
             }
             $waitPidAttemptQty = 0;
             if ($this->queuesEmpty($this->queues)) {
                 Logger::getLogger('queue')->info('Tasks not found, sleep');
                 usleep(2000000);
                 continue;
             }
             $queueNick = $this->getNextQueueNick();
             if ($queueNick === null) {
                 usleep(10000);
                 continue;
             }
             Logger::getLogger('queue')->debug("queue nick for next worker: {$queueNick}");
             $queue = $this->queues[$queueNick];
             $tasksForWorker = $queue->sliceTasksForWorker();
             Logger::getLogger('queue')->trace('Count tasks for worker: ' . count($tasksForWorker));
             $workerNumber = array_pop($this->freeWorkersNumbers);
             $pid = $this->fork();
             if ($pid) {
                 $this->childrenInfo[$pid] = ['workerNumber' => $workerNumber, 'queueNick' => $queueNick];
                 ++$this->workersQty;
                 ++$this->queuesInfo[$queueNick]['activeWorkersQty'];
                 Logger::getLogger('queue')->debug("worker running, workersQty={$this->workersQty},queue={$queueNick},activeWorkersQty={$this->queuesInfo[$queueNick]['activeWorkersQty']}");
             } else {
                 LoggerMDC::put('queueNick', $queueNick);
                 LoggerMDC::put('processorPid', $processorPid);
                 LoggerMDC::put('workerPid', posix_getpid());
                 LoggerNDC::push('worker');
                 $code = 0;
                 try {
                     $worker = $queue->getWorker();
                     $worker->setNumber($workerNumber);
                     $worker->run($tasksForWorker);
                 } catch (Exception $exception) {
                     Logger::getLogger('queue')->error('Exception in worker', $exception);
                     $code = 255;
                 }
                 LoggerNDC::pop();
                 $this->end($code);
             }
         }
     } catch (Exception $exception) {
         Logger::getLogger('queue')->error('Exception in processor', $exception);
         $this->terminate(array_keys($this->childrenInfo));
         throw $exception;
     }
 }