2009-09-29 81 views
0

我的AJAX搜索程序不斷向PHP詢問特定搜索項的結果。 PHP腳本的開始通過MySQL數據庫讀取並初始化,因此如果PHP不斷重新啓動,它將不得不讀取數據庫數百萬次。如果我可以保持它活着並讓一個正在運行的PHP腳本實例提供多個愚蠢的AJAX請求,我相信性能會得到改善。如何處理PHP中的多個AJAX請求?

你是如何做到這一點的?使用服務?這可以通過服務完成嗎?

+0

這是用於標記系統嗎?沒辦法,您可以解析一次關鍵字的文本,並找到關鍵字變成鏈接一勞永逸嗎?也許可以解釋你打算做什麼。 – pixeline 2009-09-29 19:29:31

+0

基本上我有一個AJAX請求應該查詢的PHP腳本。我不確定我將如何去做AJAX部分,但我想先了解PHP方面。 – 2009-09-29 19:31:45

回答

1

如何存儲在一個會話變量分貝的結果嗎?如果關鍵字不在會話中(會話允許在頁面刷新之間傳輸變量值),則首先檢查,如果不是,則執行db查詢。

存儲它:

$_SESSION['storedQueries']['keyword']= 'its definition, from the database'; 

尋找它:

$index= array_search('keyword',array_keys($_SESSION['storedQueries'])); 
    $result = ($index) ? $_SESSION['storedQueries'][$index] : 'nothing found, you should do a db query'; 

AJAX的部分是很容易的,如果您使用的是JavaScript庫,如jQuery:

$('#resultZone').load('find.php',{keyword: $('input.search').val() }); 
+0

會話變量是否通過HTTP發送? – 2009-09-29 20:24:14

+0

來自doc:「訪問您的網站的訪問者被分配了一個唯一的ID,即所謂的會話ID,它可以存儲在用戶端的Cookie中,也可以在URL中傳播。」 – pixeline 2009-09-29 23:45:41

2

PHP沒有長壽命對象或線程或請求之間共享狀態的概念,每個請求始終從零開始(excep t當然是會話狀態)。您可以通過緩存到磁盤或內存來模擬長期存在的對象(請參閱memcached)。

當腳本初始化時,您是否有特別的理由要讀取整個數據庫?

1

如果搜索結果與多個用戶類似,我通常會創建一個緩存文件並在其中序列化結果集。作爲文件名,我可以使用包含搜索查詢和可能用戶組的字符串的md5sum。然後,當Ajax需要數據時,我只需要檢查文件是否太舊,如果不是,我只需要將它發送到客戶端,或者甚至可以將Ajax http請求重定向到文件(假設它的格式正確) 。如果文件太舊,我只是用新的內容刷新它。

對於量大的網站,memcached通常是更好的選擇。而且還有一些php緩存幫助和SQL連接池降低了打開SQL連接的開銷。

0

連接到數據庫是一項非常昂貴的操作,您可以通過緩存結果來解決該問題,查看Zend_Cache並查看它如何幫助您解決頭痛問題。