2017-10-11 12 views
1

私はCronによって起動された私のSymfonyアプリケーションにコマンドを持っています。サーバー上で同時に実行されるインスタンスの数を制限できるようにしたいとしましょう。私はこれを行う方法の手がかりを持っていません。コマンドを一度だけ起動して終了するまでロックする方法を見つけましたが、複数のインスタンスを起動してインスタンスの数を制限する方法はわかりません。 アイデアはありますか?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

別の解決策は、このようなもので、プロセスのリストをチェックすることになります。

このsymfonyの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)); 
} 

ははるかに良いと効率的なソリューションは、セマフォ拡張子を使用してftokshm_*sem_*でいくつかの魔法を動作するようになります。

関連する問題