【问题标题】:Search and open for file搜索并打开文件
【发布时间】:2013-12-23 12:07:07
【问题描述】:

到目前为止,我有一个脚本,它在当前目录中查找指定的文件,如果不存在,它将进入一个目录并再次搜索。

如果文件存在,则脚本可以正常工作,但如果不存在,则脚本会继续运行,直到脚本被取消超过 30 秒,即使有一个计数器来限制执行到位。

$path = 'log.log';

$file_exists = 0;

$search_count = 0;
$search_limit = 3;

while($file_exists == 0) {
    while($search_count < $search_limit) {
        if(file_exists($path)) {
            $file_exists = 1;
            $search_count = $search_limit + 1;

            $resource = fopen($path, "r");  
            while (!feof($resource)) {
               echo fgetss($resource);
            }
            fclose($resource);
        } else {
            $path = '../'.$path;
            $search_count++;
        }
    }
}

【问题讨论】:

  • 如果文件不存在,则外部 while 是无限的,因为永远不会调用 $file_exists = 1;

标签: php file search while-loop timeout


【解决方案1】:

我认为您正在寻找这样的东西:

$path = 'log.log';
$file_exists = false;
$search_count = 0;
$search_limit = 3;

while (!$file_exists and $search_count < $search_limit) {
    if(file_exists($path)) {
        $file_exists = true;
        $resource = fopen($path, "r");
        while (!feof($resource)) {
           echo fgetss($resource);
        }
        fclose($resource);
    } else {
        $path = '../'.$path;
        $search_count++;
    }
}

编辑:如果您只是在log.log-文件的内容之后,您可以像这样使用file_get_contents($path)

...
if(file_exists($path)) {
    $file_exists = true;
    $contents = file_get_contents($path);
    echo $contents;
}
...

查找有关file_get_contents 方法here 的更多信息。

【讨论】:

  • 啊,这是一个如此简单的修复!非常感谢!
  • 不客气 ;) 一个小提示:这段代码开始在 current 文件夹中寻找日志文件。如果您想开始寻找像folder/log.log 这样的另一条路径,您必须修改代码。因为如果在“文件夹”中找不到文件,$path = '../'.$path 行将给出:../folder/log.log。但是你想要的是folder/../log.log。为此,您可以在开头将变量$path 分开:$dir = 'folder/'$file = 'log.log',并修改相关行:file_exists($dir.$file)file_get_contents($dir.$file)$dir = $dir.'../'
  • 但是如果没有找到文件$path = '../'.$path' 会被执行,那么它会将$path = 'log.log' 变成$path = '../log.log' 分配它作为新的$path。如果再次找不到它,它只是将另一个../ 附加到$path 的开头,因此使其$path = '../../log.log' 基本上在每次尝试后查找一个目录,直到找到它
  • 如果你想在当前目录中开始搜索并在目录树中搜索你的方式是没有问题的。但是,例如,如果您从路径folder/log.log 开始搜索,您最终会得到../../../folder/log.log。但是这样你只能在“文件夹”目录中搜索,而不是在它的“兄弟姐妹”(在同一个父目录中)中搜索。要在这些“兄弟”目录中也进行搜索,您必须在文件名之前插入“../”,例如:folder/../log.log,因为这与:log.log 相同,folder/../../log.log 相同如:../log.log,等等。
  • 啊,我明白了。尽管这对未来的项目很有用,但对于这个特定的场景,我正在寻找的文件永远不会在同级文件夹中。如果它不在当前的树中,它必须在它上面的那个中,或者在上面的那个中,但它永远不必回到树下
【解决方案2】:
while($file_exists == 0)

将是无限的,因为您只在找到文件时将$file_exists 设置为1

假设文件不存在,那么内部循环只会运行3次,而外部循环会无限运行(虽然没有任何可执行语句)

编辑:

您可以将条件合并为

while($file_exists == 0 && $search_count < $search_limit) {

//your entire code

}

【讨论】:

  • 糟糕,我的错。但即便如此,如果我要交换 file_exists 和 counter while 循环,仍然会超时
  • 在这种情况下,如果文件不存在,您的内部循环将是无限的
猜你喜欢
  • 2010-12-26
  • 2011-04-17
  • 1970-01-01
  • 2011-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-08
  • 1970-01-01
相关资源
最近更新 更多