2009-09-19 132 views
6

PHP腳本如何啓動另一個PHP腳本,然後退出,讓其他腳本運行?PHP腳本能否啓動另一個PHP腳本並退出?

另外,有沒有什麼辦法讓第二個腳本在到達特定行時通知PHP腳本?

+0

捲曲可以幫助嗎?任何想法如何? –

+0

捲毛?可能只是一個「頭」的請求,但我很懷疑 –

+0

- 如果第一個腳本終止,第二個腳本如何通知第一個腳本? - 這是一個網頁或控制檯腳本? –

回答

7

下面介紹如何操作。您告訴瀏覽器讀取輸出的前N個字符,然後關閉連接,而腳本一直運行直到完成。

<?php 
ob_end_clean(); 
header("Connection: close"); 
ignore_user_abort(); // optional 
ob_start(); 
echo ('Text the user will see'); 
$size = ob_get_length(); 
header("Content-Length: $size"); 
ob_end_flush();  // Will not work 
flush();   // Unless both are called ! 

// At this point, the browser has closed connection to the web server 

// Do processing here 
include('other_script.php'); 

echo('Text user will never see'); 
?> 
+1

你能解釋一下你的代碼嗎?例如,沖洗誘使瀏覽器認爲HTTP請求已結束? –

+0

是的,它的工作原理!請同時發佈這個問題的答案 - http://stackoverflow.com/questions/1436575/can-a-php-script-trick-the-browser-into-thinking-the-http-request-is-over –

+0

我編輯了答案來解釋一點。 –

1

這是黑暗中的鏡頭:您可以嘗試使用php的操作系統執行功能&

exec("./somescript.php &"); 

此外,如果不工作,你可以嘗試

exec("nohup ./somescript.php &"); 

編輯:nohup is a POSIX command to ignore the HUP (hangup) signal, enabling the command to keep running after the user who issues the command has logged out. The HUP (hangup) signal is by convention the way a terminal warns depending processes of logout.

+0

'nohup'?這是做什麼的? –

3

您可以通過forking然後調用includerequire有效實現此目的。

parent.php:

<?php 

    $pid = pcntl_fork(); 
    if ($pid == -1) { 
     die("couldn't fork"); 
    } else if ($pid) { // parent script 
     echo "Parent waiting at " . date("H:i:s") . "\n"; 
     pcntl_wait($status); 
     echo "Parent done at " . date("H:i:s") . "\n"; 
    } else { 
     // child script 
     echo "Sleeper started at " . date("H:i:s") . "\n"; 
     include('sleeper.php'); 
     echo "Sleeper done at " . date("H:i:s") . "\n"; 
    } 

?> 

sleeper.php:

<?php 
sleep(3); 
?> 

輸出:

 
$ php parent.php 
Sleeper started at 01:22:02 
Parent waiting at 01:22:02 
Sleeper done at 01:22:05 
Parent done at 01:22:05 

然而,分叉本身並沒有允許任何進程間通信,所以你你必須找到其他方式告訴父母,孩子已經到達特定線路,就像你在第四節中提到的那樣問題。

+0

+1我不認爲這正是他想要的,但仍然非常有用 –

+0

您可以通過套接字方法提供雙邊溝通(請參閱http://www.php.net/manual/en/ref.sockets.php) 。 –

0

如果您不想構建pcntl擴展,那麼一個很好的選擇是使用proc_open()。

http://www.php.net/manual/en/function.proc-open.php

使用與stream_select在一起(),所以你的PHP程序可以睡覺,直到有事跟你創建子進程。

這將有效地在後臺創建一個進程,而不會阻止父PHP進程。你的PHP可以讀寫STDIN,STDOUT,STDERR。

爲了使瀏覽器完成加載(停止加載進度指示器),那麼你可以使用米蘭Babuškov提到的。

使瀏覽器認爲HTTP請求完成的關鍵是發送它的內容長度。要做到這一點,您可以開始緩衝請求,然後在發送Content-Length標頭後將其刷新。

如:

<?php 

ob_start(); 

// render the HTML page and/or process stuff 

header('Content-Length: '.ob_get_length()); 
ob_flush(); 
flush(); 

// can do more processing 

?> 
0

您可以創建一個請求,並關閉它完成後立即被寫入連接。

檢出http://drupal.org/project/httprl中的代碼,可以這樣做(非阻塞請求)。一旦我把它更加打磨,我打算把這個lib推給github;可以在Drupal之外運行的東西。這應該做你想要的。

相關問題