Ejecución de PHP en Segundo Plano


El día de hoy me tope con un problema poco común, necesitaba ejecutar varios cronjobs en forma paralela, pero luego recordé un comentario de un ex compañero de trabajo y me acordé que PHP no trabaja multihilos así como lo trabaja JAVA, pero investigando un poco, y haciendo unas pequeñas pruebas veo que si puede, se que no es procesamiento en paralelo pero funciona parecido.

Para poder ejecutar PHP en segundo plano solo es necesario redireccionar la respuesta a un archivo, así de esta manera no tenemos que esperar a la respuesta, veamos.

1. Creamos 4 archivos
touch /root/test/cronjob.php
touch /root/test/call1.php
touch /root/test/call2.php
touch /root/test/call3.php
touch /root/test/text.txt

2. Solo para asegurarnos que podemos ejecutar los archivos php le damos permisos de ejecución
chmod -R +x /root/test
3. Posteriormente en call1.php podemos en siguiente script PHP:
$inicio = microtime(true);
sleep(10);

$fin = microtime(true);
$tiempo = $fin - $inicio;

$texto = 'cron 1, tiempo de ejecucion ' . $tiempo . PHP_EOL;
$fp = fopen("text.txt","a");
fwrite($fp, $texto);
fclose($fp);

echo $texto;

en call2.php:
$inicio = microtime(true);
sleep(2);

$fin = microtime(true);
$tiempo = $fin - $inicio;

$texto = 'cron 2, tiempo de ejecucion ' . $tiempo . PHP_EOL;
$fp = fopen("text.txt","a");
fwrite($fp, $texto);
fclose($fp);

echo $texto;

en call3.php:
$inicio = microtime(true);
sleep(5);

$fin = microtime(true);
$tiempo = $fin - $inicio;

$texto = 'cron 3, tiempo de ejecucion ' . $tiempo . PHP_EOL;
$fp = fopen("text.txt","a");
fwrite($fp, $texto);
fclose($fp);

echo $texto;

y en cronjob.php
`php /root/test/call1.php > /dev/null &`;
`php /root/test/call2.php > /dev/null &`;
`php /root/test/call3.php > /dev/null &`;

//echo exec('php /root/test/call1.php > /dev/null &');
//echo exec('php /root/test/call2.php > /dev/null &');
//echo exec('php /root/test/call3.php > /dev/null &');

El archivo tex.txt inicialmente estará vacío, bien explicamos lo que queremos hacer, al ejecutar el script cronjob.php:
php /root/test/cronjob.php
Estamos haciendo 3 llamadas (call1.php, call2.php y call3.php en ese orden); en call1.php hemos puesto un retardo de 10 segundos, en call2.php 2 segundos y en call3.php un retardo de 5 segundos; al final de cada llamada, agregamos al final del archivo text.txt el tiempo de duración y que llamada ha sido y obtenemos el siguiente resultado:


Bien no sabía si llamarlo procesamiento en paralelo, multihilos, así que solo me atiné a nombrarlo en base a la documentación de PHP, ejecución de PHP en segundo plano.

Dale like para que siga compartiendo más artículos de este tipo por si te interesa.