2013-08-09 14 views
5

Mam skrypt PHP, który muszę wykonać z poziomu innej strony PHP. Jednak, aby drugi działał prawidłowo, pierwsze musi zostać w pełni ukończone. Zasadniczo potrzebuję pierwszej strony, aby spawnować nowy proces/wątek dla drugiego skryptu, który będzie czekał 1 sekundę przed rozpoczęciem.Tarło skrypt PHP z wewnątrz innego. Bez blokowania

robi to przyczyny, które uniemożliwiają blokowanie go z pracy i nie mogę zmusić go do rozpoczęcia korzystania Exec

EDIT:

powinna wyjaśnić. Strony te nie mają danych wyjściowych i nie są połączone z interfejsem WWW. Wszystkie strony są wywoływane przez żądania POST z innego serwera.


Edit 2:

Rozwiązanie: uczynić serwer żądania strony wysłać bezpośrednio do drugiego strona 1 sekundę po pierwszych zwrotów.

+0

proc_open? http://php.net/manual/en/function.proc-open.php – cmorrissey

+3

sprawdź najpopularniejszą odpowiedź tutaj: http://stackoverflow.com/questions/3819398/php-exec-command-lub-similar- to-not-wait-for-result –

+0

@brian To jest PHP niezależne od platformy. Zatem używanie basha lub/dev nie jest opcją. – Sam

Odpowiedz

1

proc_open to właściwy wybór, ponieważ @ChristopherMorrissey zauważył. Chciałbym trochę tutaj opracować, ponieważ istnieją pewne zastrzeżenia do używania proc_open, które nie są całkowicie oczywiste.

W pierwszym przykładzie kodu @http://php.net/manual/en/function.proc-open.php pokazuje ogólne użycie i odwołam się do tego.

Pierwsze zastrzeżenie dotyczy rur. Rury są strumieniami plików w PHP, które prowadzą do STDIN, STDOUT i STDERR procesu potomnego. W tym przykładzie indeks potoku 0 reprezentuje strumień plików z perspektywy nadrzędnych procesów PHP. Jeśli proces nadrzędny zapisuje do tego strumienia, pojawi się jako wejście STDIN do procesu potomnego.

W systemach operacyjnych zgodnych z POSIX, STDIN do procesu musi zostać zamknięty, aby proces mógł zostać zakończony. Bardzo ważne jest, aby wywoływać fclose na rurze od rodzica, lub proces twojego dziecka zostanie zablokowany. Odbywa się to w tym wierszu w przykładzie:

fclose($pipes[0]); 

Drugim zastrzeżeniem jest sprawdzenie kodu wyjścia procesu potomnego. Sprawdzanie kodu wyjścia jest najlepszym sposobem określenia, czy proces potomny zakończył się poprawnie, czy też został błędny. Przynajmniej musisz po prostu wiedzieć, kiedy proces podrzędny został zakończony.Sprawdzenie tego i kod wyjścia są zarówno wykonane z http://www.php.net/manual/en/function.proc-get-status.php

Jeśli chcesz upewnić się, że proces wychodzi poprawnie, trzeba będzie spojrzeć na polu exitcode zwrócony w tablicy z proc_get_status. Pamiętaj, że ten kod wyjścia zwróci prawidłową wartość tylko raz. Za każdym razem zwróci -1. Tak więc, gdy tylko wróci> -1, jest to twój aktualny kod wyjścia. Tak więc po raz pierwszy running == false, sprawdź exitcode.

Mam nadzieję, że to pomoże.

+0

Jak stwierdzono w pytaniu, istnieje 0 IO zaangażowanych w obie strony. Druga strona nie działa poprawnie, dopóki pierwsza strona nie zostanie w pełni ukończona i wysłana odpowiedź HTTP. – Sam

+0

@sam nawet bez IO, nadal trzeba zamknąć rurę STDIN do procesu potomnego. Nawet jeśli jako programista wiesz, że żadne IO nie zostaną wysłane od rodzica do dziecka, lub odwrotnie, system operacyjny nie wie. System operacyjny nie pozwoli, aby proces potomny zakończył się, dopóki STDIN nie zostanie zamknięty. W tej chwili, bez wyraźnego zamknięcia na rurze w twoim macierzystym kodzie, PHP automatycznie wywołuje zamknięcie w rurze, gdy proces rodzica kończy działanie. To w tym momencie proces potomny zostanie ostatecznie wykonany do końca. –

+0

Robi się to dla systemu sprawdzania koncepcji i naprawdę nie jest wart mojego czasu, aby spróbować działać. Prawdopodobnie nie będzie nawet używać PHP w środowisku produkcyjnym. – Sam

0

Możesz napisać nagłówek przechodząc na drugą stronę, kiedy chcesz, a następnie umieścić nagłówek z powrotem na oryginalnej stronie na końcu drugiej strony. Chociaż istnieje wiele przyczyn, dla których ta poprawka nie zadziałałaby, tak jak kod PHP musi być w kodzie HTML.

Headers reference Więc coś takiego: header(Location: seconddocument.php)

Albo można umieścić w PHP do wykonywania funkcji, a następnie wywołać ją z oryginalnego dokumentu PHP. Nie mogę być dokładnie pewien twoich wymagań tutaj, ale to byłyby moje dwie najlepsze odpowiedzi.

1

Jedną opcją byłoby przekierowanie strony po zakończeniu pierwszego skryptu.

Można zrobić to w ten sposób:

//first script here 
sleep(1); //wait one second 
echo "<meta http-equiv=\"refresh\" content=\"0;URL='yoursecondscript.php'\" />"; //redirect 

lub nawet:

//first script here 
//redirect after one sec 
echo "<meta http-equiv=\"refresh\" content=\"1;URL='http://thetudors.example.com/'\" />"; 
+0

Powiedzmy, że masz kilka zmiennych w skrypcie 1, czy będą działać na skrypcie 2 po przekierowaniu ?. –

+0

Ponieważ serwer żądający pierwszej strony nie analizuje odpowiedzi innych niż upewniając się, że istnieje HTTP: 200, to nie zadziała. – Sam

+0

@Nie wiesz nicJonSnow nie, najpierw musisz rozpocząć sesję, a następnie wywołać zmienne sesji z następnej strony. – pattyd

Powiązane problemy