2011-10-05 102 views
1

我已經完成了一些PHP編碼,並且熟悉它的各個方面。在循環中使用filesize()PHP函數 - 返回相同大小

我做了一個PHP腳本,作爲一個cron作業,將從數據庫中提取數據,如果滿足某些條件,則會將一些信息寫入文件。

由於數據庫中可能存在多個結果,因此會執行循環以遍歷數據庫中的每個結果。

在那個循環中,我有另一個將數據寫入文件的循環。然後使用cron作業每分鐘調用一次該文件並運行bash腳本中的內容。

因此,它設置PHP循環來查看文件是否有任何使用filesize()函數寫入的文件。如果文件大小不爲零,則它將睡眠10秒鐘並嘗試再次讀取它。這裏是代碼:

while(filesize('/home/cron-script.sh') != 0) 
{ 
    sleep(10); 
} 

不幸的是,當文件大小運行時,它似乎在文件上放置某種鎖或什麼東西。 cron作業能夠正常執行bash腳本,並在腳本中的最後一個命令是零出文件:

cat /dev/null > /home/cron-script.sh 

但是,似乎一旦上述while循環啓動時,它在鎖定原始文件大小。舉個例子,我只是簡單地把在「出口」兩字在cron-script.sh文件,然後通過一個測試腳本運行:

while(filesize("/home/cron-script.sh") != 0) 
{ 
    echo "filesize: " . filesize("/home/cron-script.sh"); 
    sleep(10); 
} 

循環是無限的,將繼續顯示「文件大小:4 「當我輸入」退出「這個詞時。然後我會在終端發出命令:

cat /dev/null > /home/cron-script.sh 

然後在運行上面的測試腳本時清除文件。但是,它繼續說文件大小是4,並且永遠不會返回到0 - 因此使PHP腳本運行直到達到執行時間限制。

任何人都可以給我一些關於如何解決這個問題的建議嗎?實質上,我只需要一些方法來讀取文件大小 - 如果文件中有任何類型的數據,則需要循環執行睡眠例程,直到文件被清除。該文件應在一分鐘內清除(因爲cron作業每分鐘調用一次cron-script.sh文件)。

謝謝!

+0

嘗試清除文件大小緩存:http://php.net/manual/en/function.clearstatcache.php – hakre

回答

13

http://www.php.net/manual/en/function.filesize.php

注:本函數的結果會被緩存。有關更多詳細信息,請參閱clearstatcache()。

要解決這個問題,記得打電話filesize()之前調用clearstatcache()

while(filesize("/home/cron-script.sh") != 0) 
{ 
    echo "filesize: " . filesize("/home/cron-script.sh"); 
    sleep(10); 
    clearstatcache(); 
} 
0

filesize結果會被緩存。

您可以使用clearstatchace清除循環的每次迭代中的緩存。