2009-05-04 71 views
5

我們最近啓用了我們的服務器上APC,偶爾當我們發佈新的代碼或變化,我們發現已更改的源文件開始扔未反映在代碼中的錯誤,通常解析描述不存在的令牌的錯誤。我們通過對錯誤日誌所說的文件運行php -l來驗證這一點。通常重新發布可以解決問題。我們使用PHP 5.2.0和APC 3.01.9。我的問題是,有沒有人遇到過這個問題,或者有人認識到我們的問題是什麼?如果是這樣,你是如何修復它或我們如何解決它?問題與APC上發佈

編輯:我也許應該加入我們的出版過程中的一些細節。內容正在通過rsync從分段服務器推送到生產服務器。我們啓用apc.stat_ctime,因爲它表示這有助於使用rsync更平滑地運行。 apc.write_lock默認開啓,我們沒有禁用它。同上apc.file_update_protection

+1

什麼是APC(我能想到的所有APC在這方面都沒有意義)? – 2009-05-04 14:54:43

回答

7

聽起來像一個部分發布的文件正在被讀取和緩存爲打破。 apc.file_update_protection旨在幫助阻止此問題。

在php.ini:apc.file_update_protection integer

apc.file_update_protection設置 穿上緩存全新 文件的延遲。默認值爲2秒,其中 表示如果修改 文件上的時間戳(mtime)顯示 它在訪問 時不到2秒,則不會被緩存。 不幸的人誰訪問 這半書面文件仍將看到 古怪,但至少它不會 堅持。

以下問題正在編輯:一個原因我沒有看到這類的問題是,我把該網站的一個全新的複印件(SVN出口)。只有在完成之後它才能被Apache/Mod_php看到(請參閱我的回答How to get started deploying PHP applications from a subversion repository?

可能發生的另一件事情當然是,如果您正在更新,您可能正在更新依賴於尚未上傳的其他人。 Rsync只能保證單個文件的原子更新,而不是正在更改/上傳的整個集合。我認爲上傳該網站的另一個原因,然後才投入使用。

0

以前從未見過,即使我是APC的龐大用戶。 也許嘗試觸發一個腳本,每次在服務器上發送新代碼時清空APC操作碼?

0

當你得到一個解析錯誤文件,備份,然後repubish。帶上現在可用的相同文件,並用解析錯誤對該文件進行差異化。

4

這聽起來像APC不預成型或得到正確的文件統計信息。您可以檢查它以確保APC配置apc.stat設置正確。另一件你可以做的事情是在發佈新代碼時強制緩存清除apc_clear_cache()

0

ctime表示創建時間。每次執行更新時,都需要手動刷新整個緩存。

通過將apc.php腳本放在服務器上的某個位置,您可以輕鬆完成此操作。此腳本爲您提供緩存統計信息,並允許您完全刪除緩存。

該腳本附帶APC。

Hopet他的幫助, 埃弗特

0

這可能發生,因爲有你的代碼之間的不匹配,以及代碼的緩存版本。

例如,APC有一個緩存版本的User.php,但您對User.php或用戶使用的數據進行了更改。即使在部署後,緩存版本仍然在運行,因爲它尚未過期。

如果在部署時清除APC緩存條目,則此問題應該消失。