我在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
您可以創建你的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));
}
一個更好更有效的解決辦法是使用旗語延伸和工作的一些魔術ftok
,shm_*
和sem_*
。
相關問題
- 1. 如何限制EJB實例的數量?
- 2. 限制shell命令
- 3. 限制sed命令
- 4. 'git ls-remote'命令參數限制返回行的數量
- 5. 從限制類對象實例的數量給定的數字
- 6. R中的限制命令?
- 7. MongoDB的命令,並限制
- 8. 對SQL命令的限制
- 9. 限制Make的@echo命令
- 10. Solaris的命令行限制
- 11. AdMob實例限制
- 12. 根據表中實例的數量限制數據輸入
- 13. 停止Symfony的控制檯命令
- 14. 控制器與命令Symfony的2
- 15. 從Symfony 2測試用例運行控制檯命令
- 16. 將實例方法的參數限制爲實例的類型
- 17. Azure實例限制和大小限制
- 18. 我如何限制實例化對象的數量?
- 19. 限制不使用靜態變量創建類的實例數
- 20. 如何限制訪問實例的請求數量?
- 21. 如何限制IIS中WCF服務的實例數量?
- 22. 如何限制C++或JAVA中類的實例數量?
- 23. 限制MDI應用程序中窗口實例的數量
- 24. .NET - 限制執行單元的實例數量
- 25. ImageMagick命令行字符數限制
- 26. 命令限制時間
- 27. ZPL命令長度限制?
- 28. LEFT JOIN命令,限制
- 29. Philips Hue命令限制
- 30. 限制postgreSQL更新命令