簡體   English   中英

網頁和此網頁觸發的php腳本之間的通信

[英]Communication between web page and php script triggered from this web page

我在某些控制器中有一個myAction函數。 它具有一個類實例:

public function myAction() {

    ...
    $myAnalyzer = new Analysis();
    $myAnalyzer->analyze();
    ...
}

假設此函數analytics()需要10分鍾。 這意味着它將阻止my.phtml 10分鍾,這是不可接受的。 我想要的是先呈現my.phtml,然后在my.phtml上顯示來自analyzer()的中間結果。

function analyze() {

... 
    foreach($items as $rv) {

        ...
        ...
        // new result should be stored in db here 
    }

}

據我所知,這是不可能的,因為PHP中只有一個線程。 因此,我決定從my.phtml進行ajax調用以運行myAnalyzer實例。

第一個問題:是嗎? 我可以在myAction()中做到這一點而不會阻塞嗎?

好的,現在我在javascript或JQuery的幫助下,使用my.phtml中的某些腳本(例如worker.php)運行myAnalyzer。

第二個問題:我怎么知道每個foreach循環何時結束? 換句話說,如何讓worker.php向my.phtml或zend框架發送一些信號(或事件)。 我不想使用javascript計時器在一段時間內更新my.phtml。 我只需要知道這些,因為中間數據應該存儲在DB中。

第三個問題:當用戶離開頁面時,myAnalyzer陷入困境。 為此,我有這段代碼。

window.onbeforeunload = function(e) {

    // killer.php kills myAnalyzer
};

但是,javascript如何與myAnalyzer通信? 是否有類似process-id的內容? 我的意思是,當worker.php運行myAnalyzer時,它將在zend框架中注冊其進程ID。 並且當用戶離開頁面時,killer.php使用此process-id停止myAnalyzer。

我先感謝您的幫助。

第一問:是的,恐怕是正確的。

第二問:我不明白你在這里是什么意思。 請參見下面的代碼示例

foreach($data => $item) {
   ...
}
//code here will be executed only after foreach loop is done. 

第三問:看一下這個頁面。 您可以將其設置為false(但我想它已經是那樣了),並不時將某些內容發送給客戶端。 或者,您可以將其設置為true並檢查用戶是否仍通過connection_aborted函數進行connection_aborted 我的意思是,您可以使用ajax運行worker.php並配置您的請求,這樣瀏覽器就不會因為超時而斷開連接(因此,連接將在用戶停留在頁面上時保持連接)。 但是如果用戶離開頁面,它將關閉。

編輯:關於第二個問題。 有幾種選擇:

1)您可以使用一些共享內存(例如,memcached)。 並不時用另一個ajax請求呼叫服務器。 因此,在每個循環結束之后-您將一些值放入memcached中,並且在請求期間,您可以檢查該值並根據該值建立響應/更新頁面

2)有部分響應之類的東西。 使用XMLHTTPRequest可能會獲得一些響應,但是正如我所記得的那樣,由於許多瀏覽器不支持該響應,因此此刻並沒有真正的用處。 我對此沒有任何細節。 從未嘗試使用它,但我可以肯定地知道某些瀏覽器允許使用XMLHTTPRequest處理部分響應。

3)您可以使用不可見的iframe而不是XMLHTTPRequest來調用worker.php。 在這種情況下,您可以在其中放置javascript的地方發送一些內容,這將在parrent窗口中調用某個函數,並且該函數將更新您的頁面。 如果您想了解更多信息,那是長輪詢COMET的實現之一。 有一些陷阱(例如,您可能需要確保發送一些特殊的符號作為響應,以便在某些瀏覽器中執行它),但仍然可以使用(某些網絡瀏覽器聊天基於這個)。

2)和3)也很不錯,因為它將自動解決您的第三個問題。 同時1)可能更簡單,但是它不能解決第三個問題中的問題。

還有一件事-因為您將使用長時間運行的腳本,因此必須記住該會話可能會阻止其他任何請求的執行(如果使用了基於默認文件的PHP會話-肯定會發生)

暫無
暫無

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

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