This component relies on PHP flock() function. Application configuration example: [ 'components' => [ 'mutex' => [ 'class' => 'yii\mutex\FileMutex' ], ], ] Note: this component can maintain the locks only for the single web server, it probably will not suffice to your in case you are using cloud server solution. Warning: due to flock() function nature this component is unreliable when using a multithreaded server API like ISAPI.
См. также: Mutex
С версии: 2.0
Автор: resurtm (resurtm@gmail.com)
Наследование: extends Mutex
 public function actionProcess()
 {
     $mutex = new FileMutex();
     if ($mutex->acquire(self::LOCK_NAME) == false) {
         Console::output("Another process is already running, exit");
         return self::EXIT_CODE_NORMAL;
     }
     /** @var ActiveQuery $exportRequests */
     $requestsQuery = ExportRequest::find()->where(['is_exported' => 0])->orderBy(['created_at' => SORT_ASC]);
     try {
         foreach ($requestsQuery->each() as $exportRequest) {
             /** @var ExportRequest $exportRequest */
             echo "[#" . $exportRequest->id . ": " . $exportRequest->created_at . "] - ...";
             $this->processExportRequest($exportRequest);
             $memoryPeak = round(memory_get_peak_usage() / 1024 / 1024, 2);
             $memory = round(memory_get_usage() / 1024 / 1024, 2);
             echo "\r[#" . $exportRequest->id . ": " . $exportRequest->created_at . "] [Mem: {$memoryPeak}Mb/{$memory}Mb] - Success!\n";
         }
     } catch (\Exception $e) {
         $mutex->release(self::LOCK_NAME);
         throw $e;
     }
     $mutex->release(self::LOCK_NAME);
     return self::EXIT_CODE_NORMAL;
 }
Пример #2
0
 public function acquireLock($name, $timeout = 0)
 {
     $result = parent::acquireLock($name, $timeout);
     if ($result) {
         $this->_names[] = $name;
     }
     return $result;
 }
 public function actionSend($status = Mail::STATUS_WAITING)
 {
     $mutex = new FileMutex();
     if ($mutex->acquire(__CLASS__) === false) {
         $this->stdout("Another instance is running...\n");
         return self::EXIT_CODE_NORMAL;
     }
     $mailsQuery = Mail::find()->where(['status' => $status])->orderBy('created_at ASC');
     foreach ($mailsQuery->each() as $mail) {
         /** @var Mail $mail */
         $this->stdout("Sending mail #{$mail->id}\n");
         $counter = 0;
         $mail->on(Mail::EVENT_SINGLE_MAIL_SENT, function () use(&$counter) {
             $counter++;
             $this->stdout("  sent " . $counter . "\r");
         });
         $mail->send();
         $this->stdout("\n");
     }
     $mutex->release(__CLASS__);
     return self::EXIT_CODE_NORMAL;
 }