簡體   English   中英

PHP 進度指示器

[英]PHP Progress Indicator

這是一個老問題,但是那里有很多相互矛盾的答案,我又問了一遍。

我有一個 PHP 腳本,它可以向大約 200 人的郵件列表發送電子郵件。 這需要幾分鍾的時間,我想在發送 email 時在屏幕上顯示每個收件人的姓名,首先是檢查誰收到了電子郵件,也是一個進度指示器。 根據我的閱讀,直到大約十年前,通過刷新 output 緩沖區,這曾經是可能的,但是由於事情完成方式的“進步”,這不再有效。 在一項長期運行的任務上顯示進度是一件非常合理的事情。 一定有答案的地方。 有誰知道它是什么?

好吧,您的 PHP 代碼可以作為 CLI 獨立應用程序運行,也可以作為 web 應用程序的服務器端運行,也可以由 cron 作業引發。 由於您想在屏幕上看到一個進度條,我假設您可能錯誤地認為您對 cron 作業/hb 任務場景不感興趣,但是,如果您這樣做,那么解決方案與 webapp 場景只會略有不同。

對於 CLI,解決方案很簡單。 您的程序只是回顯它必須回顯的任何內容,它將實時出現在終端中。

現在,對於 webapp,您有兩個參與者:服務器和客戶端。 如果服務器只在一切都完成后才響應,那么在漫長的等待之后,您將在客戶端看到 100%,這當然不是您所期望的。 現在,您需要 1. output 服務器端的項目 2. 從客戶端獲取進度。

您可以使用Websocket庫,例如Rachet 除了所有花哨的詞外,websockets 是雙工通道,保持打開狀態,客戶端將信息發送到服務器,反之亦然。 如果你堅持使用 websockets,那么你只需要打開一個 websocket 連接,並在進度發生時向客戶端發送更新信息。

您可以使用推送通知,因為在這種情況下信息流是單向的。

您可以將實際進度保存在某處並通過AJAX polling反復請求它。

還有一些 hacky 方法,例如使用永久框架,但我不鼓勵您查找或使用它們。

我遇到過這種類型的問題 你可以 output 使用 ob_start() 和 ob_end_flush() 函數的腳本進度

<?php

function rappel($buffer)
{
  // remplace toutes les pommes par des carottes
  return (str_replace("pommes de terre", "carottes", $buffer));
}

ob_start("rappel");

?>
<html>
<body>
<p>C'est comme comparer des carottes et des pommes de terre.</p>
</body>
</html>
<?php

ob_end_flush();

?>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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