2010-09-26 12 views
0

我在網站上有一堆頁面,可以在一個頁面上執行的操作取決於網站訪問者的數據庫中的信息。因此,假設訪客A進入頁面B並更新數據庫以顯示他們已加入某個組。然後訪問者進入頁面C,即組頁面。如果用戶是組成員,則顯示成員內容。如果不是,則會顯示非會員內容。這裏是問題(btw,頁面在php中):鎖定訪客,直到mysql查詢完成

在理想的世界中,在頁面B上運行的查詢將在用戶轉到頁面C之前立即完成,因此數據庫始終填充了最新的信息在成員國。但是,可能會發生服務器負載很重的情況,並且在用戶轉到頁面C時查詢未完成。因此,即使用戶是該組的成員,也不會反映在頁面C上因爲查詢尚未完成。

有沒有一種方法可以讓用戶在頁面上運行查詢,直到查詢完成後,他們嘗試訪問的任何其他頁面將在查詢完成後立即「掛起」並加載,或者直到給定的時間已經過去了?我可以手動創建這個系統,但是如果mysql和php已經有內置的東西,那會更好。

萬一它很重要,我使用LAMP服務器。

回答

0

在頁面B發生確認之前,訪問者是否不能顯示指向頁面C的鏈接?因此,他們通過將頁面表單提交到單獨的中間表單處理器頁面F來加入頁面B中的組,然後一旦完成(即,mysql插入成功完成),它將再次加載頁面B,並帶有適當的新信息和指示頁面C.

如果頁面C鏈接必須始終出現,或者用戶可以將其加入書籤,那麼頁面C也可以顯示記錄的日期,爲用戶提供「刷新」按鈕以防他的記錄不會與他剛纔所做的一樣,他不會讓他等一會再試一次。

在任何情況下,在MySQL中你正在討論的概念或行鎖定,但你試圖將它應用到多入口網站。我不知道在PHP任何此類內置的機制,但你可以假的,每個用戶的信號量,如果你想:

  • 用戶發起行動
  • PHP設置鎖定該用戶或者通過創造一個獨特的文件,或像內存緩存在內存存儲設置一個唯一的密鑰,或在用戶會話
  • 該鎖表示動作尚未結束
  • PHP執行動作(MySQL的插入,等等)
  • 一旦行動完成並確認,請取消鎖定

然後你可以使用存在的鎖,以確定閹頁C必須加載和顯示的東西描述給用戶,比如我的一個刷新按鈕的上方建議。

+0

用戶可以始終讓頁面C在另一個窗口中打開,然後在頁面B中的查詢仍在運行時刷新頁面。像這樣的情況很少發生,但它確實經常發生以獲得適當的對策。導航到頁面C不取決於用戶第一次訪問頁面B;用戶總是可以轉到頁面C.除非用戶是成員,否則不能查看組內容。如果他們不是會員,則會顯示不同的內容。我的道歉,應該明確表示。 – user396404 2010-09-26 13:13:34

+0

@ user396404我的手動鎖定機制應該工作,讓他們有一個指示,等待他們的行動從頁面B完成,然後,如果他們打開或已打開頁面C. – Fanis 2010-09-26 17:14:05

+0

謝謝。這正是我打算做的(使用memcached),但只是想看看是否有其他解決方案。 – user396404 2010-09-26 17:36:06

1

除非您喜歡複製的數據庫服務器或消息隊列系統,否則這實際上是單個MySQL服務器和PHP的工作原理。發佈頁面B上的UPDATE或INSERT,並且查詢不會返回,直到它被提交。因此,不要從頁面B返回任何HTML,直到完成查詢爲止 - 這是您不想要的,因爲您需要確保首先沒有錯誤。然後頁面C會很好。

+1

我可以想到在加載頁面B之前可以請求頁面C的多種方式。 – ysth 2010-09-26 10:04:13

+1

@ysth如果用戶必須在頁面B上執行一個明確的操作以打開頁面C,則不需要嘗試解決用戶中斷該操作並直接跳轉到頁面C的情況。 – nos 2010-09-26 10:23:40

+0

用戶可以始終讓頁面C在另一個窗口中打開,然後在頁面B中的查詢仍在運行時刷新它。像這樣的情況很少發生,但它確實經常發生以獲得適當的對策。導航到頁面C不取決於用戶第一次訪問頁面B;用戶總是可以轉到頁面C.除非用戶是成員,否則不能查看組內容。如果他們不是會員,則會顯示不同的內容。我的道歉,應該明確表示。 – user396404 2010-09-26 13:11:10

0

假設你有一個字符串,它唯一地標識當前用戶,說'identifyuser',選擇一個合理的超時,併爲要求所有數據庫活動之後給定的請求,並SELECT RELEASE_LOCK('identifyuser')任何其他數據庫活動前做一個SELECT GET_LOCK('identifyuser',timeout)

+0

每個用戶都有一個唯一的會話ID和一個唯一的用戶ID。但是,如何知道mysql引用? – user396404 2010-09-26 13:12:39

+0

@ user396404:您將該會話ID作爲第一個參數傳遞給函數。 – ysth 2010-09-26 16:19:43