【问题标题】:Limit number of instances of Symfony Command限制 Symfony 命令的实例数
【发布时间】:2017-10-11 18:03:58
【问题描述】:

我的 Symfony 应用程序中有一个由 Cron 启动的命令。我希望能够限制在我的服务器上同时执行的实例数,比如说 4 个实例。我不知道如何做到这一点。我找到了如何锁定命令以仅启动一次命令并等待它完成,但我不知道如何启动多个并限制实例数量。 你有什么想法吗?

【问题讨论】:

    标签: symfony cron symfony-console


    【解决方案1】:

    您要查找的是semaphore

    目前有一个LockComponent 计划用于 3.4(从 3.3 中删除)。这是对FilesystemComponent 中的LockHandler 的重大改进。

    在紧要关头,您可能可以从LockHandler 中汇集固定数量的锁。我不推荐它,因为它在文件系统上使用flock。这将锁定限制为单个服务器。此外,flock 在某些系统上可能仅限于进程范围。

    <?php
    
    use Symfony\Component\Filesystem\LockHandler;
    
    define('LOCK_ID', 'some-identifier');
    define('LOCK_MAX', 5);
    
    $lockPool = [];
    
    for ($i = 0; $i <= LOCK_MAX;) {
        $lockHandle = sprintf('%s-%s.lock', LOCK_ID, ++$i);
        $lockPool[$i] = new LockHandler($lockHandle);
    }
    
    $activeLock = null;
    $lockTimeout = 60 * 1000;
    
    $lockWaitStart = microtime(true);
    while(!$activeLock) {
        foreach ($lockPool as $lockHandler) {
            if ($lockHandler->lock()) {
                $activeLock = $lockHandler;
                break 2;
            }
        }
    
        if ($lockTimeout && ($lockTimeout > microtime(true) - $lockWaitStart)) {
            break;
        }
    
        // Randomly wait between 0.1ms and 10ms
        usleep(mt_rand(100, 10000));
    }
    

    一个更好、更有效的解决方案是使用信号量扩展并与ftokshm_*sem_* 一起发挥作用。

    【讨论】:

      【解决方案2】:

      我建议您使用过程控制系统作为主管。它使用起来非常简单,您可以选择启动多少个脚本实例。

      http://supervisord.org/

      【讨论】:

        【解决方案3】:

        您可以使用一个共享计数器文件,该文件包含一个计数器,该计数器在命令开始运行时增加并在完成之前减少它。

        另一种解决方案是检查进程列表,如下所示:

        $processCount = exec('ps aux | grep "some part of the console command you run" | grep -v "grep" | wc -l' );
        if(!empty($processCount) && $processCount >= X) {
            return false;
        }
        

        【讨论】:

          【解决方案4】:

          您可以创建一个由您的 cron 或主管执行的“启动器命令”。

          这个 Symfony 逗号可以在您的服务器上使用 process component 启动您的实例。您还可以检查您想要检查的任何内容并执行您想要执行的所有操作,例如 exec php 函数。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-08-08
            • 2017-06-12
            • 1970-01-01
            相关资源
            最近更新 更多