Suponiendo que el sistema de devolver $ resultado == -1 es similar a Unix basado (no sé cómo se comportarían de Windows con el mismo código)
función
El PHP (5.2.9) exec() hace no llame a la primitiva C exec() (que devuelve -1 si no pudo reemplazar/ejecutar el proceso, que no es el caso aquí). En su lugar, llama a popen() que crea un conducto, realiza un fork() y ejecuta un shell con su comando. return_value, -1, no es el resultado directo de una primitiva C, sino que está construido internamente por PHP, según la forma en que se procesó su comando. En otros términos, el comando "ls" puede haber sido bien ejecutado, mientras que, por ejemplo, PHP no pudo cerrar correctamente el conducto.
Mirando el código C, en ext/standard/exec.c, puede haber dos razones por las cuales el código de retorno es -1, desencadenado por un error; el segundo uno pasa después de la popen() llaman
fp = VCWD_POPEN(cmd_p, "r");
if (!fp) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to fork [%s]", cmd);
goto err;
}
// ...
err:
pclose_return = -1;
goto done;
Sin embargo, en este caso, sería no ver el resultado, y el registro mostraría un error.
Más tarde, el valor_devuelto se establece a través de la línea
pclose_return = php_stream_close(stream);
En cuanto a _php_stream_free() (php_stream_close() es una macro sustituido por _php_stream_free()), el candidato más probable que podría devolver -1 es
ret = stream->ops->close(stream, preserve_handle ? 0 : 1 TSRMLS_CC);
Que a su vez llama indirectamente a la C primitiva pclose(). De acuerdo con el manual
La función pclose() devuelve -1 si wait4 (2) devuelve un error o se detecta algún otro error.
Parece haber un error detectado durante el cierre de la tubería, que no impide que se establezcan los datos resultantes.Para encontrar el motivo de forma rigurosa, es necesario verificar la configuración y los registros del sistema operativo, la configuración de PHP y los parámetros de compilación.
recomendaría
- para aplicar los parches para su sistema operativo, y tal vez actualizar a una versión más reciente (si es aplicable),
- para actualizar a PHP 5.3.3 (la última a partir de ahora), ya el código PHP exec() cambió significativamente.
Tenga en cuenta que hubo cambios relacionados con el módulo PHP suhosin en la versión 5.3 que mejoran de forma predeterminada la seguridad al ejecutar archivos PHP.
What si su variable '$ command' es una cadena vacía para que' exec() 'no proporcione argumentos a' ls'? ¿El código de salida sigue siendo '-1'? Si es así, ¿ha comprobado la implementación de 'ls' para su sistema actual con' man ls' para ver si se define el código de salida '-1'? ¿Es esto cierto con otros comandos (tal vez un 'du -h index.html')? – sleepynate
Parece que no puedo llamar a 'exec (" ")'. Imprime una advertencia. Cualquier otro comando se comporta de la misma manera. 'sleep 5' regresa con -1,' lsmod' devuelve -1, etc ... – Quamis
Lo único que puedo ver es esto [publicar en la página del manual de php del ejecutor] (http://www.php.net/manual) /en/function.exec.php#76687) pero dado que está funcionando en otros servidores, no es obvio por qué sería esto. – Troubadour