linux服務器上能夠使用php xxx.php &後臺執行,可是由於啓動的進程屬於當前登陸終端的進程組,因此當終端關閉是進程會退出。使用nohup php xxx.php>/dev/null 2>&1 &能夠脫離終端掛起腳本,另一種方法能夠在代碼裏fork子進程,使子進程脫離終端進程組獨立運行。php
代碼示例。linux
- <?php
-
- $pid = pcntl_fork();
-
- if ($pid == -1)
- {
- throw new Exception('fork子進程失敗');
- }
- elseif ($pid > 0)
- {
- //父進程退出,子進程變成孤兒進程被1號進程收養,進程脫離終端
- exit(0);
- }
-
- // 最重要的一步,讓該進程脫離以前的會話,終端,進程組的控制
- posix_setsid();
-
- // 修改當前進程的工做目錄,因爲子進程會繼承父進程的工做目錄,修改工做目錄以釋放對父進程工做目錄的佔用。
- chdir('/');
-
- /*
- * 經過上一步,咱們建立了一個新的會話組長,進程組長,且脫離了終端,可是會話組長能夠申請從新打開一個終端,爲了不
- * 這種狀況,咱們再次建立一個子進程,並退出當前進程,這樣運行的進程就再也不是會話組長。
- */
- $pid = pcntl_fork();
- if ($pid == -1)
- {
- throw new Exception('fork子進程失敗');
- }
- elseif ($pid > 0)
- {
- // 再一次退出父進程,子進程成爲最終的守護進程
- exit(0);
- }
-
- // 因爲守護進程用不到標準輸入輸出,關閉標準輸入,輸出,錯誤輸出描述符
- fclose(STDIN);
- fclose(STDOUT);
- fclose(STDERR);
-
- /*
- * 處理業務代碼
- */
-
- while(TRUE)
- {
- file_put_contents('log.txt', time().PHP_EOL, FILE_APPEND);
- sleep(5);
- }