【发布时间】:2013-09-23 12:39:03
【问题描述】:
在调试框架中的问题时,我在使用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() 返回真。我在 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
【问题讨论】:
-
可能是因为您使用的是绝对路径而不是相对路径。尝试使用它的完整绝对路径。即:
/var/user/you/public_html/tmp/file.txt或相对的../tmp/file.txt -
试过了,但没有什么不同。使复制工作的唯一事情是如果我将一些随机字符附加到 $dst,这样它就不会指向由 tmpnam() 创建的路径
-
我注意到了。抱歉,我是在实际测试之前写的。我现在测试了一下,果然,回来了
int(0)。 -
我一直在修改这个想法并能够获得
int(4),但代价是创建了两个tmp文件(最奇怪的)。查看我的 pastebin 文件 pastebin.com/zzgZ4R0Z -
有趣的部分是对第二个(理论上是空的)文件的 filesize() 调用导致结果正确。这看起来越来越像 PHP 本身的一些奇怪的错误......
标签: php