2012-08-09 21 views
25

He estado tratando de hacerle saber si el comando exec() en php se ejecuta correctamente o no, así que puedo repetir ciertos mensajes en consecuencia. Probé la siguiente pieza de código, pero el problema es que si exec() se ejecuta correctamente o no, siempre echo "PDF not created" y nunca echo el pdf creado con éxito. Por favor, hágamelo saber cómo puedo realizar la comprobación de la ejecución de exec() para que yo puedo repetir los mensajes en consecuencia Gracias,Comprobando que exec() se ejecuta correctamente o no

<?php 
if (exec('C://abc//wkhtmltopdf home.html sample.pdf')) 
echo "PDF Created Successfully"; 
else 
echo "PDF not created"; 
?> 
+0

Por qué no sólo comprobar el archivo creado para ver si ha funcionado? –

+0

ha comprobado si 'exec()' está habilitado en su sistema? – deex

+0

Exec devuelve la última línea de la salida, y eso debe equivaler a verdadero en PHP. –

Respuesta

43

De acuerdo con PHP de exec quickref, puede pasar punteros para obtener la salida y el estado de El comando.

<?php 
exec('C://abc//wkhtmltopdf home.html sample.pdf', $output, $return); 

// Return will return non-zero upon an error 
if (!$return) { 
    echo "PDF Created Successfully"; 
} else { 
    echo "PDF not created"; 
} 
?> 

Si desea enumerar los posibles errores, se pueden encontrar los códigos de encima en hiteksoftware

+2

Gracias al código funcionó como un encanto !! –

+0

¡es bueno escucharlo! –

+0

¿Qué hay de los scripts largos? ¿Cómo modifico el código para que funcione para ejecutar scripts Python largos dentro de Exec? – proprius

4

Una muestra simple:

$ip = "192.168.0.2"; 
$exec = exec("ping -c 3 -s 64 -t 64 ".$ip, $output, $return); 
echo $exec; 
echo "<br />----------------<br />"; 
print_r($output); 
echo "<br />----------------<br />"; 
print_r($return); 

En caso de no pong o ERROR. (UNO)

---------------- 
Array ([0] => PING 192.168.0.2 (192.168.0.2) 64(92) bytes of data. [1] => [2] => --- 192.168.0.2 ping statistics --- [3] => 3 packets transmitted, 0 received, 100% packet loss, time 2016ms [4] =>) 
---------------- 
1 

En caso de éxito (CERO)

rtt min/avg/max/mdev = 4.727/18.262/35.896/13.050 ms 
---------------- 
Array ([0] => PING 192.168.0.2 (192.168.0.2) 64(92) bytes of data. [1] => 72 bytes from 192.168.0.2: icmp_req=1 ttl=63 time=14.1 ms [2] => 72 bytes from 192.168.0.2: icmp_req=2 ttl=63 time=35.8 ms [3] => 72 bytes from 192.168.0.2: icmp_req=3 ttl=63 time=4.72 ms [4] => [5] => --- 192.168.0.2 ping statistics --- [6] => 3 packets transmitted, 3 received, 0% packet loss, time 2003ms [7] => rtt min/avg/max/mdev = 4.727/18.262/35.896/13.050 ms) 
---------------- 
0 
+0

http://php.net/manual/pt_BR/function.exec.php – B4NZ41

10

La forma correcta es comprobar que el $ var_retorno no se ajusta a cero, ya que sólo se pone a cero cuando es exitoso En ciertos casos, el ejecutivo puede fallar y el return_var no está configurado para nada. P.ej. si el servidor se quedó sin espacio en disco durante el ejercicio.

<?php 
exec('C://abc//wkhtmltopdf home.html sample.pdf', $output, $return_var); 
if($return_var !== 0){ // exec is successful only if the $return_var was set to 0. !== means equal and identical, that is it is an integer and it also is zero. 
    echo "PDF not created"; 
} 
else{ 
    echo "PDF Created Successfully"; 
} 

?> 

Nota: no inicialice $ var_retorno a cero

+0

¿Dónde se menciona que $ return_var debe establecerse en 0 si tiene éxito? –

+0

"el estado de retorno del comando ejecutado se escribirá en esta variable" http://php.net/manual/en/function.exec.php Entonces, si no hay estado de retorno porque el comando simplemente ni siquiera terminó, entonces no se establecerá en nada. Esta es la razón por la cual es mejor verificar que se establezca en 0 en lugar de hacerlo a la inversa. – malhal

+0

Oh veo lo que quiere decir, "la práctica de programación común para un proceso secundario para devolver cero al padre significa éxito": https://en.wikipedia.org/wiki/Exit_status – malhal

Cuestiones relacionadas