2015-12-02 46 views
3

我有一個調用外部進程的網頁。此過程將文本文件寫入到我的服務器上的文件夾中。我無法控制這個外部過程。PHP檢查文件大小以查看它是否改變

我試圖監視文件,看看它是否正在寫入文件大小的變化。一旦外部進程停止寫入,文件大小將保持不變。

我覺得這樣的事情可能工作:

<?php 

$old = 0; 
$new = 1; 

while ($old == $new) { 
    $old = filesize ('/http/test/test.txt'); 
    echo $old; 
    sleep(2); 
    $new = filesize ('/http/test/test.txt'); 
    echo $new; 
} 
echo $old; 
echo $new; 
echo "done"; 
?> 

但事實並非如此。如何暫停我的腳本,直到文件停止增大爲止?

這裏也有類似的問題,但我還沒有看到使用flock()lsof這兩個我沒有訪問的例子。

可以這樣做嗎?

感謝

UPDATE 這似乎是工作。

<?php 

$old = 0; $new = 1; 
$filePath = "/http/test/test.txt"; 

while ($old != $new) { 
    $old = filesize ($filePath); 
    clearstatcache(); 
    sleep(1); 
    $new = filesize ($filePath); 
    clearstatcache(); 
} 
echo "done"; 
?> 
+2

while循環將不會執行舊=新時,首先進行! – Codemonkey

+0

謝謝。改變'=='爲'!='似乎效果更好,但是在完成寫入文件之前,php頁面已經完成。有任何想法嗎 ? – Rocket

+0

set_time_limit(120);在頁面的頂部將允許它運行120秒。通常需要執行多長時間? – Codemonkey

回答

5

您需要在循環中調用clearstatcache()。

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

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

示例實現(這裏我用修改時間來檢查的變化,但可以使用文件大小代替):

$filePath = '/http/test/test.txt'; 
$timeInSeconds = 2; 

if (file_exists($filePath)) { 

    $fileModificationUnixTime = filemtime($filePath); 

    while (filemtime($filePath) === $fileModificationUnixTime) { 
    echo 'No changes found.'; 
    sleep($timeInSeconds); 
    clearstatcache(); // clears the cached result 
    } 

    echo 'Changes found'; 
} 
+0

謝謝。我測試過了,它返回到屏幕上,沒有找到變化。在文件完成創建之前找到的更改。我使用bash和'yes「HelloWorld」|來測試文件創建head -n 5000000> test.txt' – Rocket

+0

剛剛添加了一個更新到我原來的帖子。這似乎工作。 – Rocket