2010-09-24 41 views
4

在我的PHP Web应用程序中,我试图限制运行的CPU /内存密集型进程的数量(例如,ImageMagick的'convert'命令)。我有许多执行各种脚本的crons作业,这些脚本可能会执行这些CPU /内存密集型进程的太多实例。如何限制进程数量?

在我试图限制这些进程时,首先检查我的系统是否已经运行了一定数量的进程。功能:

function has_reached_process_limit($process, $limit) 
{ 
    $command = 'ps -eo comm | grep ' . $process; 
    exec($command, $output, $return); 
    if (count($output) > $limit) 
    { 
     return TRUE; 
    } 
    else 
    { 
     return FALSE; 
    } 
} 

所以,我跑是这样的:

while (has_reached_process_limit('convert', 5) === TRUE) 
{ 
    // loop over 
} 

的问题是,当我监视我的OS的资源(通过‘顶’命令),我看到很多更进程比我预期的要多。任何想法为什么?

+0

什么是这些很多更多的过程,你指的是?例子? – codaddict 2010-09-24 12:07:05

+0

我认为这是因为'ps'也显示线程和叉子。因此,如果其中一个imagemagick进程使用3个线程,它将显示3次。这可能是问题所在,但我不确定你会如何解决它。说实话,请回答下面的答案,并有一个工作队列。 – ryeguy 2010-09-24 19:05:28

回答

2

我认为更好的方法将是一个工作控制器或工作岗位... 但是,如果这不可能为你,因为你的东西是如此分离你的方法deoesnt看起来很糟糕。但我可以从这里告诉你的ps命令应该总是返回“php”maby更好地检查执行的文件或用户或其他东西?

你在说什么很多其他过程? PHP进程?他们看起来像什么,执行?你也可以看看这个链接http://www.php.net/manual/en/function.sem-get.php

0

对于这个用例PHP有信号灯扩展

resource sem_get (int $key [, int $max_acquire = 1 [, int $perm = 0666 [, int $auto_release = 1 ]]])

http://www.php.net/manual/en/function.sem-get.php

我认为这可能fullfill您的需求,但信号不是日常扩展,使我可能是,你需要通过--enable-sysvsem开关安装这个开关在PHP