簡體   English   中英

當php腳本仍然執行時回顯消息

[英]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();

實際上你正在尋找像flushob_flush這樣的東西,但請記住,有很多因素可以阻止你的輸出被沖洗掉。

flush文檔中你會得到:

多個服務器,尤其是Win32上的服務器,仍將緩沖腳本的輸出,直到它終止,然后再將結果傳輸到瀏覽器。

像mod_gzip這樣的Apache服務器模塊可能會自行緩沖,這會導致flush()不會導致數據立即發送到客戶端。

我在每次echo后使用@ob_flush() 在此示例中, PHP_EOL$string之后創建一個新行

function output($string){
    echo $string.PHP_EOL;
    @ob_flush();
}

您可以同時使用flushob_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM