2011-07-06 67 views
6

我想從bash腳本啓動〜10個php進程。當其中一個完成時,我希望bash腳本啓動另一個php進程,並且無限期地繼續,總是有〜10個php進程運行。使用Bash腳本並行化PHP進程?

這樣做的最簡單方法是什麼?

每次啓動的php文件都是相同的,但php進程會知道從數據庫中提取新值,因此每次都會處理新數據。我需要啓動的文件以及它的所有類都已經用php編寫。

回答

10

似乎很適合superivisord。以下配置將確保10個進程始終處於運行狀態,並處理日誌循環,這也很方便。所有輸出(包括stderr)都將寫入/var/log/worker.log。使用「autorestart = true」,supervisord會在退出後立即替換子進程。

[program:worker] 
command=php /path/to/worker.php 
process_name=%(program_name)s_%(process_num)d 
stdout_logfile=/var/log/%(program_name)s.log 
redirect_stderr=true 
stdout_capture_maxbytes=512MB 
stdout_logfile_backups=3 
numprocs=10 
numprocs_start=0 
autostart=true 
autorestart=true 

一旦你有了到位(通常/etc/supervisord/conf.d)主管的配置,你可以使用supervisorctl作爲一種方便的方式來啓動和停止的進程組。

$ supervisorctl start worker 
... 
$ supervisorctl stop worker 
... 
$ supervisorctl status 
worker:worker_0    RUNNING pid 8985, uptime 0:09:24 
worker:worker_1    RUNNING pid 10157, uptime 0:08:52 
... 
worker:worker_9    RUNNING pid 12459, uptime 0:08:31 
+1

這工作很好,只花了幾個小時才能與其他一些功能一起工作。謝謝。 –

0
[email protected]:/tmp$ cat test.sh 
#!/bin/sh 
set -m # monitor mode 
task="php-cgi /tmp/sleep.php" 
function do_task { 
$task >/dev/null & 
echo -n spawned $! ' ' >&2 
} 
trap do_task SIGCHLD 
for i in $(seq 1 10); do 
do_task 
done 
while true; do 
wait 
done 

[email protected]:/tmp$ cat sleep.php 
<?php sleep(3); ?> 
1

你可以使用這樣的東西。使用一個文件啓動10(僅運行一次),每個文件的底部可以在完成時重新啓動。

/** 
* Asynchronously execute/include a PHP file. Does not record the output of the file anywhere. 
* 
* @param string $filename  file to execute, relative to calling script (or root?) 
* @param string $options  (optional) arguments to pass to file via the command line 
*/ 
function asyncInclude($filename, $options = '') { 
    exec("/path/to/php -f {$filename} {$options} >> /dev/null &"); 
} 
2

你可以使用GNU並行,管道圖片列表中所描述的here管理爲parallel