2017-10-11 6 views
1

Cron에서 시작한 Symfony 응용 프로그램에 명령이 있습니다. 내 서버에서 동시에 실행되는 인스턴스의 수를 제한 할 수 있기를 원합니다. 인스턴스 4 개를 예로 들어 봅시다. 나는 이것을하는 방법에 어떤 단서도 없다. 명령을 한 번만 실행하고 완료 될 때까지 기다리는 명령을 잠그는 방법을 찾았지만 둘 이상을 시작하고 어쨌든 인스턴스 수를 제한하는 방법을 알지 못합니다. 아이디어가 있으십니까?Symfony 명령의 인스턴스 수 제한

답변

0

감독관으로서 공정 제어 시스템을 사용하는 것이 좋습니다. 꽤 사용하기 쉽고 시작하는 스크립트의 인스턴스 수를 선택할 수 있습니다.

http://supervisord.org/

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

당신은 당신의 크론 또는 관리자에 의해 실행 "실행 명령"을 만들 수 있습니다.

이 심포니 commad는 서버에서 process component으로 인스턴스를 시작할 수 있습니다. 확인하려는 내용을 확인하고 exec PHP 기능처럼 원하는 모든 작업을 수행 할 수도 있습니다.

0

당신이 찾고있는 것은 semaphore입니다.

현재 3.4 용으로 예약 된 LockComponent (3.3에서 가져옴)이 있습니다. FilesystemComponentLockHandler에 비해 크게 개선되었습니다.

핀치가있는 경우 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)); 
} 

는 훨씬 더 효율적인 솔루션은 세마포어 확장자를 사용하고 ftok, shm_*sem_*와 함께 몇 가지 마술을하는 것입니다.