如何使用PHP运行“背景”婴儿循环?

时间:2011-04-02 08:55:08

标签: php web-applications

我正在寻找一种检查目录中是否有新文件的方法。我可以用一些婴儿循环来做这个吗?当我说:

   <?php
        while (true) {
            $files = glob("../example/*.txt");
          $count_posts = $files !== false ? count($files) : 0;
            if ($count_posts > 0) {
                break;
            print("WE DID IT!!!!!!!");
            }
        }
        ?> 

发生了三件奇怪的事情:1。)页面将继续加载 - 我不能拥有2.)它不会打印“我们这样!!!!!!!!!” 3.)在有新文件之前,不会显示任何内容。我怎么能这样做?

2 个答案:

答案 0 :(得分:1)

简单的答案是,如果不使用套接字和/或Javascript,就无法做到这一点。在整个页面完全加载之前,PHP不会返回任何信息,在这种情况下,在调用break子句之前不会显示任何信息。

我有一个单独的脚本,每X秒通过setTimeout和AJAX检查由javascript轮询的文件夹中的新文件。

答案 1 :(得分:1)

至于遍历目录以检查文件,请使用DirectoryIterator,或者如果存在RecursiveDirectoryIterator的子文件夹。如果glob语句返回false或0,则while循环将陷入无限循环。

例如:

$iterator = new DirectoryIterator('../example');
foreach ($iterator as $path) {
  if ($path->isFile()) {
     if (strpos($path->getFilename(), '.txt') !== false) {
         print("WE DID IT!!!!!!!");
         break;
     }
}

或者使用递归目录迭代器..

$iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator('../example'));
foreach ($iterator as $path) {
   ...
}

如果您需要将此作为后台任务运行,则需要使用AJAX,正如Ben建议的那样。通过网页的正常PHP请求旨在加载所有内容并将内容显示回页面。 AJAX请求是在Web上执行异步请求的唯一方法。见http://api.jquery.com/jQuery.ajax/