Я сейчас перехожу с виртуального хостинга на 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') в / srv / www / hostname /public/index.php в строке 3
Я пробовал ту же строку без корневой части документа, с и без ./
, файл в том же каталоге и т. д. безуспешно. Нет разницы с require
, include_once
, или include
, либо. Тем не менее, я могу проверить, существует ли файл в этом точном месте, скопировав его из журнала ошибок и cd
к нему.
Я задал этот вопрос ТАК и кто-то сказал мне, что это, вероятно, проблема с сервером, поэтому я повторяю здесь. (Самый похожий вопрос, который я мог найти здесь, был никогда не отвечал) Сводка попыток:
php.ini
.dirname(__FILE__)
и exec('pwd')
вернуть то же, что и $_SERVER['DOCUMENT_ROOT']
но без косой черты в конце; префикс одного или другого не имеет значения.include
, include_once
, fread
, file_exists
, 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>
Установлен ли у вас apparamor, и если да, то ограничивает ли он доступ к процессу apache? (проверьте /etc/apparmor.d)
Дополнительно попробуйте сделать что-нибудь вроде этого:
sudo -u имя хоста cat /srv/www/hostname/public/includes/content/header.php
Что это вам дает?
Проверьте, есть ли у вас open_basedir
установить что-то другое, кроме родительского каталога /srv/www/hostname/public/includes/content/
. Это заблокирует открытие или включение этого файла. Также убедитесь, что файл, который вы открываете, не является символической ссылкой на что-то за пределами вашего open_basedir.
Обычно при этом выводится сообщение уровня предупреждения, указывающее, что файл был заблокирован из-за open_basedir, но если у вас отключены ошибки (или, по крайней мере, отключено E_WARNING), вы не увидите это сообщение.