這是一個來自PHP zend考試的問題,使用flock()來鎖定流只有在什麼情況下才能工作?
使用flock()來鎖定一個流只能保證在什麼情況下工作?
- 當在Linux環境中的本地文件系統中運行
- 當訪問本地文件系統的流
- 當在Windows環境下運行和訪問共享
- 當訪問一個雙向流
- 當訪問一個只讀流
這是一個來自PHP zend考試的問題,使用flock()來鎖定流只有在什麼情況下才能工作?
使用flock()來鎖定一個流只能保證在什麼情況下工作?
甲流有this set of operations - write
,read
,close
,flush
(強制性的,即使他們沒有OPS)和seek
,cast
,stat
,set_option
(可選)。當您請求文件鎖定時,set_option
操作是called。
就在這裏,您可以看到雙向或只讀與此無關。可以實現一個任意的包裝,使寫入和讀取有一定的效果,但尚未實現set_option
,因爲它是可選的。同樣,可以實現無操作write
操作,但在我的set_option
實現中處理文件鎖定。在Linux環境中運行也是無關緊要的,因爲重要的是流支持什麼。我承認它意味着「在Linux環境下從本地文件系統運行PHP」,而不是像「從PHP運行PHP」那樣,我承認它意味着「在Linux環境下運行本地文件系統」 Linux環境下的AFS文件系統「,如果意味着」在Linux環境中訪問支持本地文件系統的流「,這可能是正確答案,因爲下面描述了手動警告)。
其餘問題涉及STDIO流。現在,當檢查一個流是否支持stream_supports_lock
阻塞時,PHP實際上並沒有嘗試一個羣,它會通過set_option
操作傳遞一個特殊值來查詢「這個流是否支持文件鎖定」? STDIO流操作always responds it does,所以看起來所有剩下的兩個答案都是正確的。
但是,set_option
操作聲稱它支持文件鎖定的事實並未使其成爲真實。當你真的試圖獲得鎖,it may fail。那麼它何時能保證工作?當然不是Windows共享,因爲這些可以支持幾乎任何東西。我們留在「在本地文件系統上」。因此,答案是,通過消除
當訪問本地文件系統的流
但是請注意,(公認過時)warning in the manual:
羊羣()不支持在過時的文件系統(如FAT及其派生文件系統)上,因此在此[原文]環境下總是返回FALSE(對於Windows 98用戶尤其如此)。
哦,好問題。
Checking if a stream supports locking僅在5.3中添加,但似乎「始終」存在的streamWrapper example class has a stream_lock
method。 stream_lock
表明它也可以在streams that can be blocked上工作。
我不指望你可以植入一個套接字,所以看起來你的答案是#2:你可以放心地知道當流是一個(本地)文件時植絨一個流將工作。
(如何羊羣在遠程文件操作(NFS,CIFS)是由服務提供者遠程文件。有些老版本的各種NFS守護程序不支持羣可言,例如。)
自2000年以來,NTFS已成爲所有Windows版本上的默認文件系統.Flock應該在NTFS上正常工作。此外,FreeBSD和Solaris等其他UNIX相同的程序肯定會支持flock,這使得Linux特定的答案不正確,或者如果正確的話措辭很差。 – Charles 2010-06-23 01:43:11
@Cha好吧,我誤解了選擇。這絕對是第二個,因爲第一個說「運行」,而不是「訪問流」。 – Artefacto 2010-06-23 01:54:07
好點。鑑於確切的措辭,他們似乎都是不正確的。 – Charles 2010-06-23 02:02:23