Ejemplo n.º 1
0
 function run($options = array())
 {
     $this->init($options);
     if ($poolPid = $this->shm->get(0)) {
         $this->logger->debug("Get process pool pid from shm. pid: '{$poolPid}'");
     } else {
         $poolPid = 0;
     }
     if ($this->poolIsRunning($poolPid)) {
         $this->logger->info(sprintf("Cronjob '%s' is already running (pid: %d)", $this->jobName, $poolPid));
         if ($this->worker) {
             $this->logger->info("Enqueue work...");
             $queue = $this->processPool->workQueue;
             if (($cap = $queue->capacity()) && $this->config['waitPrevComplete']) {
                 $this->logger->warn(sprintf("Another cronjob is not complete (%d pending tasks)", $cap));
                 return;
             }
             // Enqueue tasks
             $this->worker->enqueueWork($queue);
             posix_kill($poolPid, SIGUSR1);
         }
         return;
     }
     $this->processPool->start();
 }
Ejemplo n.º 2
0
 public function valid()
 {
     sem_acquire($this->sem());
     try {
         $meta = $this->shm->get(0);
         $ret = $meta["pos"] < $meta["count"];
         sem_release($this->sem());
         return $ret;
     } catch (Exception $e) {
         sem_release($this->sem());
         throw $e;
     }
 }
Ejemplo n.º 3
0
 protected function handleChildEvents($nmess = null)
 {
     $i = 0;
     while ($message = $this->childEventQueue->peek()) {
         $t1 = microtime(true);
         $this->logger->debug(sprintf("Peeked '%s' from event queue", $message["type"]));
         switch ($message["type"]) {
             case "beforeHandleWork":
                 $this->childs[$message["pid"]]["workStartTime"] = $message["microtime"];
                 $this->childs[$message["pid"]]["message"] = $message["message"];
                 break;
             case "afterHandleWork":
                 unset($this->childs[$message["pid"]]["workStartTime"]);
                 unset($this->childs[$message["pid"]]["message"]);
                 break;
             case "start":
                 if (!$this->ready) {
                     $this->shm->put(self::SHM_STARTUP_BARRIER, $this->shm->get(self::SHM_STARTUP_BARRIER) + 1);
                 } else {
                     $this->childs[$message["pid"]]["startTime"] = microtime(true);
                 }
                 break;
             case "memoryUsage":
                 if ($this->workerMemoryLimit && $message["memory"] > $this->workerMemoryLimit) {
                     $this->logger->info(sprintf("Worker %d allocates %d Kb. Maximum %d Kb is allowed by configuration", $message["pid"], $message["memory"], $this->workerMemoryLimit));
                     $this->terminateChild($message["pid"]);
                 }
                 break;
             default:
                 $this->logger->warn("Peeked unknown message from child event queue. " . "Serialized message: {$message}");
         }
         $this->logger->info("Child message handle: " . round(microtime(true) - $t1, 4) . " sec");
         $i++;
         if ($nmess && $i >= $nmess) {
             break;
         }
     }
 }
Ejemplo n.º 4
0
 private function getMeta()
 {
     $meta = $this->shm->get(0);
     $this->logger->debug("get meta (size: {$meta["size"]}, nextIndex: {$meta["nextIndex"]})");
     return $meta;
 }
Ejemplo n.º 5
0
 function onReady($pool)
 {
     $this->logger->info("[IPC] Store process pool (pid: {$this->processPool->getPid()}) in shm");
     $this->shm->put(0, $this->processPool->getPid());
     $this->logger->info("[IPC] Process pool PID check: " . $this->shm->get(0));
 }