2017-10-11 391 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_*