la función php exec () y diferentes hosts

Tengo un script que ejecuta un archivo en un par de directorios que se ve así:

exec("php-cli $file_path > /dev/null 2>/dev/null &"); //php command-line 

Esto funciona en la mayoría de los hosts pero a algunos hosts no les gusta y no se ejecuta, sin generar ningún error.

Para los hosts que esto falla, yo uso

 exec("php $file_path > /dev/null 2>/dev/null &"); //notice the -cli is gone 

Lo cual funciona bien.

$ file_path es la ruta completa al archivo que se está ejecutando /home/blah/path/blah.php

¿Cómo puedo hacer que este uniforme funcione en todos los servidores (unix al menos)?

** EDITAR * *

Bueno, lo estoy haciendo de esta manera, es (muy probablemente) no es la forma correcta, pero funciona.

En lugar de simplemente usar php-cli o php, uso ambos, así que si uno falla, el otro pasa. O el php se ejecuta como cgi o cli y uno de ellos capturará, y dado que no hay salida, tampoco habrá ningún error.

 exec("php-cli $file_path > /dev/null 2>/dev/null &"); exec("php $file_path > /dev/null 2>/dev/null &"); 

A menos que sepa una mejor solución, por favor hágamelo saber. Gracias por toda tu ayuda.

 function php_exec($file_path) { if (!($binary = which(array('php', 'php5', 'php-cli', 'php-cgi')))) return false; return exec("$binary $file_path > /dev/null 2>/dev/null &"); } function which($binaries) { if (!($path = getenv('PATH')) && !($path = getenv('Path'))) return false; $arr = preg_split('/[:;]/', $path); foreach ($arr as $p) { foreach ($binaries as $b) { if (file_exists("$p/$b")) return "$p/$b"; } } return false; } var_dump(php_exec('test.php')); 

Explicación: en la mayoría de los sistemas, el binario de PHP se llama php, php5, php-cli o php-cgi. which () función comprueba la ruta estándar (tanto * nix y windows tienen la variable de entorno llamada PATH / Path) para cada uno de esos nombres y si encuentra un archivo con dicho nombre, lo devolverá.

El formato de la variable PATH es: /bin:/usr/bin:/usr/local/bin:/sbin:/usr/sbin:/usr/local/sbin para * nix (bash) y C:\Windows\System32\;C:\Windows\; para Windows, así que es por eso que utilizo preg_split (‘/ [:;] /’)

Esta solución es mejor que la tuya, porque php_exec () devolverá false si no puede encontrar un binario php válido. En su solución, no hay forma de saber si la ejecución del script falló.

Depende de cómo se comstack el binario de PHP-CLI. En la mayoría de los sistemas, el ejecutable se llama simplemente ‘php’ y supongo que los hosts que tienen ‘php-cli’ lo comstackn a mano, mientras que la mayoría de los otros lo tienen instalado a través del administrador de paquetes del sistema operativo.

Tienes dos opciones para solucionar eso y hacerlo “universal”:

  1. En cada uno de los servidores, agregue un alias para uno de ellos donde sea necesario o haga un enlace simbólico al archivo ejecutable de PHP en algún lugar (por ejemplo, en su directorio de inicio).
  2. Antes de ejecutar, verifique cuál de ellos existe (generalmente, debe estar ubicado en / usr / bin /) y configúrelo como variable.

Pregunta simple tal vez, pero ¿ php-cli existe en todos los hosts? Supongo que la razón por la que falla silenciosamente es porque estás diciendo que redirecciona todo.

 exec("php $file_path > /some/writable/path/output.log 2>/some/writable/path/error.log &");