Есть ли способ предотвратить многократное выполнение метода контроллера в Symfony 4? - PullRequest
1 голос
/ 02 мая 2019

У меня есть сервис, который я использую как из пользовательской команды, так и со страницы HTML.Я хочу предотвратить параллельное выполнение нескольких сервисов.Для команды есть компонент Lock, который это делает.Но возможно ли добиться того же самого для метода контроллера?

Компонент блокировки не работает, если служба вызывается из контроллера:

    $store = new FlockStore(sys_get_temp_dir());
    $factory = new Factory($store);
    $lock = $factory->createLock('MY_SERVICE');

Я хотел избежать вызовакоманда от контроллера (именно поэтому я и создал службу) главным образом потому, что служба не имеет одинакового вывода для страницы HTML и интерфейса командной строки.

Ответы [ 2 ]

3 голосов
/ 02 мая 2019

Внедрите блокировку Factory в ваш сервис напрямую, вместо того, чтобы создавать блокировку в команде AND в контроллере.

Сначала необходимо установить компонент блокировки:

composer require symfony/lock

Затем, например, вы можете объявить свой сервис следующим образом:

use Symfony\Component\Lock\Factory as LockFactory;

class MyService {
    private $lock;

    public function __construct(LockFactory $lockFactory) {
        $this->lock = $lockFactory->createLock('LOCK_KEY');
    }

    public function doWork() {
        $this->lock->acquire();

        try {
            // DO THINGS
        } finally {
            $this->lock->release();
        }
    }
}
0 голосов
/ 02 мая 2019

Я сказал:

Компонент блокировки не работает, если служба вызывается из контроллера:

На самом деле проблема, с которой я столкнулся, заключалась в том, что встроенный dev-сервер Symfony был однопоточным, поэтому запросы не могли выполняться параллельно, в то время как CLI PHP многопоточный. Я не смог запустить скрипт параллельно через сервер dev, запрос был поставлен в очередь, служебный скрипт никогда не блокировался.

Компонент блокировки работает одинаково, независимо от того, вызывается ли он из команды или из контроллера.

Использование блокировки в сервисе так работает:

    use Symfony\Component\Lock\Factory;
    use Symfony\Component\Lock\Store\FlockStore;

    $store = new FlockStore(sys_get_temp_dir());
    $factory = new Factory($store);

    $lock = $factory->createLock('LOCK_KEY');

    if ($lock->acquire()) {
        //some locked code
       $lock->release();
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...