2011-07-06 25 views
6

Quiero iniciar ~ 10 procesos php desde un script bash. Cuando uno de ellos termine, me gustaría que el script bash inicie otro proceso de php, y continúe indefinidamente, siempre teniendo ~ 10 procesos de PHP ejecutándose.¿Paralelizar procesos PHP con un script Bash?

¿Cuál es la forma más sencilla de hacer esto?

El archivo php lanzado será el mismo siempre, pero el proceso php sabrá extraer nuevos valores de la base de datos, por lo que procesará nuevos datos cada vez. El archivo que necesito iniciar y todas sus clases ya están escritas en php.

Respuesta

10

Parece una buena opción para superivisord. La siguiente configuración asegurará que 10 procesos estén siempre en ejecución, y se ocupa de la rotación de registros, que también es útil. Todos los resultados, incluido stderr, se escribirán en /var/log/worker.log. Con "autorestart = true", supervisord reemplazará un proceso secundario tan pronto como se cierre.

[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 

Una vez que tenga la configuración supervisora ​​en su lugar (por lo general /etc/supervisord/conf.d), puede utilizar supervisorctl como una manera conveniente para iniciar y detener el grupo de procesos.

$ 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

esto funcionó maravillosamente y solo tomó unas pocas horas para trabajar con un montón de otras características. Gracias. –

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

Podría usar algo como esto. Use un archivo para iniciar 10 (solo ejecute esto una vez) y la parte inferior de cada archivo podría reiniciarse cuando termine.

/** 
* 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

Usted podría utilizar GNU en paralelo, una tubería de la lista de imágenes para gestionar en parallel como se describe here.

Cuestiones relacionadas