Symfony锁组件不会锁定生产

时间:2018-01-04 22:38:51

标签: php symfony locking symfony-3.4

我升级到Symfony 3.4。*以利用新的锁定组件。然而,它似乎在开发中工作,但在生产锁定总是获得。这是我的代码:

BaseCommandWrapper:

<?php
namespace CoreBundle\Command;

ini_set('max_execution_time', 3600); 

use Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand;
use Symfony\Component\Lock\Factory;
use Symfony\Component\Lock\Store\SemaphoreStore;

use Symfony\Component\Console\Command\LockableTrait;

class BaseCommandWrapper extends ContainerAwareCommand {

    use LockableTrait;

    function start($commandName) {

        $this->commandName = $commandName;

        $store = new SemaphoreStore();
        $factory = new Factory($store);

        $this->lock = $factory->createLock($this->commandName);

        if (!$this->lock->acquire()) {
            echo 'This command is already running in another process.' . PHP_EOL;
            return false;
        }

        echo "Lock aquired" . PHP_EOL;

        return $this->lock;
    }

    function stop() {

        echo "Releasing lock" . PHP_EOL;

        $this->lock->release();

    }

}


?>

命令本身:

class SomeCommand extends BaseCommandWrapper
{
    protected function configure()
    {
        $this
            ->setName('processSomeCommand')
            ->setDescription('Process Some Command')
        ;
    }

    protected function execute(InputInterface $input, OutputInterface $output)
    {

        if ($this->start($this->getName()) === false) {
            return 0;
        } 

        sleep(60);

        $this->stop();

    }

所有命令都由cron触发,在这种情况下每秒触发一次。

1 个答案:

答案 0 :(得分:0)

它可能链接到systemd RemoveIPC参数:

RemoveIPC = 控制系统V和POSIX IPC对象是否属于 用户完全注销后,将删除该用户。需要一个 布尔参数。如果启用,则用户可能不会使用IPC 用户的最后一个会话终止后的资源。这个 涵盖System V信号量,共享内存和消息队列,如下 以及POSIX共享内存和消息队列。注意IPC 根用户和其他系统用户的对象被排除在外 此设置的效果。默认为“是”。

如果您使用的是systemd,则每次cron结束时,用户都会注销,然后systemd删除该信号灯。

  • 第一克朗获得了锁
  • 第二Cron无法获取锁,用户注销,信号量已删除
  • Thris Cron取得了锁,First Cron不再拥有它。

in this thread所述,您可以在服务器上禁用RemoveIPC,或者使用系统用户来避免这种情况。或者如您在评论中所说:使用其他商店。

最有可能,您应该得到警告:

PHP警告:sem_remove():SysV信号量14071 [已编辑] 0096在第95行的[已编辑] /app/vendor/symfony/lock/Store/SemaphoreStore.php中不存在(不再存在)

其他人遇到了问题:in this thread,他们很可能应该将其添加到文档中。