2009-02-19 30 views
15

Próbuję wywołać skrypt, który trwa kilka sekund (serwisy internetowe z 3rd party) przy użyciu wywołania PHP exec. Po wielu zmaganiach ograniczyłem to do klasycznego przykładowego świata witaj. Skrypt wywołanie wygląda następująco:Nie można wykonać skryptu PHP za pomocą PHP exec

exec('/usr/bin/php /home/quote2bi/tmp/helloworld.php > /tmp/execoutput.txt 2>&1 &'); 

Gdy uruchomię to wyjście execoutput.txt zawiera kopię strony Wywoływanie skryptu, nie hello world jak się spodziewałem.

Dlaczego nie mogę uzyskać tego skryptu PHP do wykonania przy użyciu exec? Zauważ, że kiedy zmieniam polecenie na coś takiego jak ls -l, dane wyjściowe są katalogami zgodnie z oczekiwaniami. btw, w razie potrzeby, zrobiłem chmod wywoływanego skryptu do 755 ...

Aktualizacja - Przeniosłem wywołanie exec na koniec wywołującego skryptu i przynajmniej teraz nie widzę skryptu wywołującego wykonane na wyjściu. Piszę plakaty, a ja spróbuję niektórych z tych pomysłów.

Pomoc!

Dzięki Steve

Odpowiedz

16

Co Exec robi bierze skrajną prawą polecenie i dołączenie go do miejsca docelowego. Jeśli masz linię shebang w swoim skrypcie php, nie powinieneś dodawać dyrektywy binarnej interpretera php.

jeśli chcesz tylko wyjście do skryptu, spróbuj:

exec('/home/quote2bi/tmp/helloworld.php > /tmp/execoutput.txt 2>&1 &') 

jednak jeśli nie chcesz być błędy w pliku, należy przekierować STDERR przed wyprowadzania do pliku. Tak jak poniżej:

exec('/home/quote2bi/tmp/helloworld.php 2> /dev/null > /tmp/execoutput.txt') 

powyższa powinna wyprowadzać tylko "Hello World" do execoutput.

Edit:

Ciekawe są coraz to zachowanie. Powiedziałeś, że polecenie "ls" zadziałało. Spróbuj alias dla tego i przekazania go do pliku tak:

alias pexec='php /home/quote2bi/tmp/helloworld.php'

następnie

exec('pexec > /tmp/execoutput.txt 2>&1 &') 

wydaje się być problem ze sposobu Exec obsługuje wejście w przeciwieństwie do samej muszli .

-John

+1

John - dziękuję za odpowiedź, ale niestety to nie zadziałało. Kiedy próbowałem: exec ('/ home/quote2bi/tmp/helloworld.php> /tmp/execoutput.txt 2> & 1 &') ... Otrzymałem te same wyniki (bieżąca strona w pliku wyjściowym). Drugi exec zablokowany (brakujący &) - po dodaniu mam te same wyniki. –

+0

Czy istnieje opcja, jeśli funkcja exec() jest wyłączona na moim serwerze –

7

Problem polega na tym ze sam PHP, traktuje wszystko jako $ argv w skrypcie. Nie przekierowuje danych wyjściowych do pliku/na/dev/null.

Zetknąłem się z tym samym problemem jakiś czas temu. To, co zrobiłem, to stworzyć runscript.php w/opt/php-bin, a następnie w tym skrypcie uruchomić to, co powinno działać.Coś takiego:

$script = $argv[1] 
$params = implode(' ', array_slice($argv, 2)); 
$cmd = "{$script} {$params} > /dev/null &"; 

$output = array(); 
$return = 0; 
exec("php {$cmd}", $output, $return); 

exit((int)$return); 

A potem to nazwać, używając:

exec('/opt/php-bin/runscript.php /path/to/your/script.php arg1 arg2') 

its jedyny sposób udało mi się uzyskać tej pracy.

0

Aby uniknąć wymienionych problemów z PHP w tym obszarze, dlaczego nie umieścić tego w skrypcie powłoki? PHP może następnie wykonać skrypt powłoki, który ma wszystkie przekierowania obsługiwane wewnętrznie.

Jeśli chcesz dynamicznie zmieniać rzeczy, to dlaczego nie napisać skryptu powłoki, a następnie wykonać (i oczyścić później)?

28

Miałem również ten problem i okazało się, że jest to błąd w php (# 11430). Poprawka polega na użyciu php-cli podczas wywoływania innego skryptu php w skrypcie php. Więc można nadal korzystać z exec, ale zamiast korzystać użycie php php-cli podczas wywoływania go w przeglądarce:

exec("php-cli somescript.php"); 

Ten pracował dla mnie.

+1

To również działa dla mnie. Chciałbym wcześniej zobaczyć tę odpowiedź, rozwiązałbym 5-godzinny ból głowy. – Omar

+1

Po prostu uratowałeś mi dzień. To jest poprawna odpowiedź. – DataHerder

+1

Szukałem tego przez HOURS i już miałem się poddać. Zauważ, że jeśli używasz PHPSuEXEC, nie wydaje ci się to konieczne, ale zaraz po wyłączeniu suexec, musisz użyć php-cli, jak podano. – rinogo

1

Jeśli po prostu uruchamiasz skrypt php, jednym z możliwych sposobów na wykonanie całego kodu jest użycie funkcji include(), która uruchomi plik php i wypisze wyniki. Nie można przekierować do pliku tekstowego, ale powinien pojawić się w oknie przeglądarki, jeśli jesteś Hello World skrypt php wygląda

<?php echo "Hello World!"; ?> 

to będzie pluć, że w przeglądarce. Więc twój drugi kod wyglądałby

<?php include("helloWorld.php"); echo " PHP ROCKS";?> 

powodując strony, która będzie wyglądać,

Witaj świecie! PHP ROCKS

0

Działa to tak, jakby uruchomić skrypt z przeglądarki.

Ten problem pojawił się podczas pracy nad projektem na platformie Linux.

exec('wget http://<url to the php script>) 

Mam nadzieję, że to pomoże!

Powiązane problemy