2017-10-11 187 views
1

我在Cron启动的Symfony应用程序中有一个命令。我希望能够限制在我的服务器上同时执行的实例数,假设有4个实例。我对如何做到这一点没有任何线索。我发现如何锁定命令以仅启动一次命令并等待它完成,但我不知道如何启动多个命令并无论如何限制实例的数量。 你有想法吗?Symfony命令实例的限制数量

回答

0

你可以用它认为被增加的计数器的命令开始运行,并降低它它完成之前,当一个共享计数器文件。

另一个解决方案是检查进程列表像这样的东西:

$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; 
} 
0

您可以创建你的cron或主管执行的“启动命令”。

这个Symfony commad可以启动您的服务器上的process component实例。您还可以检查您想要检查的任何内容,并执行您想要执行的任何操作,例如exec php功能。

0

你在找什么是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_*