使用is_file替换file_exists遇上的坑

[文章作者:磨延城 转载请注明原文出处: https://mo2g.com/view/142/ ]

之前写过一片文章记录了php的一些使用技巧,并对is_file、is_dir、file_exists三个函数做了比较,得出的结论是file_exists性能没前两个函数高,所以之后一直用is_file、is_dir代替了file_exists,可是最近在做测试的时候发现了is_file的弊端.

之前写过一片文章记录了php的一些使用技巧,并对is_file、is_dir、file_exists三个函数做了比较,得出的结论是file_exists性能没前两个函数高,所以之后一直用is_file、is_dir代替了file_exists,可是最近在做测试的时候发现了is_file的弊端。

先看看如下代码:

<?php
$file = 'file.txt';
file_put_contents($file, '');
$createTime = is_file($file) ? filemtime($file) : 0;
echo $createTime,'<br>';

unlink($file);
$createTime = is_file($file) ? filemtime($file) : 0;
echo $createTime,'<br>';

1)我们先创建一个file.txt文件

2)用is_file判断文件是否存在,存在就获取文件修改时间

3)删除file.txt文件

4)重复2)

上边的代码看上去确实没什么问题,如果,我们把代码改一下:

<?php
$file = 'file.txt';
file_put_contents($file, '');

$createTime = is_file($file) ? filemtime($file) : 0;
echo $createTime,'<br>';

sleep(5);

$createTime = file_exists($file) ? filemtime($file) : 0;
echo $createTime,'<br>';

$createTime = is_file($file) ? filemtime($file) : 0;
echo $createTime,'<br>';

这里我只是调整了删除方式,把unlink,改成了sleep,让程序延缓执行,在程序sleep期间,手动删除生成的file.txt。

运行结果类似如下:

1430358220
0
1430358220

发现问题了吗,在类似这种情况下,is_file没办法判定文件已经被删除了。因为is_file会缓存执行结果返回的信息以提供更快的性能。

所以,在选择使用is_file、is_dir、file_exists之前,还得根据场景来判断。

评论:

  1. 暂无评论...
  2. 我来说两句:

      切换  

    磨途歌检测发现,您当前使用的浏览器版本过低,要想使用画板模式,请先更新浏览器

      切换  

    磨途歌随机验证码