2013-03-18 117 views
-1

有沒有一種方法可以安全地替換服務器上的php文件,而它正在被用戶執行?我的意思是 - 我是否必須尋找適當的沉默時間來上傳具有相同名稱的新版本文件?我知道我們的經驗是,在繁忙時間更新導致像那些文件中的錯誤而被截斷了,但我不知道究竟是什麼的推移有: - 如果PHP文件被解析第一和投入操作碼,我會承擔這個碼應該執行到儘管原來的文件剛剛更改結束。 是不是因爲php文件被修改了,這個操作碼不再有效,而是試圖「重新加載」 - 在這種情況下,甚至連APC都不會幫忙? 或者更確切地說,當讀取php到操作碼中斷時出現錯誤? 或者,也許文件首先被刪除,然後被寫入的速度比被讀取的速度慢,並且該讀數達到當前結束? 無論如何 - 是否有任何指令保護PHP文件免受併發修改和閱讀?有沒有工具?在linux apache服務器上執行php文件時會發生什麼情況?

+2

這不是重複的問題,顯然是一些重複的獵人沒有時間讀它不夠徹底。包含可執行代碼的文件與讀取json文件有所不同,它被解析和解釋,不僅被讀取!他們不但沒有回答,而且阻止了我找到... – 2013-03-19 13:40:53

+0

您的問題缺乏格式和清晰度。如果您可以編輯它以改善兩者,我會再看一次。就目前而言,我很難遵循你所問的問題。 – 2013-03-19 14:00:57

回答

1

一般情況下,像一個「維護模式」是非常有用的。它可以通過很多不同的方法來實現,例如更改文檔根目錄或使用臨時重定向配置。

在特定情況下,你可以交換文件。當它從Web訪問時,解析器將其加載到RAM中並在那裏使用它。在複製過程中,它被鎖定,所以如果再次訪問,PHP會給你一個錯誤。

移動是大多數系統上的原子操作,所以我會建議以不同的名稱上傳文件並將其「移動」到正確的位置。

+0

我忘了補充 - 我在通過FTP上傳同名時出現錯誤,但由於上傳持續了很長時間,我開始通過以不同名稱上傳文件並將其重命名到服務器上來執行此操作,但我沒有最近發生的任何錯誤,認爲我是如此快速和幸運,並想知道如何處理這件事。我不知道它是正式的原子 - 這意味着當這個文件有一半的名字時,甚至不會有一微秒? :-) – 2013-03-18 14:05:52

+0

@ n-dru在同一文件系統上,它至少非常接近原子操作。所以試試吧。如果仍然有問題,可以合併符號鏈接 - 用符號鏈接替換當前版本的PHP文件。如果您上傳新版本,請將符號鏈接更改爲新版本。 – zero0 2013-03-18 14:18:46

+0

「非常接近」聽起來並不令人信服:-)我試圖弄清楚我應該如何替換文件,我仍然不知道「每個人」是如何做到的...... – 2013-03-18 15:50:41

0

這是絕對安全的。
執行PHP代碼之前是interpreted
當文件正在執行時,它沒有被鎖定。
沒有什麼值得擔憂的。

+1

PHP不是讀取文件的東西 - Apache就是。 Apache並沒有鎖定文件(就像你提到的那樣),這意味着*技術上*該文件可能被中間讀取覆蓋,這實際上可能會導致問題(並且我之前也收到了解析器錯誤) 。 – newfurniturey 2013-03-18 13:47:35

1

不要緊,它鎖定或不鎖定文件。

在linux下舊的文件句柄將指向舊文件沒有文件名(畢竟手柄閉合文件將被刪除)。新文件可以以相同的名稱存在。

相關問題