我正在从共享主机迁移到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
我尝试了没有文档根部分的同一行,有没有./
等,没有运气。与require
,include_once
或include
无差异。但是,我可以通过从错误日志中复制粘贴并cd
来验证该文件是否存在于该确切位置...
但是为了绝对肯定,我测试了include
和file_exists
的返回值 - 它们都返回false。然而,所有文件都由SuExec用户/组填充,并且没有权限组合(在目录或文件上);已尝试从644到777.这里发生了什么?
修改:
php.ini
中设置为“关闭”。dirname(__FILE__)
和exec('pwd')
返回与$_SERVER['DOCUMENT_ROOT']
相同但没有尾随斜杠的情况。fread
,file_get_contents
和realpath(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>
答案 0 :(得分:0)
您是否检查过包含该文件的文件夹的权限?
文件夹应具有apache(或运行http-server的任何用户)的读取权限。
您是否尝试添加路径以包含路径?
$path = '/includes/content';
set_include_path(get_include_path() . PATH_SEPARATOR . $path);
答案 1 :(得分:0)
首先确保文件存在...
答案 2 :(得分:0)
它总是对我有用 - &gt;
if ( DIRECTORY_SEPARATOR == '/' )
{
$path = dirname(__FILE__).'/';
}
else
{
$path = str_replace('\\', '/', dirname(__FILE__)).'/';
}
试一试!
<强> [EDITED] 强>
使用dirname()函数始终有效! $path = dirname(__FILE__).'/';
问题可能在您的服务器中。不在编程(脚本)中。
答案 3 :(得分:0)
答案 4 :(得分:0)
回过头来发布solution:
我没有意识到open_basedir
不受安全模式关闭的影响 - 它正在查看/srv/http/
而不是/srv/www/
,这将是/srv/www/hostname/public/includes/content/
的包含目录}。