我在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更新命令