Mam zadanie wymagające dużej ilości procesów, które chciałbym wykonać w tle.
Użytkownik klika stronę, uruchamia się skrypt PHP, a na końcu, w razie potrzeby, po spełnieniu pewnych warunków, musi uruchomić skrypt powłoki EG:
shell_exec('php measurePerformance.php 47 844 [email protected]');
Obecnie używam shell_exec , ale wymaga to od skryptu czekania na wyjście. Czy jest jakiś sposób na wykonanie polecenia, które chcę, bez czekania na jego zakończenie?
Odpowiedzi:
Co powiesz na dodanie.
Zauważ, że to również usuwa stdio i stderr.
źródło
> /dev/null 2>&1 &
jak widać w innych odpowiedziach, jest to zwięzła forma> /dev/null 2>/dev/null &
podana tutaj. Zasadniczo oznacza to „przekieruj STDERR (2) do tego samego miejsca co STDOUT (& 1)”.Spowoduje to wykonanie polecenia i odłączenie od działającego procesu. Oczywiście może to być dowolne polecenie. Ale do testu możesz utworzyć plik php za pomocą polecenia sleep (20).
źródło
nohup
i&
?Możesz również natychmiast przekazać dane wyjściowe klientowi, a następnie kontynuować przetwarzanie kodu PHP.
Jest to metoda, której używam do długo oczekujących wywołań Ajax, które nie miałyby żadnego wpływu po stronie klienta:
Szczegółowe wyjaśnienie można znaleźć tutaj: http://oytun.co/response-now-process-later
źródło
W systemie Windows 2003, aby wywołać inny skrypt bez czekania, użyłem tego:
Działa to tylko PO nadaniu zmiany uprawnień na
cmd.exe
- dodaj Odczyt i Wykonaj dlaIUSR_YOURMACHINE
(ustawiłem również zapis na Odmów).źródło
Jasne,
windows
możesz użyć:Uwaga:
Jeśli pojawi się
COM
błąd, dodaj rozszerzenie do swojegophp.ini
i uruchom ponownieapache
:źródło
Użyj
popen
polecenia PHP , np .:Spowoduje to utworzenie procesu potomnego, a skrypt uruchomi się w tle bez czekania na wyjście.
źródło
Jeśli jest poza stroną internetową, zalecam wygenerowanie jakiegoś sygnału (na przykład upuszczenie pliku do katalogu) i zlecenie pracy cron, aby odebrała pracę, którą należy wykonać. W przeciwnym razie prawdopodobnie dostaniemy się na terytorium używania
pcntl_fork()
iexec()
z wnętrza procesu Apache, a to po prostu złe mojo.źródło
To zadziała, ale będziesz musiał uważać, aby nie przeciążać serwera, ponieważ będzie tworzył nowy proces za każdym razem, gdy wywołasz tę funkcję, która będzie działać w tle. Jeśli tylko jedno jednoczesne połączenie w tym samym czasie, to obejście wystarczy.
Jeśli nie, radziłbym uruchomić kolejkę komunikatów, taką jak na przykład beanstalkd / gearman / amazon sqs.
źródło