为什么file_put_contents()成功但touch()失败?

时间:2009-11-04 21:28:50

标签: php filesystems

我正在运行一个脚本,对文件内容进行一些更改,然后将其修改时间重置为之前的状态。间歇性地,我会在日志中发现以下错误:

touch() [function.touch]: Utime
failed: Operation not permitted

file_put_contents()调用之后,此行立即显示已更改我尝试touch()的文件内容。没有与file_put_contents()行相关的错误。

有人有过这种情况吗?任何人都可以找出允许我写一个文件但不改变其修改时间的权限集合吗?我在Linux上这样做。

4 个答案:

答案 0 :(得分:2)

这是PHP的touch命令的错误。即使您对该文件具有写入权限,如果PHP不是“所有者”,也会失败。

如果您使用的是Apache和Linux,请在服务器的控制台上使用此命令将PHP作为文件的所有者:

sudo chown www-data:www-data /YourPATH/YourFILE

更好的是,更新包含您希望PHP控制的文件的整个文件夹:

sudo chown -R www-data:www-data /YourPATH/YourFOLDER

旁注:因为PHP可以写入文件,这意味着它必须具有用户或组写入权限。既然如此,触摸不应该这样。这似乎是一个错误。

答案 1 :(得分:0)

文件可能会以错误的权限创建。尝试在file_put_contents之后chmod 777文件,然后触摸该文件。

答案 2 :(得分:0)

正如rossoft所说,PHP可能不是该文件的所有者。但是将权限设置为777可能不是最佳解决方案。我更喜欢:

function touch_file($file) {
    fclose(fopen($file, 'a'));
}

touch_file('/path/to/file');

答案 3 :(得分:0)

直到最近,我遇到了类似的问题,我想我知道答案。

touch()的实际目的是更新文件的修改和访问时间。创建文件只是一个副作用。

如果您正在使用Linux,但是使用双启动配置写入NTFS分区,则根据分区的安装方式,touch()可能会在更改文件访问时间方面遇到问题。将创建该文件,但touch()仍将失败,因为底层系统返回错误状态。从命令行可以看到同样的事情,你会收到“权限被拒绝”消息。

在mount,ntfs-3g或touch(Linux命令)的手册页中似乎没有关于此的任何文档,但问题在touch() PHP函数页面的注释中提到

调整挂载选项可能会提供解决方案,但您最好使用is_writable()检查权限并fopen()创建文件。