我想從bash腳本啓動〜10個php進程。當其中一個完成時,我希望bash腳本啓動另一個php進程,並且無限期地繼續,總是有〜10個php進程運行。使用Bash腳本並行化PHP進程?
這樣做的最簡單方法是什麼?
每次啓動的php文件都是相同的,但php進程會知道從數據庫中提取新值,因此每次都會處理新數據。我需要啓動的文件以及它的所有類都已經用php編寫。
我想從bash腳本啓動〜10個php進程。當其中一個完成時,我希望bash腳本啓動另一個php進程,並且無限期地繼續,總是有〜10個php進程運行。使用Bash腳本並行化PHP進程?
這樣做的最簡單方法是什麼?
每次啓動的php文件都是相同的,但php進程會知道從數據庫中提取新值,因此每次都會處理新數據。我需要啓動的文件以及它的所有類都已經用php編寫。
似乎很適合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
[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); ?>
你可以使用這樣的東西。使用一個文件啓動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 &");
}
你可以使用GNU並行,管道圖片列表中所描述的here管理爲parallel
。
這工作很好,只花了幾個小時才能與其他一些功能一起工作。謝謝。 –