我有一项服务,可以从自定义命令和HTML页面中使用。我想防止并行执行服务。对于命令,有执行此操作的Lock组件。但是对于控制器方法是否可以实现相同的目的?
如果从控制器调用服务,则锁组件不起作用:
$store = new FlockStore(sys_get_temp_dir());
$factory = new Factory($store);
$lock = $factory->createLock('MY_SERVICE');
我想避免从控制器调用命令(这就是我创建服务的原因),主要是因为该服务对于HTML页面和CLI没有相同的输出。
答案 0 :(得分:3)
将锁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();
}
}
}
答案 1 :(得分:0)
我说:
如果从控制器调用服务,则锁组件不起作用:
实际上,我遇到的问题是单线程的Symfony内置dev服务器,因此,在CLI PHP是多线程的情况下,不能并行执行请求。我无法通过开发服务器并行运行脚本,请求已排队,服务脚本从未锁定。
无论是从命令还是从控制器调用,锁定组件都可以正常工作。
在服务中使用像这样的锁可以正常工作:
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();
}