2011-08-08 18 views
19

Próbuję uruchomić skrypt PHP w tle za pomocą wiersza poleceń w systemie Linux. Próbowałem polecenia php filename.php &, ale wygląda na to, że wykonanie skryptu kończy się bardzo szybko, a powinno działać, dopóki proces nie zostanie zakończony.Uruchamianie skryptu PHP z wiersza poleceń jako proces w tle

Wszelkie sugestie?

+2

Co masz na myśli, że szybko się kończy? Na końcu wyświetli się monit o kontynuowanie wykonywania poleceń powłoki, podczas gdy skrypt działa w tle. Możesz sprawdzić, czy nadal działa, wpisując "jobs" – Zak

+1

czy próbowałeś ustawić error_reporting (E_ALL) i ustawienie display_errors = 1? mogą wystąpić pewne błędy, a Twój proces prawdopodobnie kończy się nieprawidłowo – marcelog

+2

try: exec ("nohup php file.php>/dev/null 2> &1 &"); –

Odpowiedz

37

Czy na pewno skrypt nie zawiera żadnych błędów? To zwykle powoduje, że wykonywanie "kończy się bardzo szybko". pierwsze, dołącz error_reporting(E_ALL); ini_set('display_errors', 1); na górze skryptu do wyświetlania błędów może mieć, a następnie można użyć:

nohup php filename.php &

nohup uruchamia polecenia nawet jeśli sesja jest odłączony lub użytkownik dzienniki na zewnątrz.

LUB

nohup php filename.php >/dev/null 2>&1 &

samo jak powyżej, ale nie tworzy nohup.out pliku.


Można również użyć:
ignore_user_abort(1);

Ustaw czy odłączyć klient powinien przerwać wykonywanie skryptu


set_time_limit(0);

Ogranicza maksymalny czas wykonania skryptu, w tym przypadku będzie on działał do zakończenia procesu lub ponownego rozpoczęcia procesu apache.


Uwagi

php i filename.php ścieżki mogą być dostarczone jako pełnej ścieżki, zamiast php i filename.php, można użyć /usr/bin/php i /full/path/to/filename.php.
Zalecana jest pełna ścieżka, aby uniknąć błędu nie znaleziono plików.

+0

Czy instrukcje echa spowodują zakończenie działania skryptu, jeśli nie ma przekierowania wyjścia? – Kyle

+1

@Pedro Lobito, dziękuję, kolego, – whitesiroi

+0

Nie ma za co @whitesiroi –

15

proces może zostać zamknięty, gdy sesja zostanie zamknięta.

spróbuj nohup php filename.php

+0

Awesome, thanks! – arik

2
nohup /path/to/command-name arg1 arg2 & 

Gdzie:
command-name: nazwa skryptu powłoki lub nazwy poleceń. Możesz przekazać argument do polecenia lub skrypt powłoki.
: nohup nie uruchamia automatycznie polecenia uruchamianego w tle; musisz to zrobić jawnie, kończąc linię poleceń symbolem &.

+1

Duplikat [odpowiedź] (http://stackoverflow.com/a/6989340/6209665). Użyj [formatowania kodu] (https://meta.stackexchange.com/que stions/22186/how-do-i-format-my-code-blocks), proszę. – Andrew

2
nohup php file.php > /dev/null 2>&1 & 

Im większe-Thans (>) w poleceniach takie jak przekierować dane wyjściowe programu gdzieś. W tym przypadku coś jest przekierowany do /dev/null, a coś jest przekierowany do &1

Standardu in, out, i błąd

Istnieją trzy podstawowe źródła wejścia i wyjścia dla programu. Standardowe wejście zwykle pochodzi z klawiatury, jeśli jest to program interaktywny lub z innego programu, jeśli przetwarza dane wyjściowe innego programu. Program zwykle drukuje na standardowe wyjście, a czasami drukuje na standardowy błąd. Te trzy deskryptory plików (można je nazwać "rurami danych") są często nazywane STDIN, STDOUT, and STDERR.

Czasami nie są wymieniane, są ponumerowane! Wbudowane numeracje dla nich to 0, 1, and 2, w tej kolejności. Domyślnie, jeśli nie podasz jednoznacznie ani nie numer jeden, mówisz o STDOUT.

powyższe polecenie przekierowuje standardowe wyjście do /dev/null, które jest miejscem, w którym możesz zrzucić wszystko, czego nie chcesz, a następnie przekierowujesz standardowy błąd na standardowe wyjście (musisz umieścić & przed miejscem docelowym, gdy Zrób to).

Krótkie wyjaśnienie brzmi: "wszystkie dane wyjściowe z tego polecenia powinny zostać wepchnięte w czarną dziurę." To dobry sposób, aby program był naprawdę cichy!

& na końcu umieszcza polecenie w tle.

ref: https://www.xaprb.com/blog/2006/06/06/what-does-devnull-21-mean/

Powiązane problemy