2010-03-13 32 views
20

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

回答

8

稍微更具實驗性的解決方案可能是使用類似phpsvnclient庫。

配備特點:

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

這樣你可以看到,如果有新的文件,刪除的文件或更新的文件,只更改您的本地應用程序中的文件。

我偵察這將是一個有點難以實現,但效益很可能是,它更容易和更快地更新添加到您的CMS。

+2

我試過這個方法,雖然聽起來像是一種很好的方式,但這將是文件權限方式中的一種。 您必須希望所有文件都可以被覆蓋,並且用戶沒有對文件進行編輯。 (如果他們做你的svn更新將會非常糟糕) 如果你打算製作一個公共可用的CMS,我會避免使用這種方法,因爲你的用戶會依賴它,所以你應該去找一個不是取決於文件權限。 – RJD22 2010-03-25 08:40:07

+0

'RJD22'那麼你的解決方案是什麼?我認爲無論使用什麼方式,php-svn或下載zip壓縮文件都會出現文件權限問題。 – SaltLake 2010-03-25 10:32:35

+0

那麼,不要讓你的用戶編輯核心文件,而是讓他們擴展它們(就像大多數PHP框架一樣)。 此外,如果你只是分發「SVN更新系統」。您可以像更新它一樣安裝cms。這樣你只需要改變安裝文件夾的文件權限,文件的所有者就是php。 – Les 2010-03-25 11:46:31

10
  • 保持你的代碼在一個單獨的位置從配置和否則變量文件(上傳的圖片,高速緩存文件等)
  • 保持模塊從主代碼分開爲好。
  • 確保您的代碼具有文件系統權限以更改自身(例如,使用SuPHP)。

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

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

至於MySQL,沒有別的辦法可以爲每個版本改變數據庫佈局的升級腳本。即使自動更改表定義的解決方案也無法知道如何更新現有數據。

+0

+1這是除1點即文件權限更好的方法之一。你可以像wordpress那樣做。通過ftp連接覆蓋文件。這樣你就不會遇到文件權限問題 – RJD22 2010-03-25 08:41:58

+1

我通常建議使用像suexec或suphp這樣的東西讓腳本以其所有者的權限運行,其中包括更改自己的權限。這使得許多事情變得更容易,而不僅僅是這些。 @ RJD22 – 2010-03-25 10:14:07

+0

我討厭WordPress的更新方式。 – SaltLake 2010-03-25 10:34:25

0

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

唯一的其他選擇是將您的CMS變成一堆遠程Web服務/腳本以及您只在一個位置託管的外部CSS/JS文件。

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

2

你有兩種情況處理:

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

這只是決定你是否將解壓ZIP文件或使用FTP更新文件。在以太網情況下,您的第一步是轉儲數據庫和現有文件的備份,以便在出現可怕錯誤時用戶可以回滾。正如其他人所說的,保持用戶可能在更新範圍之外定製的任何東西都很重要。 Wordpress很好地做到了這一點。如果用戶對核心邏輯代碼進行了更改,他們可能足夠聰明,可以自行解決任何合併衝突(並且足夠聰明,知道一次點擊升級可能會失去其修改)。

你的第二個步驟是確保如果在瀏覽器關閉腳本不會死。這是一個真正不應該被打斷的過程。您可以通過ignore_user_abort(true);或其他方式完成此操作。或者,如果您願意,可以讓用戶選中一個框,上面寫着「即使斷開連接仍然繼續」。我假設你會在內部處理錯誤。

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

  • 壓縮的文件被更新到系統的/ tmp目錄
  • 壓縮文件進行更新,以在主目錄
  • 臨時文件

那你就準備:

  • 下載並解壓縮更新en situ,或者到位。
  • 下載並更新解壓縮到系統的/ tmp目錄,並使用FTP在網站根目錄更新文件

然後,您可以:

  • 根據需要應用任何SQL更改
  • 詢問用戶是否一切正常
  • 如果事情變得糟糕,則回滾
  • 清理system/tmp目錄中的臨時目錄或任何staging fil es在用戶的web根目錄/ home目錄中。

最重要的方面是確保在事情變糟時能夠回滾更改。另一件要確保的是,如果你使用/ tmp,一定要檢查你的臨時區域的權限。 0600應該做得很好。

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

祝您的項目順利。

+0

我將使用第一種場景:'Web服務器可以寫入文件'。 關於 *的好建議*如果出現問題,則轉儲數據庫和現有文件的備份; *以確保您的腳本在瀏覽器關閉時不會死亡; 謝謝。 – SaltLake 2010-03-23 15:30:19

2

基於與一些應用程序,CMS和經驗,否則,這是一個常見的模式:

  • 升級一般是單向的。可以爲失敗時的恢復創建完整系統狀態的快照,但恢復通常需要丟失升級後添加到系統的任何數據/內容/日誌。如果某些東西沒有正確轉換(例如,數據庫表更改,內容轉換,外鍵約束,索引創建等),則執行增量回滾可能會使數據處於危險之中。如果您定製了回滾腳本,則尤其如此可能會考慮。
  • 升級文件與一些認證/驗證方式打包在一起,例如md5或sha1哈希和/或數字簽名以確保其來自可信來源且未被篡改。這對於自動升級過程尤其重要。假設一名黑客利用了一個漏洞,並告訴它從一個流氓源升級。
  • 升級過程中,應用程序應處於脫機模式。
  • 應用程序應在升級後執行自檢。