2011-07-15 84 views
0

有沒有任何方法來檢查id是由另一個進程從php腳本訪問或修改文件。我試圖使用filemtime(),fileatime()和filectime()函數,但我有一個循環中的腳本連續檢查,但似乎一旦腳本已被執行,它將只需要從第一次文件檢查..一個例子是將文件上傳到一臺FTP或SMB共享我嘗試這下面檢查文件的更改使用php

while(1==1) 
{ 
    $LastMod = filemtime("file"); 
    if(($LastMod +60) > time()) 
    { 
    echo "file in use please wait... last modified : $LastMod"; 
    sleep(10); 
    }else{ 
    process file 
    } 
} 

我知道這個文件是不斷變化的,但$的lastmod變量沒有更新,但最終的過程,並執行再次將從文件中拿起一個新的$ LastMod,但dosnt似乎更新每次在循環中檢查文件

我也試圖用這個看filesize(),但得到相同的症狀,我也看着flock()但在PHP之外創建或修改文件我不明白這是如何工作的。

如果任何人有任何解決方案,請讓我知道

感謝Vip32

PS。使用PHP處理文件,需要與mysql交互並查詢外部網站

回答

3

文件元數據功能全部關閉stat()輸出緩存其數據,因爲stat()調用是一個相對昂貴的功能。您可以清空該緩存以強制stat()獲取新數據clearstatcache()

還有其他一些機制允許您監視文件更改。不要在PHP中進行循環和重複stat()ing,而應考慮使用外部監視應用程序/腳本,該程序可以掛鉤操作系統提供的機制,並在文件確實發生更改時按需調用PHP腳本。

+0

你打我吧! :) – AlienWebguy

+0

在他的情況下,他的方式可能會更好,因爲他想知道什麼時候它最近沒有改變,而不知道什麼時候改變了。 – Paulpro

+0

@PaulPro:確實,在循環中調用「fuser」在linux中會讓你監視文件的活動用法。 –

0

添加clearstatcache();到您的循環:

while(true) 
{ 
    $LastMod = filemtime("file"); 
    clearstatcache(); 
    if(($LastMod +60) > time()) 
    { 
    echo "file in use please wait... last modified : $LastMod"; 
    sleep(10); 
    }else{ 
    process file 
    } 
}