簡體   English   中英

在后台運行PHP腳本時未加載HTML

[英]HTML not loading while PHP script running in background

我目前正在創建一個股票市場模擬,並在用戶登錄模擬的那一刻開始工作。 我有一個PHP腳本,它將為公司產生四倍的確定價格,並在運行時將其更新到我的MySQL數據庫中。 我目前有以下代碼:

PHP:

if (isset($_SESSION['userId']))
{
  $isPlaying = 0;
  while ($isPlaying <= 3)
  {
    $priceTemp = (rand(3300, 3700) / 100);
    $sql = "UPDATE pricestemp SET price = $priceTemp WHERE companyName = 'Bawden';";
    mysqli_query($conn, $sql);
    sleep(1);
    $isPlaying++;
  }
  echo '<h1>Welcome to the simulation</h1>';
}

我的目標是,一旦用戶登錄到模擬中,這些更新就會在后台發生。 每秒刷新數據庫時,將顯示更新的價格,這是我的目標之一。 但是,我仍然希望將HTML加載到頁面上(說“歡迎使用模擬”),同時以更新的價格每秒更新數據庫。

到目前為止,當我登錄時,我必須等待4秒鍾才能加載HTML。 將來,我希望它能不斷更新,直到滿足特定條件為止,但是當我較早地設置了無限循環時,HTML永遠不會加載。

我該怎么做才能使HTML登錄后即可加載,並在后台在MySQL數據庫中生成和更新價格,而不會延遲執行任何一項任務?

您對基於Web的請求如何工作有基本的誤解。

您需要了解的是PHP是一種服務器端語言。 PHP生成HTML,CSS,JavaScript,JSON或所需的任何其他形式的數據的任意組合,並在完成后將其發送到Web瀏覽器。 在執行此操作的同時,它還可以管理數據庫中的數據或執行任何其他數量的操作,但是在完成所有設置之前,它永遠不會發送Web瀏覽器可以利用的內容。 因此,如果您處於無限循環之內,它將永遠不會結束,因此不會將任何內容發送回Web瀏覽器。

為了解決這個問題,您需要使用“ 異步JavaScript ”(通常稱為“ ajax ”)。 具體來說,您首先要在一個請求中向Web瀏覽器發送一些初始HTML,然后立即終止該請求。 這允許用戶看到內容而無需無限期地等待。 然后,在Web瀏覽器端,您可以使用JavaScript自動將第二個請求發送到服務器。 在對服務器的第二次請求期間,您可以執行數據處理並在完成顯示給用戶后發送一些數據。

如果要定期更新顯示給用戶的內容,則將重復第二個請求以刷新顯示在用戶網頁上的內容。

每當您在網站上看到某種“實時”更新時,它就不會來自與Web服務器的單一持久連接,而是一系列重復的,分散的請求,這些請求會定期刷新您所看到的內容。


細分后,標准的Web請求工作流程如下所示:

  1. Web瀏覽器向Web服務器詢問該網頁。 Web瀏覽器等待答復。
  2. Web服務器生成網頁並將該網頁發送到Web瀏覽器。 Web服務器已完成。
  3. Web瀏覽器接收該網頁並將其顯示給用戶。 Web瀏覽器停止等待回復。
  4. Web瀏覽器運行它需要運行的所有JavaScript,並從Web服務器請求數據。 Web瀏覽器等待答復。
  5. Web服務器處理該請求,並將請求的數據發送回Web瀏覽器。 Web服務器已完成。
  6. Web瀏覽器接收請求的數據並更新網頁上的HTML,以便用戶可以看到它。 Web瀏覽器停止等待回復。

如您所見,每個系列的請求都是:1)由Web瀏覽器發起,2)由Web服務器處理,以及3)Web服務器完成后,然后由Web瀏覽器處理來自Web服務器的任何答復。 因此,每個請求都通過browser -> server -> browser 如果在上面添加步驟7.8. .和9. ,我們將看到它們重復完全相同的模式。

如果要避免將JavaScript添加到組合中,而是希望每次都刷新整個頁面,則可以縮短數據處理時間。 優化數據庫調用,修復基礎結構(確保服務器和數據庫具有LAN連接,硬件足夠好,等等),使代碼更高效...執行所需的所有操作以保持處理時間最小。


所有這些都經過簡化,並非100%准確,但是希望可以幫助您解決特定問題。 所有這些的簡短版本是:您不能以現在的處理方式同時顯示HTML 處理數據。 您需要從根本上改變您的工作流程。

您必須在2個網絡呼叫中執行此操作。 第一個網絡調用應獲取html。 然后,您必須使用Javascript觸發另一個調用來更新您的數據。 一旦該api調用返回,它將更新html。

基於前端的請求頻率來管理后台操作的頻率的調度模型是一個非常困難的問題。 這也是您不需要解決的問題。 當沒有人看的時候,不需要更改數據。 您只需要存儲上次查看數據的時間,並將更大的增量應用於較早的數據。

暫無
暫無

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

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