PHP包括总是失败

时间:2011-10-29 15:31:36

标签: php apache2 mod-fcgid suexec

  • 在SuExec下使用VirtualHosts的Apache HTTP Server 2.2.21
  • PHP 5.3.8 via fcgid
  • Arch Linux 2011.08.19

我正在从共享主机迁移到VPS。我在移动之前运行的代码很好但现在在这一行失败了:

require_once($_SERVER['DOCUMENT_ROOT'] . 'includes/content/header.php');

错误日志说:

  

PHP致命错误:require_once():打开失败   必填'/srv/www/hostname/public/includes/content/header.php'   (include_path ='。:/ usr / share / pear')in   第3行的/srv/www/hostname/public/index.php

我尝试了没有文档根部分的同一行,有没有./等,没有运气。与requireinclude_onceinclude无差异。但是,我可以通过从错误日志中复制粘贴并cd来验证该文件是否存在于该确切位置...

但是为了绝对肯定,我测试了includefile_exists的返回值 - 它们都返回false。然而,所有文件都由SuExec用户/组填充,并且没有权限组合(在目录或文件上);已尝试从644到777.这里发生了什么?

修改

  • 与同一目录中的文件相同的结果。
  • Apache& SuExec错误日志没有报告任何内容。
  • 安全模式在php.ini中设置为“关闭”。
  • dirname(__FILE__)exec('pwd')返回与$_SERVER['DOCUMENT_ROOT']相同但没有尾随斜杠的情况。
  • freadfile_get_contentsrealpath(dirname(__FILE__))都返回false。
  • set_include_path()无效。
  • 直接从命令行通过require运行php-cgi返回内部服务器错误,而include返回空白输出;通过php运行会返回空白输出。

这是我的vhost配置:

<VirtualHost *:80>
    ServerAdmin admin@hostname.com
    DocumentRoot "/srv/www/hostname/public/"
    ServerName hostname.com
    ServerAlias www.hostname.com
    SuexecUserGroup hostname hostname
    ErrorLog "/srv/www/hostname/logs/error.log"
    LogLevel debug
    CustomLog "/srv/www/hostname/logs/access.log" combined

    <Directory /srv/www/hostname/public>
        Order allow,deny
        Allow from all
    </Directory>

    # http://www.linode.com/forums/viewtopic.php?t=2982
    <IfModule !mod_php5.c>
    <IfModule !mod_php5_filter.c>
    <IfModule !mod_php5_hooks.c>
    <IfModule mod_actions.c>
    <IfModule mod_alias.c>
    <IfModule mod_mime.c>
    <IfModule mod_fcgid.c>
        AddHandler php-fcgi .php
        Action php-fcgi /fcgid-bin/php-fcgid-wrapper
        Alias /fcgid-bin/ /srv/www/hostname/fcgid-bin/

        <Location /fcgid-bin/>
            SetHandler fcgid-script
            Options +ExecCGI
            Order allow,deny
            Allow from all
        </Location>

        ReWriteEngine On
        ReWriteRule ^/fcgid-bin/[^/]*$ / [PT]
    </IfModule>
    </IfModule>
    </IfModule>
    </IfModule>
    </IfModule>
    </IfModule>
    </IfModule>
</VirtualHost>

5 个答案:

答案 0 :(得分:0)

您是否检查过包含该文件的文件夹的权限?

文件夹应具有apache(或运行http-server的任何用户)的读取权限。

您是否尝试添加路径以包含路径?

$path = '/includes/content';
set_include_path(get_include_path() . PATH_SEPARATOR . $path);

http://php.net/manual/en/function.set-include-path.php

答案 1 :(得分:0)

首先确保文件存在...

  • 然后尝试使用导航到它 www.hostname / public / includes / content / header.php(如果你使用的话 本地的东西 本地主机/公共/包括/内容/ header.php文件)
  • 如果没有加载任何东西都是错误的 安装或您的文件已损坏。
  • 尝试从其他地方加载标题

答案 2 :(得分:0)

它总是对我有用 - &gt;

if ( DIRECTORY_SEPARATOR == '/' )
{
    $path = dirname(__FILE__).'/';
}
else
{
    $path = str_replace('\\', '/', dirname(__FILE__)).'/';
}

试一试!

<强> [EDITED]

使用dirname()函数始终有效! $path = dirname(__FILE__).'/';问题可能在您的服务器中。不在编程(脚本)中。

答案 3 :(得分:0)

在ServerFault DerfK

nailed it:这是open_basedir限制。

答案 4 :(得分:0)

回过头来发布solution

我没有意识到open_basedir不受安全模式关闭的影响 - 它正在查看/srv/http/而不是/srv/www/,这将是/srv/www/hostname/public/includes/content/的包含目录}。