2015-12-22 3 views

ответ

15

Вы можете использовать блокировку, чтобы гарантировать, что команда запускается только один раз за раз. Symfony предоставляет помощник LockHandler, но вы можете легко сделать это с помощью простого PHP.

use Symfony\Component\Console\Command\Command; 
use Symfony\Component\Console\Input\InputInterface; 
use Symfony\Component\Console\Output\OutputInterface; 
use Symfony\Component\Filesystem\LockHandler; 

class WhateverCommand extends Command 
{ 
    protected function configure() { } 

    protected function execute(InputInterface $input, OutputInterface $output) 
    { 
     $lock = new LockHandler('a_unique_id_for_your_command'); 
     if (!$lock->lock()) { 
      $output->writeln('This command is already running in another process.'); 

      return 0; 
     } 

     // ... do some task 

     $lock->release(); 
    } 
} 
+0

Обработчик замок как @Stefan предложил, безусловно, наиболее эффективным, так что вы избежать условий гонки и является масштабируемой, если вы хотите запустить несколько раз с различными идентификаторами или распространение данных. –

+0

Блестящий! Благодаря! – nikoss

+0

Мне нравится ваш код! И я не знал об этом - теперь я знаю, спасибо!) –