2011-10-01 12 views
18

Potrzebuję uruchomić wiele skryptów (5 skryptów) za pomocą cmd, chcę się upewnić, że dopóki pierwszy skrypt się nie zakończy, drugi nie powinien inicjować. W ten sposób po raz pierwszy skrypt zakończy wtedy tylko drugi powinien być następnie trzeci i tak dalej .. Obecnie używam następujący kod do wykonania tejSposób wykonywania poleceń powłoki synchronicznie w PHP

exec ("php phpscript1.php "); 
exec ("php phpscript2.php "); 
exec ("php phpscript3.php "); 
exec ("php phpscript4.php "); 
exec ("php phpscript5.php "); 

Myślę, że te skrypty uruchamiane asynchronicznie, wszelkie sugestie faceci tak, że te skrypty może być uruchamiany synchronicznie.

+1

Kiedy mówisz 'poprzez cmd', masz na myśli przy użyciu wiersza polecenia systemu Windows, lub używasz powłoki jak bash, sh, zsh, etc? – Michael

+0

Jestem prawie pewien, że nie działają * asynchronicznie * w tej chwili, wręcz przeciwnie. Biegną jeden po drugim, co nazywa się "synchronicznym". –

+0

nie w oknach używających powłoki – Rahul

Odpowiedz

50

PHP exec będzie czekać, aż wykonanie wywoływanego programu zostanie zakończone, przed przetworzeniem następnego wiersza, chyba że użyjesz & na końcu ciągu, aby uruchomić program w tle.

+1

Uratowałeś mnie przed zrobieniem niepotrzebnego eksperymentu i pozdrawiam Cię. –

+0

@stivlo: to samo tutaj, dzięki bro.Teraz chce zapytać, co jeśli polecenie jest wykonywane z innego klienta, np. Chcę zatrzymać exec aż do ukończenia pierwszego, jeśli jest uruchamiany jednocześnie z 2 komputerów klienckich. (Mój exec uruchamia inny program sprzętowy, który nie obsługuje równoległego wykonywania) – mokNathal

7

Jeśli mam ci rację, wykonujesz skrypty php z poziomu skryptu php.

Zwykle php czeka na wykonanie exec ("php phpscript1.php");, aby zakończyć przed przetworzeniem następnego wiersza.

Aby tego uniknąć, wystarczy przekierować wyjście do /dev/null lub pliku i uruchomić go w tle. Na przykład: exec ("php phpscript1.php >/dev/null 2>&1 &");.

+1

@ Bill'o: Twoja edycja jest nieprawidłowa. Twój kod przekazuje '/ dev/null' jako argument do skryptu PHP, ale nie wykonuje przekierowania. – Dennis

+0

Rzeczywiście mój błąd, napisałem trochę zbyt szybko –

4

Sprawdź składnię funkcji exec na stronie php.net. Zobaczysz, że exec nie uruchamia się domyślnie asynchronicznie.

exec ma dwa inne parametry. Trzeci, return_var może dać ci wskazówkę, czy skrypt działał poprawnie, czy został uruchomiony jakiś wyjątek. Możesz użyć tej zmiennej, aby sprawdzić, czy możesz uruchomić kolejne skrypty.

Sprawdź i powiedz nam, czy to działa.

Powiązane problemy