回答
下面介紹如何操作。您告訴瀏覽器讀取輸出的前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');
?>
你能解釋一下你的代碼嗎?例如,沖洗誘使瀏覽器認爲HTTP請求已結束? –
是的,它的工作原理!請同時發佈這個問題的答案 - http://stackoverflow.com/questions/1436575/can-a-php-script-trick-the-browser-into-thinking-the-http-request-is-over –
我編輯了答案來解釋一點。 –
這是黑暗中的鏡頭:您可以嘗試使用php的操作系統執行功能&
。
exec("./somescript.php &");
此外,如果不工作,你可以嘗試
exec("nohup ./somescript.php &");
'nohup'?這是做什麼的? –
會pcntl_fork()
做類似於你最終想要有所建樹? http://www.php.net/manual/en/function.pcntl-fork.php
您可以通過forking然後調用include
或require
有效實現此目的。
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
然而,分叉本身並沒有允許任何進程間通信,所以你你必須找到其他方式告訴父母,孩子已經到達特定線路,就像你在第四節中提到的那樣問題。
+1我不認爲這正是他想要的,但仍然非常有用 –
您可以通過套接字方法提供雙邊溝通(請參閱http://www.php.net/manual/en/ref.sockets.php) 。 –
如果您不想構建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
?>
您可以創建一個請求,並關閉它完成後立即被寫入連接。
檢出http://drupal.org/project/httprl中的代碼,可以這樣做(非阻塞請求)。一旦我把它更加打磨,我打算把這個lib推給github;可以在Drupal之外運行的東西。這應該做你想要的。
- 1. 從另一個腳本請求一個PHP腳本,並移動
- 2. PHP腳本甚至退出()
- 3. PHP腳本退出過快
- 4. 如何讓一個PHP腳本啓動另一個並捕獲其輸出?
- 5. Bash shell腳本:我如何退出並重新啓動腳本?
- 6. 是否可以在apache啓動時啓動一個php腳本?
- 7. bash腳本中的路徑找到腳本並啓動另一個腳本
- 8. 從php腳本啓動一個bash腳本
- 9. 從另一個PHP腳本執行PHP腳本
- 10. 如何訪問PHP腳本中的另一個PHP腳本?
- 11. 如何從另一個PHP腳本調用PHP腳本?
- 12. 從另一個PHP腳本訪問受限制的PHP腳本
- 13. 如何讓php腳本運行另一個php腳本
- 14. 從另一個外部php腳本運行外部php腳本
- 15. Nginx/PHP-FPM exec另一個php腳本
- 16. 從cron啓動PHP腳本?
- 17. 從另一個腳本啓動一個腳本不起作用
- 18. 調用另一個腳本後退出循環的Shell腳本
- 19. 從PHP腳本發出PHP GET請求並退出
- 20. Shell腳本啓動,退出並運行其他腳本一旦完成
- 21. bash。從另一個執行一個腳本並退出
- 22. 爲什麼我的bash腳本執行另一個腳本不能退出?
- 23. PHP腳本在一定時間後觸發另一個腳本
- 24. 在另一個php腳本中執行一個php腳本(帶參數)
- 25. 如何從另一個php腳本中殺死一個php腳本?
- 26. 從另一個參數調用PHP腳本並獲得輸出
- 27. 用本地Python腳本啓動本地PHP腳本
- 28. PHP腳本退出與框架
- 29. 退出PHP腳本無錯誤
- 30. php IPC腳本簡單地退出
捲曲可以幫助嗎?任何想法如何? –
捲毛?可能只是一個「頭」的請求,但我很懷疑 –
- 如果第一個腳本終止,第二個腳本如何通知第一個腳本? - 這是一個網頁或控制檯腳本? –