【问题标题】:Why would file_put_contents() succeed but touch() fail?为什么 file_put_contents() 会成功但 touch() 会失败?
【发布时间】:2010-12-13 04:49:57
【问题描述】:

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

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

这在file_put_contents() 调用后立即上线似乎已将我尝试的文件内容更改为touch()。没有与file_put_contents() 行相关的错误。

有人遇到过这种情况吗?谁能弄清楚哪些权限集允许我编写文件但不更改其修改时间?我在 Linux 上这样做。

【问题讨论】:

  • 取决于操作系统,您在哪个操作系统上执行此操作?
  • Linux,抱歉。

标签: php filesystems


【解决方案1】:

这是 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 可以写入文件,这意味着它必须具有用户或组的写入权限。既然如此,触摸不应该以这种方式表现。这似乎是一个错误。

【讨论】:

  • 我们遇到了类似的问题,文件的内容应该被替换,但修改文件的时间需要保留。由于您在此处回答的内容,我们需要 unlink 旧文件并在所需位置创建新文件,然后应用 touch 操作以达到所需结果。可能这也解决了您的问题:首先删除您要替换的文件,然后将新文件放在所需的位置并更新时间戳。可能在touch() 之前执行chown($f, get_current_user()); 也可以解决问题。
  • 不,我绝不会建议删除和重新创建文件只是为了设置修改日期。这是磁盘使用的针脚消耗,尤其是如果经常这样做。更糟糕的是,如果写入被中断或不允许,您刚刚删除了文件。它现在已经一去不复返了。
  • 我同意这一点。但只要是替换文件内容,同时保留原始文件的修改时间戳,就可以了。
【解决方案2】:

文件可能是使用错误的权限创建的。尝试在 file_put_contents 之后对文件进行 chmod 777,然后触摸该文件。

【讨论】:

  • 运行php脚本的用户是文件/父目录的所有者吗?这也可能是另一个有用的检查
【解决方案3】:

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

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

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

【讨论】:

  • 我会这样做,但我正在尝试使用过去的触摸。
  • 无论出于何种原因,这对我们都不起作用。但以下是file_put_contents($file, "");
【解决方案4】:

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

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

如果您使用的是 Linux,但写入 NTFS 分区时可能会像使用双引导配置一样,根据分区的挂载方式,touch() 可能会在更改文件的访问时间时遇到问题。该文件将被创建,但 touch() 仍然会失败,因为底层系统返回错误状态。从命令行中可以观察到同样的情况,您将收到“权限被拒绝”消息。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-07
    • 1970-01-01
    • 2010-09-20
    • 2012-02-10
    • 1970-01-01
    • 2021-12-23
    • 1970-01-01
    相关资源
    最近更新 更多