Ubuntu 10.04 lucid 系统。
发现原来用PHP编写的脚本中的rename()与copy()无法跨分区操作。
提示failed to open stream: No such file or directory in <略> on line <略>已经测试,如果源路径与目标路径在同一个分区,比如相同目录,就可以成功。
而如果在不同的分区,就会失败。不过从其它分区rename()至/tmp/临时目录可以成功,但是再rename()回来就直接提示失败。
已经把权限全部设为777。百思不得其解。
网上也没有找到比较合适的解释与解决方案。
其中虽然有效但是感觉不太完美的是将rename()函数替换为 system("mv ".$src." ".$Dest)欢迎大虾再给指一条明路!

解决方案 »

  1.   

    php手册上rename函数的修正纪录如下:
    http://www.php.net/manual/en/function.rename.php
    Changelog
    Version Description
    5.3.1 rename() can now rename files across drives in Windows.
    5.0.0 rename() can now also be used with some URL wrappers. Refer to List of Supported Protocols/Wrappers for a listing of which wrappers support rename().
    4.3.3 rename() may now be able to rename files across partitions on *nix based systems, provided the appropriate permissions are held. Warnings may be generated if the destination filesystem doesn't permit chown() or chmod() system calls to be made on files — for example, if the destination filesystem is a FAT filesystem.看看,你的目标分区是不是没有chown和chmod权限
      

  2.   

    在 PHP 4.3.3 之前,linux系统下rename()是无法跨分区操作的。
      

  3.   


    这个我编写了PHP的测试脚本验证过,利用PHP内置的chmod()函数将对应的目录的权限设置为0777后,再执行rename(),错误依旧。chown()没有测试。
    并且ls -al 察看对应路径的属性,已经被成功修改了。
    应该可以确认是有chmod()的权限的。并且我一直在用root帐户测试,权限应该不会受到太大的限制吧。还有,我在原来的ubuntu 9.04的系统(P4 2.8G双核 1G DDR2 250GB HD)上搭建的系统就没有这个问题。
    最近几天将系统迁移至新机器(E5400 2G DDR3 1TB HD)上的全新安装的ubuntu10.04上,就突然这样了。
      

  4.   

    我的环境是Ubuntu10.04 PHP5
      

  5.   

    那就不太清楚了,可能是PHP的一个bug,你可以提交到PHP的bug list上去
      

  6.   

    现在ubuntu 10.04里面的PHP5版本为5.3.2-lubuntu4.2 with Suhosin-Patch (cli) (built: May 13 2010 20:01:00)
    刚刚查升级管理器(Update Manager)PHP相关组件有更新。
      

  7.   


    我的脚本是直接由root账户执行的。这应该不是问题所在吧。
      

  8.   

    这个不能通过修改PHP的设置来取消这个限制么?
      

  9.   

    现在通过额外指定了一个同分区内的临时目录的方法,基本上杜绝了错误提示。看来LS所说的PHP不支持跨分区操作的说法的确是真的,但是不是说只是PHP早期版本有这个限制么?怎么现在PHP5.X又出现了?
      

  10.   


    我原来运行同样脚本的服务器主机就没有出现过这个问题。而前后两台主机都是Ubuntu的系统。PHP5.X的环境。