来自/tmp的PHP rename()会抛出警告,尽管实际上是有效的

来自/tmp的PHP rename()会抛出警告,尽管实际上是有效的,php,rename,permission-denied,tmp,Php,Rename,Permission Denied,Tmp,从/tmp目录移动文件时,我收到一条警告: 重命名(/tmp/[somefile],[destination]):在[…]中不允许操作 它有三个奇怪的地方: /tmp和[destination]目录中的文件都属于www进程(代表其执行操作),并且具有所有者的写入权限 文件实际上最终会被移动 以同样的方式在其他目录间移动文件,效果很好 换言之,它实际上起作用,但却像不起作用一样发出警告。我觉得很奇怪 这种行为的原因可能是什么?重命名被认为是一种原子操作;也就是说,从来没有过新旧文件名同时存在或两者

/tmp
目录移动文件时,我收到一条警告:

重命名(/tmp/[somefile],[destination]):在[…]中不允许操作

它有三个奇怪的地方:

  • /tmp
    [destination]
    目录中的文件都属于
    www
    进程(代表其执行操作),并且具有所有者的写入权限
  • 文件实际上最终会被移动
  • 以同样的方式在其他目录间移动文件,效果很好
  • 换言之,它实际上起作用,但却像不起作用一样发出警告。我觉得很奇怪


    这种行为的原因可能是什么?

    重命名被认为是一种原子操作;也就是说,从来没有过新旧文件名同时存在或两者都不存在的时候/tmp通常是Linux服务器上的一个单独的文件系统。我的猜测是,您会收到一个警告,因为移动不是原子的(因为它在两个不同的文件系统之间),即使它可以工作。因此,这可能更接近于在一个文件系统上先复制,然后删除,而不是移动


    类似问题的示例:

    可能是权限问题,您检查过了吗?@Jer,是的,请仔细阅读:“在/tmp和[destination]目录中的文件都属于www进程(代表该进程执行操作),并且具有所有者的写入权限。”看起来是这样的,尽管文档中没有一个字。你的链接很有用,谢谢。我考虑改用复制+取消链接,解决了这个问题。