小编Kev*_*ney的帖子

PHP fopen 总是因权限被拒绝而失败

我正在将几个 Wordpress 博客迁移到 AWS,但遇到了文件权限问题,该问题在过去几个小时内成功阻止了我。

最简单的 fopen 调用总是失败,并显示“无法打开流:权限被拒绝”:

<?php $handle = fopen('test.txt', 'w') or die('Can\'t open file'); ?>
Run Code Online (Sandbox Code Playgroud)

我已经尝试/检查了以下内容

  • 我正在写入的目录具有正确的文件权限 (755) 和正确的所有权。一直到 /home 的路径都是如此。
  • 我正在编写由getcwd()确认的正确目录
  • 测试 PHP 脚本散列与我尝试写入的路径相同的所有权并更正权限 (644)。
  • 我正在运行 mod_suexec 以确保使用与我写入的路径相同的用户和组来执行脚本。函数getmyuid()getmygid()返回正确的用户和组 ID(编辑:这是错误的,见下文)。
  • PHP 安全模式在 php.ini 中被禁用。
  • fopen 不是不允许的 PHP 函数。
  • 禁用open_basedir的使用。

有什么我错过的可能会导致这种情况吗?我怀疑我已经盯着这个看了很长时间,我错过了一些明显的东西。

更新:在应用了womble 的建议后,我开始认为这个问题不仅仅是错误的权限或 PHP 配置错误。我确实设法让上面的代码写出一个文件,但是即使使用正确的用户和组执行 PHP 脚本,生成的文件所有权和组也被设置为 apache 的所有权和组。如果我从命令行执行相同的测试脚本,则发出的文件具有正确的权限。这让我相信这是我使用 mod_suexec 的问题。

编辑:我对getmyuid()getmygid()的使用不正确,因为它们只返回脚本文件的用户和组,而不是它运行的权限。更正确的方法是使用像这样的 comething:

<?php echo exec('ps -up '.getmypid()); ?>
Run Code Online (Sandbox Code Playgroud)

php suexec apache-2.2

9
推荐指数
2
解决办法
3万
查看次数

标签 统计

apache-2.2 ×1

php ×1

suexec ×1