【发布时间】:2015-12-02 08:51:04
【问题描述】:
我有一个调用外部进程的网页。此过程将文本文件写入我服务器上的文件夹。我无法控制这个外部进程。
我正在尝试监视文件以查看其文件大小是否发生变化,在写入时它会发生变化。一旦外部进程停止写入,文件大小将保持不变。
我认为这样的事情可能会奏效:
<?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 的例子,这两个我都无权访问。
这个可以吗?
谢谢
更新 这似乎有效。
<?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";
?>
【问题讨论】:
-
您的 while 循环在首次启动时永远不会像旧的一样执行!= new!
-
谢谢。将
==更改为!=似乎效果更好,但 php 页面在文件完成写入之前完成。有什么想法吗? -
set_time_limit(120);在页面顶部将允许它运行 120 秒。它通常需要执行多长时间?
-
文档说忽略睡眠时间,所以理论上不需要设置得太高! php.net/manual/en/function.set-time-limit.php
-
所有文件操作都被缓存,因为 PHP 不是为此类操作而设计的,并且针对短突发性能进行了优化。请参阅下面的答案,因为它可以解决您的问题。
标签: php while-loop filesize