fopen
我从和收到以下错误file_get_contents
:
failed to open stream: Operation not permitted
这仅在通过浏览器中的 localhost 访问脚本时才会发生 - 在命令行上,它按预期工作。
服务器以我的本地用户身份运行,并且脚本本身也肯定以该用户身份执行——已通过 确认get_current_user()
。
脚本认为该文件应该是可读的——通过 确认is_readable()
。
我在 php 或 apache 配置中找不到任何明显会导致这种情况的原因。我最近升级到了 Big Sur,这是我记得的第一个此类问题的例子。我怀疑这与 macOS 中与读取文档根目录之外的文件有关的不透明安全设置有关。
关于如何解决问题或进一步诊断该问题,您有什么想法吗?
答案1
(我没有用过 Mac,但这是我发现的。)
该函数返回的信息is_readable()
似乎是错误的,并且PHP缺乏读取这些文件的权限。
帖子中有解释检测文件是否可读:
在 Windows 和 Linux(以及旧版本的 MacOS)上,LazFileUtils FileIsReadable 函数足以确定文件是否设置了读取权限。但是,这会返回此文件的全局权限。在最近/即将推出的 MacOS 版本中,应用程序默认在具有有限权限的沙盒中运行. 只有当用户明确将文件与该应用程序关联(例如通过拖放或使用文件打开对话框)时,它们才应该能够读取文件。
假设有一个应用程序想要读取文件
~/Desktop/notes.txt
。此文件的全局权限意味着此文件可以被程序读取。但是,我们的特定程序无权读取该文件。不幸的是,FileIsReadable
只是报告该文件是全局可读的。然而,当应用程序真正尝试读取文件时,却出现错误。
本文中提供了一种可能的解决方案 在 Catalina MacOS 10.15 下,Apache 下的 PHP 已限制通过文件链接访问某些文件,这可能是由于隐私更改:
Catalina 的权限限制更严格。解决方法很简单:为 http 启用完全磁盘访问。具体操作如下:
系统偏好设置 => 安全和隐私 => 完全磁盘访问
导航到磁盘的根文件夹并按 Cmd+Shift+。(查看根目录下的所有文件夹),然后转到
/usr/sbin/
选择“httpd”并重新启动它(apachectl -k restart)。
在帖子中找到了另一个答案 iCloud Drive 中的文件夹更改其权限:
我遇到了同样的问题,尝试以需要读取 Documents 权限的非特权用户身份运行服务器,而 Documents 位于 iCloud Drive 中。常规 UNIX 文件权限不起作用。我通过使用 ACL 授予访问权限解决了这个问题。
chmod +a "_www allow list,search" Documents
在此示例中
_www
,您的服务器以非特权用户身份运行。使用ps axu
找出您的用户。Documents 内的文件夹应该像 UNIX 文件权限位一样正常工作,因此您只需对 Documents 文件夹本身执行此操作。
有关 ACL 的更多信息,请参阅此处 这里 和
man chmod
。
由于不是使用 Mac,我无法测试上述任何方法,也无法提供其他信息。