在 Symfony 4.4 上,我試圖在一個命令中建立一個鎖并讓它保持活動狀態,直到顯式釋放。閱讀檔案我知道這應該使用$autoRelease引數來獲得Symfony\Component\Lock\LockFactory::createLock(),但似乎即使我設定$autoRelease = false了腳本結束時自動釋放的鎖。
LockCommand
<?php
namespace App\Command;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Lock\LockFactory;
class LockCommand extends Command
{
const LOCK_NAME = "my_lock";
protected static $defaultName = 'app:lock';
private $lockFactory;
public function __construct(LockFactory $lockFactory)
{
$this->lockFactory = $lockFactory;
parent::__construct();
}
protected function configure()
{
$this
->setDescription("Enables/disables the lock.")
->addOption(
'release',
'r',
InputOption::VALUE_NONE,
'Releases the lock'
)
;
}
protected function execute(InputInterface $input, OutputInterface $output)
{
$lock = $this->lockFactory->createLock(self::LOCK_NAME, 300.0, false);
$release = $input->getOption('release');
if ($release) {
$lock->release();
} else {
$lock->acquire();
}
//sleep(300);
return 0;
}
}
LockVerifyCommand
<?php
namespace App\Command;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Lock\LockFactory;
class LockVerifyCommand extends Command
{
protected static $defaultName = 'app:lock-verify';
private $lockFactory;
public function __construct(LockFactory $lockFactory)
{
$this->lockFactory = $lockFactory;
parent::__construct();
}
protected function execute(InputInterface $input, OutputInterface $output)
{
$lock = $this->lockFactory->createLock(LockCommand::LOCK_NAME, 300.0, false);
$status = $lock->acquire() ? "no" : "yes";
$output->writeln("Locked? $status");
return 0;
}
}
我希望能夠
- 啟用鎖
php bin/console app:lock php bin/console app:lock-verify應該說Locked? yes- 直到我釋放鎖
php bin/console app:lock --release
這僅在app:lock命令運行時發生。
uj5u.com熱心網友回復:
這里最重要的是LockStore. 取決于你選擇哪一個可能意味著很多不同。
例如,如果我沒記錯的話,LockStore 是SemaphoreStore默認的。你可以在GitHub 上查找代碼,但主要需要注意的是它使用了 PHP 的ext-semaphore擴展(即sem_*函式)。查看 PHP 的檔案頁面sem_acquire,它說:
處理完一個請求后,行程獲取到但未顯式釋放的任何信號量都會自動釋放并產生警告。
換句話說,鎖在主行程結束后不會被持久化。
也是如此FileStore,盡管完全由作業系統來釋放鎖,這可能會變得混亂。
您需要的是一些持久性存盤,例如PdoStore, DoctrineDbalStore,RedisStore或其他東西。
請注意,某些商店會自動過期鎖。您可以在官方檔案頁面中閱讀更多相關資訊:Expiring Locks
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/507517.html
標籤:php 交响乐 锁定 symfony-4.4
