Ejecutivo de shell asíncrono en PHP
Tengo un script PHP que necesita invocar un script de shell pero no le importa en absoluto el resultado. El script de shell realiza varias llamadas SOAP y tarda en completarse, por lo que no quiero ralentizar la solicitud PHP mientras espera una respuesta. De hecho, la solicitud PHP debería poder salir sin finalizar el proceso de shell.
He examinado las distintas funciones exec()
, shell_exec()
, pcntl_fork()
, etc., pero ninguna parece ofrecer exactamente lo que quiero. (O, si lo hacen, no tengo claro cómo hacerlo). ¿Alguna sugerencia?
Si "no le importa el resultado", ¿no se podría llamar al ejecutivo del script para &
poner en segundo plano el proceso?
EDITAR : incorporando lo que @ AdamTheHut comentó en esta publicación, puede agregar esto a una llamada a exec
:
" > /dev/null 2>/dev/null &"
Eso redirigirá tanto stdio
(primero >
) como stderr
( 2>
) /dev/null
y se ejecutará en segundo plano.
Hay otras formas de hacer lo mismo, pero esta es la más sencilla de leer.
Una alternativa al doble redireccionamiento anterior:
" &> /dev/null &"
Utilicé para esto, ya que realmente está iniciando un proceso independiente.
<?php
`echo "the command"|at now`;
?>
Para todos los usuarios de Windows: encontré una buena manera de ejecutar un script PHP asincrónico (en realidad funciona con casi todo).
Se basa en los comandos popen() y pclose(). Y funciona bien tanto en Windows como en Unix.
function execInBackground($cmd) {
if (substr(php_uname(), 0, 7) == "Windows"){
pclose(popen("start /B ". $cmd, "r"));
}
else {
exec($cmd . " > /dev/null &");
}
}
Código original de: http://php.net/manual/en/function.exec.php#86329