2011-10-05 46 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清除循环的每次迭代中的缓存。

相关问题