簡體   English   中英

如何自我更新PHP + MySQL CMS?

[英]How to self-update PHP+MySQL CMS?

我在PHP + MySQL上編寫CMS。 我希望它是可自我更新的(在管理面板中單擊一下)。 什么是最佳做法?
如何比較當前版本的cms和更新版本(應用程序本身和數據庫)。 它應該只下載zip存檔,上傳和覆蓋文件嗎? (但是如何處理不再使用的文件)。 如何檢查更新是否正確下載? 它還支持模塊,我希望這些模塊可以從cms的管理面板下載。
我應該如何更新MySQL表?

  • 將代碼保存在與配置和其他可變文件(上載的圖像,緩存文件等)不同的位置
  • 保持模塊與主代碼分開。
  • 確保您的代碼具有自行更改的文件系統權限(例如,使用SuPHP)。

如果您這樣做,最簡單的方法是完全下載新版本(無增量補丁),並將其解壓縮到與包含當前版本的目錄相鄰的目錄。 因為代碼目錄中不會有變量文件,所以您可以刪除或重命名舊文件並重命名新文件以替換它。

您可以將版本號保存在代碼中的全局常量中。

至於MySQL,除了為每個更改數據庫布局的版本制作升級腳本之外別無他法。 即使是更改表定義的自動解決方案也無法知道如何更新現有數據。

稍微更實驗性的解決方案可能是使用像phpsvnclient庫這樣的東西。

功能:

  • 列出給定SVN存儲庫目錄中的所有文件
  • 檢索文件的給定修訂版
  • 檢索兩個修訂版之間在存儲庫或給定文件中所做更改的日志
  • 獲取存儲庫最新版本

這樣,您可以查看是否有新文件,已刪除文件或更新文件,只能更改本地應用程序中的文件。

我認為這將有點難以實現,但好處可能是更容易,更快速地向CMS添加更新。

有一個名為SQLOO(我創建)的SQL庫試圖解決這個問題。 這有點粗糙,但基本思想是在PHP代碼中設置SQL模式,然后SQLOO更改當前數據庫模式以匹配代碼。 這允許SQL模式和附加的PHP代碼一起更改並以更小的塊更改。

http://code.google.com/p/sqloo/

http://code.google.com/p/sqloo/source/browse/#svn/trunk/example < - 示例

您有兩種方案需要處理:

  1. Web服務器可以寫入文件。
  2. Web服務器無法寫入文件。

這只是決定您是要解壓縮ZIP文件還是使用FTP來更新文件。 在以太網情況下,您的第一步是轉儲數據庫並備份現有文件,以便用戶可以在出現嚴重錯誤時回滾。 正如其他人所說,重要的是保留用戶可能在更新范圍之外定制的任何內容。 Wordpress很好地做到了這一點。 如果用戶對核心邏輯代碼進行了更改,他們可能足夠聰明,可以自行解決任何合並沖突(並且足夠聰明,知道單擊升級可能會丟失其修改)。

第二步是確保在瀏覽器關閉時腳本不會死亡。 這是一個真正不應該被打斷的過程。 您可以通過ignore_user_abort(true);完成此ignore_user_abort(true); 或其他一些手段。 或者,如果您願意,允許用戶選中一個框,上面寫着“即使我斷開連接也會繼續”。 我假設你將在內部處理錯誤。

現在,根據權限,您可以:

  • 將要更新的文件壓縮到system / tmp目錄
  • 將要更新的文件壓縮到主目錄中的臨時文件

然后你准備好:

  • 下載並解壓縮更新或en situ更新。
  • 將更新下載並解壓縮到系統的/ tmp目錄,並使用FTP更新Web根目錄中的文件

然后你可以:

  • 根據需要應用任何SQL更改
  • 詢問用戶是否一切正常
  • 如果事情變得糟糕,請回滾
  • 清理system / tmp目錄中的臨時目錄,或者用戶的web root / home目錄中的任何暫存文件。

最重要的方面是確保在事情變糟時可以回滾更改。 要確保的另一件事是,如果您使用/ tmp,請務必檢查暫存區域的權限。 0600應該做得很好。

看看Wordpress和其他人如何做到這一點。 如果您選擇的許可證和他們的許可證,您甚至可以重復使用某些代碼。

祝你的項目好運。

根據許多應用程序,CMS和其他方面的經驗,這是一種常見的模式:

  • 升級通常是單向的。 可以在發生故障時拍攝完整系統狀態的快照以進行恢復,但是恢復通常需要丟失自升級以來添加到系統的任何數據/內容/日志。 如果沒有正確轉換某些內容(例如數據庫表更改,內容轉換,外鍵約束,索引創建等),執行增量回滾可能會使數據面臨風險。如果您進行了回滾腳本無法進行的自定義,則尤其如此可能占了。
  • 升級文件與一些身份驗證/驗證方式打包在一起,例如md5或sha1哈希和/或數字簽名,以確保它來自可靠來源並且未被篡改。 這對自動升級過程尤為重要。 假設黑客利用漏洞並告訴它從流氓源升級。
  • 升級期間應用程序應處於脫機模式。
  • 應用程序應在升級后執行自檢。

我同意Bart van Heukelom的回答,這是最常見的做法。

唯一的另一種選擇是將CMS轉換為一組遠程Web服務/腳本和僅在一個位置托管的外部CSS / JS文件。

然后,使用CMS的每個人都將連接到您的中央“CMS服務器”,而他們(調用)服務器上的所有內容都是一堆腳本,用於調用執行所有處理和輸出的Web服務/腳本。 如果您沿着此路線走下去,則需要識別/驗證每個請求,以便返回給定CMS用戶的相應數據。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM