Cron에서 시작한 Symfony 응용 프로그램에 명령이 있습니다. 내 서버에서 동시에 실행되는 인스턴스의 수를 제한 할 수 있기를 원합니다. 인스턴스 4 개를 예로 들어 봅시다. 나는 이것을하는 방법에 어떤 단서도 없다. 명령을 한 번만 실행하고 완료 될 때까지 기다리는 명령을 잠그는 방법을 찾았지만 둘 이상을 시작하고 어쨌든 인스턴스 수를 제한하는 방법을 알지 못합니다. 아이디어가 있으십니까?Symfony 명령의 인스턴스 수 제한
1
A
답변
0
감독관으로서 공정 제어 시스템을 사용하는 것이 좋습니다. 꽤 사용하기 쉽고 시작하는 스크립트의 인스턴스 수를 선택할 수 있습니다.
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에서 가져옴)이 있습니다. 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));
}
는 훨씬 더 효율적인 솔루션은 세마포어 확장자를 사용하고 ftok
, shm_*
및 sem_*
와 함께 몇 가지 마술을하는 것입니다.