有没有办法防止在 Symfony 4 中多次执行控制器方法?
Is there a way to prevent multiple executions of controller method in Symfony 4?
我有一项服务,可以通过自定义命令和 HTML 页面使用。我想防止并行多次执行该服务。对于命令,有执行该操作的 Lock 组件。但是控制器方法是否有可能实现同样的事情?
如果从控制器调用服务,锁定组件将不起作用:
$store = new FlockStore(sys_get_temp_dir());
$factory = new Factory($store);
$lock = $factory->createLock('MY_SERVICE');
我想避免从控制器调用命令(这就是我创建服务的原因),主要是因为该服务对 HTML 页面和 CLI 没有相同的输出。
直接将锁 Factory 注入您的服务,而不是在命令和控制器中创建锁。
首先你必须安装锁定组件:
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();
}
}
}
我说:
The lock component doesn't work if the service is called from a controller:
实际上我遇到的问题是 Symfony 内置开发服务器是单线程的,因此无法并行执行请求,而 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();
}
我有一项服务,可以通过自定义命令和 HTML 页面使用。我想防止并行多次执行该服务。对于命令,有执行该操作的 Lock 组件。但是控制器方法是否有可能实现同样的事情?
如果从控制器调用服务,锁定组件将不起作用:
$store = new FlockStore(sys_get_temp_dir());
$factory = new Factory($store);
$lock = $factory->createLock('MY_SERVICE');
我想避免从控制器调用命令(这就是我创建服务的原因),主要是因为该服务对 HTML 页面和 CLI 没有相同的输出。
直接将锁 Factory 注入您的服务,而不是在命令和控制器中创建锁。
首先你必须安装锁定组件:
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();
}
}
}
我说:
The lock component doesn't work if the service is called from a controller:
实际上我遇到的问题是 Symfony 内置开发服务器是单线程的,因此无法并行执行请求,而 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();
}