我目前正在申請一個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返回結果(如果這些結果最終未被使用)。
謝謝。
你可以用幾種不同的方法做到這一點。也就是說,使用Web套接字連接到服務器,並讓它等待結果,或根據請求將其添加到任務隊列並使用任務運行器運行,然後只需瀏覽器輪詢以查看結果是否準備就緒等。 – JimL
您還可以使用Queue服務器,如RabitMQ,ActiveMQ,Amazon Simple Queue Service(如果您的應用程序託管在Amazon AWS上),MQTT等。 您在隊列中發送請求,然後工作人員接管該任務,但您的應用程序獨立於Worker的執行。根據您正在使用的隊列系統,您還可以不時詢問工人是否完成執行以及工人完成時是否收集結果。 – Dragos
@JimL,問題不是客戶端,而是服務器端:PHP不會處理給定客戶端的任何新請求,而另一個當前正在運行。在這裏,即使Ajax調用被使用並且可能被中止,帶有SQL語句的PHP腳本也會繼續運行,直到PDO返回數據集爲止。 – MaxAuray