2010-06-22 43 views

回答

5

甲流有this set of operations - writereadcloseflush(強制性的,即使他們沒有OPS)和seekcaststatset_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用戶尤其如此)。

+0

自2000年以來,NTFS已成爲所有Windows版本上的默認文件系統.Flock應該在NTFS上正常工作。此外,FreeBSD和Solaris等其他UNIX相同的程序肯定會支持flock,這使得Linux特定的答案不正確,或者如果正確的話措辭很差。 – Charles 2010-06-23 01:43:11

+0

@Cha好吧,我誤解了選擇。這絕對是第二個,因爲第一個說「運行」,而不是「訪問流」。 – Artefacto 2010-06-23 01:54:07

+0

好點。鑑於確切的措辭,他們似乎都是不正確的。 – Charles 2010-06-23 02:02:23

1

哦,好問題。

Checking if a stream supports locking僅在5.3中添加,但似乎「始終」存在的streamWrapper example class has a stream_lock methodstream_lock表明它也可以在streams that can be blocked上工作。

我不指望你可以植入一個套接字,所以看起來你的答案是#2:你可以放心地知道當流是一個(本地)文件時植絨一個流將工作。

(如何羊羣在遠程文件操作(NFS,CIFS)是由服務提供者遠程文件。有些老版本的各種NFS守護程序不支持羣可言,例如。)

+0

阻止模式與文件鎖定無關。 – Artefacto 2010-06-23 01:01:14

+0

事實上,我誤解了參考。誤導性句子已刪除。 – Charles 2010-06-23 01:35:40

相關問題