macOS Big Sur 上的 PHP 文件读取错误

macOS Big Sur 上的 PHP 文件读取错误

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,我无法测试上述任何方法,也无法提供其他信息。

相关内容