将 copy() 与由 tempnam() 创建的目标一起使用


Using copy() with destination created by tempnam()

在框架中调试问题时,我在使用 tempnam() 为复制的文件创建目标时遇到了一些奇怪的行为。

下面是一个简化的测试用例:

touch ('/tmp/file.txt');
file_put_contents('/tmp/file.txt', 'test');
$dst = tempnam('/tmp', 'dst');
copy('/tmp/file.txt', $dst);
var_dump(filesize($dst));

显然,我希望末尾的var_dump()输出"4",因为这是源文件的大小,但相反,它总是返回为零,这意味着目标文件为空,尽管copy()返回 true。我在 PHP 5.4.4 和 5.3.10 上进行了测试,结果相同。

我知道我可以更改我的代码以使用fwrite()或类似的结构,但我真正想知道的是,为什么它不能按照我编写的方式工作?

更新

看起来这实际上是一个PHP错误,在filesize()产生正确结果之前调用clearstatcache(),所以实际上复制无论哪种方式都是成功的,这是filesize()在撒谎。查看 https://bugs.php.net/bug.php?id=65701 和 https://github.com/php/php-src/pull/459

看起来这实际上是一个PHP错误,在filesize()产生正确的结果之前调用clearstatcache(),所以实际上复制是成功的,是filesize()在撒谎。查看 https://bugs.php.net/bug.php?id=65701 和 https://github.com/php/php-src/pull/459