Распараллеливание процессов PHP с помощью Bash Script? - PullRequest
6 голосов
/ 06 июля 2011

Я хочу запустить ~ 10 php-процессов из bash-скрипта.Когда один из них завершится, я бы хотел, чтобы bash-скрипт запускал другой процесс php и продолжал бесконечно, всегда имея ~ 10 процессов php.

Какой самый простой способ сделать это?

Каждый раз запускаемый php-файл будет одинаковым, но процесс php будет знать, что нужно извлечь новые значения из базы данных, поэтому он каждый раз обрабатывает новые данные.Файл, который мне нужно запустить, и все его классы уже написаны на php.

Ответы [ 4 ]

10 голосов
/ 06 июля 2011

Похоже, что подходит для 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

Как только вы установили конфигурацию supervisor (обычно /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
2 голосов
/ 06 июля 2011

Вы можете использовать GNU Parallel, передавая список изображений для управления в parallel, как описано здесь .

1 голос
/ 06 июля 2011

Вы можете использовать что-то вроде этого. Используйте один файл для запуска 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 &");
}
0 голосов
/ 06 июля 2011
jcomeau@intrepid:/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

jcomeau@intrepid:/tmp$ cat sleep.php
<?php sleep(3); ?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...