php fopen 无法打开文件以在 Mac OS X 中写入

Posted

技术标签:

【中文标题】php fopen 无法打开文件以在 Mac OS X 中写入【英文标题】:php fopen fails to open a file for writing in Mac OS X 【发布时间】:2011-08-16 08:12:28 【问题描述】:

我正在笔记本电脑上本地运行 php 脚本 updreading.php(使用 Mac OS X 10.6.7)。 这是updreading.php的内容

<?php
    $outFile = "examples-output.txt";
    $out = fopen($outFile, 'w') or die("can't open write file");
?>

当我运行它时,我收到“无法打开写入文件”错误消息。我认为这应该与权限有关。我已经让自己(arman)成为 /Library/WebServer/Documents/ 的所有者,拥有读写权限和“将设置应用于随附的项目”。我正在写入的脚本和文件 (examples-output.txt) 位于 /Library/WebServer/Documents/wabun/。以下是 /Library/WebServer/Documents/wabun/ 中文件的权限:

-rw-r--r--@ 1 arman  admin         0 May  1 01:03 examples-output.txt
-rw-r--r--@ 1 arman  staff      1657 May  1 01:04 updreading.php

在过去 4 小时内,我一直在尝试解决此问题,但没有成功尝试不同的权限。任何想法如何解决这个问题,伙计们?谢谢!

【问题讨论】:

var_dump(is_writable($outFile)); 的输出是什么? @Charles:不必要的问题,一定是假的...... @Alix,只有在这个世界不疯狂的情况下,它才会是假的。我见过 PHP 无法打开文件进行写入,但当您询问文件是否可写时返回 true。它最终变成了一些奇怪的 SELinux 问题,尽管这个特殊问题是关于 OS X 的。 【参考方案1】:

您需要将 apache(假设 apache 是您正在使用的服务器)设为所有者或放入组(并授予组写入权限)或授予 all 或等等的写入权限。IOW apache 是实际执行脚本的那个,不是你。

【讨论】:

你能测试并解释如何做到这一点“你需要让apache(假设apache是​​你正在使用的服务器)所有者或放入组(并给予组写入权限)” 这将非常有帮助! chmod 更改文件的读/写/执行权限,chown 更改文件所有者,chgrp 更改文件组。 最简单的(也是最不安全的)修复方法是chmod 777 [target file/dir] 所有有问题的文件。这将为所有所有者/组提供读/写/执行权限。有更安全的方法,但这取决于设置/需要。但有些前:chown 将所有者更改为 apache。或者创建一个包含 apache 的组并使用 chgrp 更改组(可能还需要 o chmod 来更改用户和/或组权限,具体取决于您的操作。OP 中的当前权限仅显示读/写所有者)【参考方案2】:

我敢打赌,问题是您的网络服务器或 PHP 实例未在同一用户 (arman) 下运行,您可以使用 get_current_user() 函数进行检查。您可以将 apache 配置为使用您的权限运行(在 ServerFault 中询问)或授予文件夹更多的权限,例如 0777

另外,你确定$outFile 映射到一个绝对 路径吗?尝试做:

var_dump(is_file($outfile));

【讨论】:

【参考方案3】:

我遇到了同样的问题。我还必须确保所有 parent 文件夹的权限都是正确的。例如,如果(在 OSX 中)试图写入目录 ~/foo/bar/baz,我用命令chmod -R 777 ~/foo解决了。

【讨论】:

以上是关于php fopen 无法打开文件以在 Mac OS X 中写入的主要内容,如果未能解决你的问题,请参考以下文章

function.fopen:无法打开流:PHP 中的权限被拒绝

PHP的datelog localhost在mac权限被拒绝

无法使用模式 r 打开:fopen():AWS Elastic Beanstalk

install_name_tool 更新可执行文件以在 Mac OS X 中搜索 dylib

fopen(dbinfo.php):无法打开流:权限被拒绝 Ubuntu 12.04 LTS

PHP中的fopen()函数的返回值是啥?