2012-08-09 12 views
25

Próbowałem poinformować, czy polecenie exec() w php działa poprawnie, czy też nie, dlatego mogę wyświetlać odpowiednie komunikaty. Próbowałem następujący fragment kodu, ale problem z nim jest, że czy exec() działa pomyślnie, czy nie zawsze echo "PDF not created" i nigdy nie echo utworzone pomyślnie. Prosimy daj mi znać jak mogę przeprowadzić kontrolę na wykonanie exec(), więc mogę powtórzyć wiadomości odpowiednio Dzięki,Sprawdzanie, czy exec() działa poprawnie, czy nie

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

Dlaczego nie po prostu sprawdzić utworzony plik aby sprawdzić, czy to działa? –

+0

Czy sprawdziłeś, czy 'exec()' jest włączone w twoim systemie? – deex

+0

Exec zwraca ostatnią linię danych wyjściowych, która musi mieć wartość równą true w PHP. –

Odpowiedz

43

Według PHP exec quickref, można przekazać wskazówki w celu uzyskania wyjścia i status Komenda.

<?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"; 
} 
?> 

Jeśli chcesz wyliczyć ewentualne błędy można znaleźć kody na co hiteksoftware

+2

Dzięki kodowi zadziałało jak czar !! –

+0

to dobrze usłyszeć! –

+0

co z długimi skryptami? jak zmodyfikować kod, aby działał w przypadku uruchamiania długich skryptów python wewnątrz exec? – proprius

4

prostej próbki:

$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); 

W przypadku nie ping lub błędów. (ONE)

---------------- 
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 

W przypadku sukcesu (ZERO)

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

Prawidłowe sposobem jest sprawdzenie, czy $ return_var nie został ustawiony na zero, ponieważ jest on ustawiony tylko do zera, gdy to się udaje. W niektórych przypadkach exec może się nie powieść, a return_var nie jest ustawione na nic. Na przykład. jeśli na serwerze zabrakło miejsca na dysku podczas exec.

<?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"; 
} 

?> 

Uwaga: nie należy zainicjować $ return_var zeru

+0

Gdzie jest napisane, że $ return_var powinno być ustawione na 0, jeśli się powiedzie? –

+0

"status zwrotu wykonanego polecenia zostanie zapisany do tej zmiennej" http://php.net/manual/en/function.exec.php Tak więc, jeśli nie ma żadnego statusu powrotu, ponieważ polecenie właśnie się nie zakończyło nie zostanie ustawiony na nic. Z tego powodu lepiej jest sprawdzić, czy jest ustawiony na 0, a nie na odwrót. – malhal

+0

Och, rozumiem, co masz na myśli, "powszechna praktyka programowania dla procesu potomnego, aby zwrócić zero rodzicowi, który oznacza sukces": https://en.wikipedia.org/wiki/Exit_status – malhal

Powiązane problemy