2015-12-21 57 views
7

我需要創建一個不能被其它腳本或程序被刪除鎖定文件的文件。我嘗試這樣做:如何鎖定對外部進程

$f = fopen($pidFile, 'w'); 
    fwrite($f, getmypid()); 
    flock($f, LOCK_EX); 

但任何其他進程從當前用戶開始可以刪除,即使文件句柄仍然由行書打開$f文件。如何解決這個問題,並防止其他人(即非PHP進程)刪除該文件?當進程退出時鎖會自動釋放?所有類似的問題都以RTM flock()結尾,但他們都沒有回答如何鎖定文件以抵禦外部進程。

OS是Linux 2.6.32-431.el6.x86_64

+2

'flock'是 「顧問」,不嚴格。使用[附加檢查](http://stackoverflow.com/questions/20771824/php-test-if-file-is-locked),然後再對腳本中的任何文件進行處理。如果是關於你自己的PHP腳本的話,這將起作用。如果是關於外部過程 - 那麼'flock'不能保存案例。 –

+1

正如我在我的問題提到的,我需要鎖定文件,以防止外部進程刪除(即非PHP太) –

回答

5

flock Linux上默認的,這意味着它不能阻止任何其它進程操縱該文件使用「諮詢鎖定」。請參閱PHP手冊中的說明。

flock()在Windows上使用強制鎖定而不是建議鎖定。通過fcntl()系統調用支持的通常機制,Linux和System V操作系統也支持強制鎖定:也就是說,如果正在討論的文件已設置了setgid權限位並清除了組執行位。在Linux上,文件系統也需要使用mand選項進行掛載才能工作。

另見https://www.kernel.org/doc/Documentation/filesystems/mandatory-locking.txt

的文件被標記爲用於強制閉鎖的候選通過將組ID位在其文件模式,但除去所述基團的執行位。這是一個否則 無意義組合,並且選擇由系統V實施者以免 打破現有用戶程序。

注意,組ID位通常是自動由內核時 一個setgid的文件寫入清除。這是一項安全措施。內核已經 修改承認強制鎖候選人的特殊情況和 副歌從清除此位。同樣,內核已被修改爲不是 以運行具有setgid特權的強制鎖定候選項。

而且介意警告:

甚至沒有根可以覆蓋強制鎖,所以失控的進程可以發泄 破壞,如果他們鎖定的重要文件。解決方法是在嘗試讀取或寫入文件之前更改文件 權限(刪除setgid位)。

+1

謝謝你的解釋。但如何在PHP中實現這個解決我的問題? –

+0

@AlexanderPravdin嘗試https://books.google.de/books?id = mCpnlNYzqOQC&lpg = PA247&ots = qAWSgskqZ6&dq = mandatory%20file%20locking%20php&hl = de&pg = PA246#v = onepage&q = mandatory%20file%20locking%20php&f = false – Gordon

+0

謝謝,但flock()函數不會鎖定外部進程(因爲我可以看到本書中解釋的內容)。但是從249頁開始,更進一步被隱藏起來,需要購買這本書。 –