【问题标题】:PHP's copy() fails when executed from Apache, why?从 Apache 执行 PHP 的 copy() 失败,为什么?
【发布时间】:2017-09-10 08:42:44
【问题描述】:

我正在将文件从$source 复制到$destination

如果我从 PowerShell 执行 copy($source, $destination),它会起作用。

如果我从 Apache 调用这个 copy($source, $destination),它会抱怨 copy(...): failed to open stream: Permission Denied.

我可以手动打开资源管理器并复制和粘贴文件。我在 Windows Server 2012R2 上使用 PHP 7.1、Apache 2.4。

为什么会这样?有人可以提供见解吗?

【问题讨论】:

  • 你知道什么是权限吗?
  • 如果你使用 power shell,php 使用你登录的同一个用户。 apache 使用不同的用户(通常是 www 或 www-data 之类的)
  • @u_mulder 目标文件夹的属性显示,所有用户都有“允许写入”。
  • @Jakumi,我使用的是 Windows Server 2012R2。
  • 我相信 php/apache 配置有一些设置说明,执行 php 脚本时使用哪个用户。这可能与您的用户帐户有很大不同,即使在 Windows 上也是如此(而且非常应该,因为您可以做的比网络服务器应该做的要多得多)

标签: php apache powershell server


【解决方案1】:

如果在 Windows 下运行,Apache 已经拥有所需的所有权限,因为它在 LocalSystem 帐户下运行,该帐户对本地路径具有广泛的读/写访问权限。这是由 PHP 及其运行的脚本继承的。

如果有问题那么——

  • 之后设置的附加文件权限有问题(检查 Windows 事件查看器)。
  • 配置被错误编辑,如:WP上传路径设置、php.ini临时文件夹位置+上传设置等
  • Apache 服务的“登录”帐户已从“LocalSystem”更改为其他帐户(检查服务的属性)。
  • 可能 PHP 的 open_basedir 设置已在 VirtualHost 或 .htaccess 中启用,并限制了 PHP 可以访问的路径。
  • 或者存在内部 PHP 错误(检查网站的 HTTP 和 PHP 错误日志)。

编辑

既然建议了,如果您卡在第 3 点,我会添加此解决方案的可能性:

  • 创建一个具有广泛文件权限的用户并将 Apaches 服务更改为在该用户下运行。我强烈建议不要为此使用系统管理员用户(或任何管理员用户)配置文件。

【讨论】:

  • +1 获取广泛的列表。我经历了所有这些。一切似乎都很好。 Apache 错误日志只告诉我; copy(...): failed to open stream: Permission Denied.我不认为Windows Server 有chmod 的概念?
  • 我又浏览了你的清单!我解决了这个问题。我停在第 3 点。我更改了 LocalSystem 以明确使用我的用户名(我有管理员权限)。它解决了这个问题。如果您更新答案以包含此建议,我会给您打勾!既然你的帮助是正确的,我想我最好在你更新后让你打勾。
  • @ikel 你可能不应该让 apache 以管理员身份运行......真的......你不应该!您应该更改文件权限,以便 apache 可以访问它。
  • @Jakumi,文件夹权限没问题。我与服务器的“真实”管理员拥有相同的文件夹权限。更改 LocalSystem 以使用我自己的用户名可以解决它。我本可以创建一个具有较少权限的新用户来限制 Apache 访问,但我认为我们的“真实”管理员不允许我这样做。我暂时就这样吧,因为我的截止日期很紧。如果时间和“真正的”管理员允许,我将使用具有较少权限的用户运行 Apache 来重新讨论这个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-16
  • 2012-01-20
  • 2010-11-13
  • 2010-10-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多