2010-09-24 42 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