使用copy()和tempnam()创建的目标

时间:2013-09-18 16:29:54

标签: php

在调试框架中的问题时,我在使用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错误,在clearstatcache()之前调用filesize()会产生正确的结果,所以实际上副本是成功的,它是filesize()所在的谎言。请参阅https://bugs.php.net/bug.php?id=65701https://github.com/php/php-src/pull/459

1 个答案:

答案 0 :(得分:1)

似乎这实际上是一个PHP错误,在filesize()之前调用clearstatcache()会产生正确的结果,所以事实上副本是成功的,它是说谎的filesize()。请参阅https://bugs.php.net/bug.php?id=65701https://github.com/php/php-src/pull/459