【问题标题】:Using copy() with destination created by tempnam()将 copy() 与 tempnam() 创建的目标一起使用
【发布时间】: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=65701https://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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-13
    • 2018-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多