2012-12-18 66 views
2

我很難理解這一點。 Ajax是異步的,很多是確定的......它在PHP上異步調用,並且PHP對數據庫有一個sql查詢。這意味着PHP sql查詢也是異步完成的,對吧?否則,它會破壞目的。但是,如果不使用Ajax,則PHP sql查詢將是同步的,是嗎?我知道如何把它用於代碼,但我只是困惑它如何在內部工作。使用Ajax進行異步PHP查詢?

+0

對於原始的AJAX調用,SQL查詢是「異步的」。與AJAX「異步」的含義是,它從Javascript的其餘部分異步處理 - 它不會阻止其他代碼執行。但從那時起,所有東西都必須是同步的,否則它將無法工作(不包括AJAX的'readystatechange')。 AJAX請求發送到服務器,服務器查詢數據庫,服務器響應,Javascript聽到該響應,並且AJAX在未被阻止時立即處理該響應。 – Ian

+0

因此不,PHP SQL查詢總是同步的,它是異步的HTTP請求。 – Ian

+0

現在它變得更清晰了。謝謝。你介意把你的評論作爲答案,以便我可以適當地給予它的優點嗎? – Wap

回答

3

對於原來的AJAX調用,SQL查詢是「異步的」。不要掛在過去的術語上。客戶端和服務器是完全獨立的,特別是在處理HTTP請求時,在這種情況下。與AJAX「異步」的含義是,它從Javascript的其餘部分異步處理 - 它不會阻止其他代碼執行。但從那時起,所有東西都必須是同步的,否則它將不起作用(不包括AJAX的readystatechange)。

AJAX請求發送到服務器,服務器查詢數據庫,服務器響應,Javascript聽到該響應,並且AJAX處理程序在其未被其他Javascript阻止時立即處理該響應。

因此不,PHP SQL查詢本身總是同步的;這是異步的HTTP請求。

UPDATE

作爲一個例子,這裏是AJAX的一個非常精簡,低的水平,多數圖書館以某種方式包裝:

var xhr= new XMLHttpRequest(); 
var params = "x=2&y=3"; 
var url = "/your/url"; 
xhr.open("POST", url, true); 
xhr.onreadystatechange = function() { 
    // The `xhr.readyState` changes based on the client's 
    // The `xhr.status` is set based on the server's response 
    // Normally, you check for `readyState` being 4 and `status` being 200 
    // meaning that the request is complete and the HTTP status code is 200 (good response) 
    if (xhr.readyState == 4) { 
     if (xhr.status == 200) { 
      // All good 
     } 
    } else { 

    } 
}; 
xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); 
xhr.send(encodeURIComponent(params)); 

xhr.send被調用時,它使異步HTTP請求到服務器,這就是關於Javascript的。 onreadystatechange偵聽器是在readyState更改時運行的。值爲4意味着它已經完成,並且status 200是你正在尋找的... 每當那就是。

任何事情都可能發生在服務器上。您可以進行「異步」(無關的)數據庫調用,以任何方式聯繫不同的服務器,無論出於何種原因(達到某個限制)或類似情況都會延遲。重點是在服務器返回響應之前客戶端(Javascript)上沒有任何已知信息。服務器可能會每次循環檢查數據庫很長一段時間,直到發生某種變化(長輪詢的一個例子)纔會響應。

+0

完美答案。謝謝 – Wap

2

好的,你幾乎是正確的,但這裏有一些規範。你對數據庫的查詢是異步的。請注意,您的PHP服務器將與客戶機創建一個開放且唯一的數據會話。現在,當一個頁面被請求時,客戶端會發送一個響應,其中包含一個腳本(可能是javascript),它將在客戶端機器上運行命令。在你的情況下,這些命令中的一些會對你的服務器進行異步調用,並且你的服務器會因爲會話而記住。然後根據您的服務器知道的會話,它將按照您的請求提供服務。你可以調用你的數據庫服務器或訪問會話變量,或者做一些可能在PHP中更容易的處理。然後,當處理完成時,服務器將基於唯一會話向所討論的客戶端發回響應。作爲一個重要的方面記錄,請記住,任何異步操作都將花費在服務器上的時間,並做它必須做的事情。如果您在您的客戶端腳本中引用變量,並在服務器完成其工作之前處理這些變量,那麼它們將在客戶端計算機上顯示爲錯誤(可能但很可能)。您的數據庫調用將按預期異步發生。