PHP fopen总是失败,权限被拒绝

我正在将几个Wordpress博客迁移到AWS的过程中,并遇到了文件权限问题,在过去的几个小时里,这些文件权限已经成功挫败了我。

最简单的fopen调用总是失败,“未能打开stream:权限被拒绝”:

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

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

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

有什么我错过了可能造成这个? 我怀疑我一直在盯着这个这么久,我错过了一些明显的东西。

更新:应用womble的build议后,我开始认为这个问题比恶劣的权限或PHP错误configuration更加恶毒。 我设法得到上面的代码写出一个文件,但是,即使PHP脚本执行正确的用户和组生成的文件所有权和组被设置为Apache的。 如果我从命令行执行相同的testing脚本,则发出的文件具有正确的权限。 这使我相信这是我使用mod_suexec的一个问题。

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

 <?php echo exec('ps -up '.getmypid()); ?> 

好问题 – 显示你已经完成了你的功课。

我想不出任何“明显的”,你没有检查,所以我只能给你一些更高级的debuggingbuild议。

  • 在PHP过程中strace决定,看看究竟在做什么。
  • 写一些代码,做一个fopen(..., 'r')来三重检查你的目录树的权限是否正确。
  • su给有问题的用户,并尝试在命令行上做一些事情。 如果这样做,那么你知道你的脚本没有运行你认为的权限。
  • 检查文件,目录或引导path组件上是否没有扩展ACL( getfacl是要使用的工具)。 这是不常见的,但每过一段时间,他们就会跳起来,撕掉你的脸。 如果你有ACL,使用setfacl -x来validation它们是不必要的。

尝试/usr/sbin/apachectl -t -D DUMP_MODULES

检查所有模块是否启用

如果你得到

 Warning: SuexecUserGroup directive requires SUEXEC wrapper. 

parsing度

这种警告通常是由suexec包装上的无效权限引起的,应该是:

 # ls -la /usr/sbin/suexec -rwsr-xr-x 1 root root 12064 2008-04-17 01:15 /usr/sbin/suexec 

如果权限或所有权与上述示例不同,请使用以下命令更正它们:

 # chown root:root /usr/sbin/suexec # chmod 4755 /usr/sbin/suexec 

这个修复之后,一切都很好。

检查apache的home文件夹是什么(通常是/var/www ),并把文件放在这个文件夹下,最后给予必要的权限。 把php temp upload文件夹改成这个。 这是为我工作。

2件事。

  1. 你需要在死亡陈述中逃避撇号。
  2. 5是rx,6是rw-。 我将在0766设置您的权限为-rwxrw-rw-