[英]Echo messages while php script still executes
我有一個使用cURL的PHP腳本,大約需要10-15分鍾才能執行。 它做了什么,它解析大約1000頁尋找特定的匹配,並在整個腳本中我有回聲消息,如“轉到下一頁”,“找到匹配”,“加載頁面錯誤”...現在它的工作方式(以及它的正常方式)是執行10分鍾,然后才會吐出所有自定義消息。 我希望能夠在這些消息發生時顯示這些消息,而不是在腳本執行完畢時。 我在想像AJAX這樣的東西,但我不確定它是如何工作的。 任何提示都非常感謝。 謝謝。
所以,這是一個老帖子,但我找到了解決方案。 因為我還必須做同樣的事情,在腳本仍在運行時輸出。 這里沒有任何答案有幫助。 首先,我使用Win32服務器(生產)和XAMPP作為本地測試。 這個例子只是一個概念證明,可以隨意修改。
<?php
ob_implicit_flush(true);
for($i=1; $i<=10; $i++){
echo "$i ...<br>";
for($k = 0; $k < 40000; $k++) echo ' ';
sleep(1);
}
?>
所以,我們打開輸出緩沖區為隱式。 然后我們制作一個從1到10計數的演示循環,並在處理它們時顯示它們。 第二個循環將填充瀏覽器緩沖區。 最后檢查一切是否正常,我們睡了1秒鍾。 否則腳本運行得太快,我們無法知道我們是否實現了目標。 希望這可以幫助 !
您可以創建一個臨時表。
PHP腳本可以將它們存儲到數據庫表(可能是內存表以獲得性能),而不是回顯消息。
然后,您可以使用ajax定期輪詢單獨的PHP腳本,該腳本將查詢該表,並將任何新消息返回給客戶端。
使用flush
通過刷新輸出緩沖區立即將輸出發送到瀏覽器。
echo "foo";
flush();
echo "bar";
flush();
我在每次echo
后使用@ob_flush()
。 在此示例中, PHP_EOL
在$string
之后創建一個新行
function output($string){
echo $string.PHP_EOL;
@ob_flush();
}
您可以同時使用flush
和ob_flush
,提醒設置內容類型標題:
<?php
header( 'Content-type: text/html; charset=utf-8' );
for( $i = 0 ; $i < 10 ; $i++ ){
echo $i . '<br>';
flush();
ob_flush();
sleep(1);
}
來源:php.net ob_flush頁面中的dermeister note。
在Firefox 42.0和Chrome 46.0上測試過
基本上,讓您的腳本將HTML輸出寫入臨時日志文件。 然后使用ajax定期使用臨時日志文件更新最終用戶的瀏覽器。 jQuery將快速完成這項工作。
Ajax是使其適用於所有瀏覽器的唯一保證方式。 這是來自PHP的flush頁面的引用。
flush() 可能無法覆蓋Web服務器的緩沖方案,並且它對瀏覽器中的任何客戶端緩沖沒有影響 。 它也不會影響PHP的用戶空間輸出緩沖機制。 這意味着如果使用ob輸出緩沖區,則必須同時調用ob_flush()和flush()來刷新ob輸出緩沖區。
聽起來就像是你打開了輸出緩沖 。
調用ob_end_flush()將打印緩沖區中當前的內容,並關閉緩沖區以執行其余的腳本。
您可以使用flush()函數將緩沖區的所有內容發送到客戶端。 http://php.net/manual/fr/function.flush.php
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.