2016-12-07 55 views
0

我目前正在申請一個MySQL數據庫來計算一些計數和PDO的總和。這個過程可能需要一段時間,如果用戶突然想要瀏覽另一個頁面,用戶可能會停留在他的瀏覽器前。PDO非鎖定查詢:可能嗎?

我想弄清楚是否可以用PDO啓動MySQL查詢,輸入循環直到查詢結果可用或用戶離開頁面(connection_aborted()),最後發送結果,如果用戶仍然連接,否則中止MySQL查詢。它會是這樣的:

<?php 

$objPDOStatement = $objPDO->prepare(" 
    SELECT count(*) 
    FROM my_huge_table 
    WHERE <<complex_condition>> 
"); 

$objPDOStatement->execute($arrParameters); 

while (
    (connection_aborted() == 0) 
    && (! $objPDOStatement->resultsAvailable() 
) { 
    usleep(10000); 
} 

if (connection_aborted() == 0) { 
    echo "RESULTS"; 
} else { 
    $objPDOStatement->cancel(); 
} 

這可能嗎?如果是這樣,怎麼樣?我想這樣做是爲了讓用戶不必等待Web服務器(php)完成當前的腳本/頁面,即。在服務下一個請求的腳本/頁面之前,不要等待MySQL返回結果(如果這些結果最終未被使用)。

謝謝。

+0

你可以用幾種不同的方法做到這一點。也就是說,使用Web套接字連接到服務器,並讓它等待結果,或根據請求將其添加到任務隊列並使用任務運行器運行,然後只需瀏覽器輪詢以查看結果是否準備就緒等。 – JimL

+0

您還可以使用Queue服務器,如RabitMQ,ActiveMQ,Amazon Simple Queue Service(如果您的應用程序託管在Amazon AWS上),MQTT等。 您在隊列中發送請求,然後工作人員接管該任務,但您的應用程序獨立於Worker的執行。根據您正在使用的隊列系統,您還可以不時詢問工人是否完成執行以及工人完成時是否收集結果。 – Dragos

+0

@JimL,問題不是客戶端,而是服務器端:PHP不會處理給定客戶端的任何新請求,而另一個當前正在運行。在這裏,即使Ajax調用被使用並且可能被中止,帶有SQL語句的PHP腳本也會繼續運行,直到PDO返回數據集爲止。 – MaxAuray

回答

0

異步查詢僅在mysqli中可用,但不在PDO中。

但是,通常只需通過AJAX調用即可獲得什麼。

+0

這不是問題。 *請求*已經由Ajax調用處理。但是,即使Ajax調用被中止,只要PDO沒有結束其當前作業,PHP腳本就會繼續運行。因此,Apache等待PHP結束其當前進程以處理隊列中的下一個請求。這就是爲什麼我想這樣做的原因:能夠檢查用戶是否仍然連接並立即結束當前進程,如果不是釋放Apache隊列上的鎖定。 – MaxAuray