2015-04-22 69 views
-1

我注意到像堆棧溢出和Reddit這樣的網站,他們有能力將整個網站置於「只讀」模式,例如在維護期間。如何設計「只讀」網站模式?

我的問題是,需要什麼樣的架構才能做到這一點?它是否發生在數據庫級別,即某些用於「鎖定」數據庫寫入的命令?這是一個有點寬泛的問題,所以將它縮小我感興趣的實現:

  • PHP
  • MySQL的
  • Laravel
+4

不,數據庫不會設置爲只讀模式,儘管您也可以這樣做以確保安全。只需鎖定用戶界面。你會希望這個標誌在任何地方都可用,所以也許在基礎控制器類中有一個getter方法? – halfer

+0

可能與將'readonly = 1'設置在某個配置文件中一樣簡單,並且每個編寫操作的代碼塊都會檢查該標誌。設置數據庫只讀是可行的,但最有可能殺死整個代碼庫,因爲任何寫入查詢都會失敗,並且無處不在地發出「致命錯誤:無法寫入更改」。 –

+0

你真的只需要決定什麼是網站的最貴(通常最不重要)的操作 - 然後添加機制來禁用它們。在reddit的情況下,包括用戶登錄,上/下投票,發佈和評論。討厭成爲一個堅持者,但是如果你沒有高級代表,我會很快看到這個問題被關閉和低估。我覺得這個問題會更適合程序員.stackexchange.com? – sjagr

回答

1

無論是數據庫本身被鎖定否則,我們無法確定。
但我會說這不太可能,特別是因爲無論如何你必須改變前端行爲,以避免大量的錯誤信息。

取而代之的是,所有接口(前端和API,如果存在的話)被告知鎖定,大概通過配置變量鎖定,然後不會對數據庫執行任何寫入操作,甚至可能使用本地緩存而不是讀取來自數據庫。

我沒有關於StackOverflow的內幕消息,但我想不出任何其他方式可以正常工作。

至於你的「落實」:

在MySQL的水平,你真的不應該做任何事情,特別是因爲你可能需要修的過程中更改數據庫中的某些東西。

在PHP中,你可以做這樣的事情的API或所有的GET/POST目標網頁:

if(!$config['readonly']) 
{ 
    $db->query('UPDATE `someTable` SET `whatever` = "whocares"'); 
} 

與同爲前端:

$template->renderViewButton(); 
if(!$config['readonly']) 
{ 
    $template->renderUpdateButton(); 
    $template->renderLikeButton(); 
} 

只是隱藏任何元素這會改變數據庫中的東西,並且不要忘記也限制接收頁面,因爲任何具有一些開發知識的人都可以製作自己的HTTP請求,並且如果您不安全,可能會破壞您的網站(相同原因添加readonly到HTML <input>是不夠的)。