PHP Fatal Ошибка Не удалось открыть файл
Я получаю следующую ошибку от Apache
[Сб Мар 19, 23:10:50 2011] [warn] mod_fcgid: stderr: PHP Неустранимая ошибка: require_once() [function.require]: Не удалось выполнить открытие '/common/configs/config_templates.inc. php '(include_path ='.:/usr/share/pear:/usr/share/php ') в /home/viapics 1/public_html/common/configs/config.inc.php в строке 158
Я определенно не эксперт Apache, но файлы config.inc.php и config_templates.inc.php есть. Я также попытался перейти на страницу test.html, которую я разместил в общем /configs/, поэтому я предполагаю, что никаких проблем с правами не происходит. Я также установил права на config_templates.inc.php, чтобы дать всем права на чтение, запись и выполнение. Не уверен, что делать в этот момент, я проверил, есть ли каталог /usr/share/php, и я обнаружил, что не было, но когда я сделал yum install php, он сказал, что он был последним. Идеи?
Ответы
Ответ 1
Это не вопрос, связанный с Apache. Ни один, связанный с PHP. Чтобы понять эту ошибку, вы должны отличить путь на виртуальном сервере от пути в файловой системе.
require
оператор работает с файлами. Но нет
/common/configs/config_templates.inc.php
файл на сервере, а точнее
/home/viapics1/public_html/common/configs/config_templates.inc.php
/home/viapics1/public_html
часть называется корнем документа и связывает виртуальный мир с реальным. К счастью, веб-серверы обычно имеют корень документа в переменной конфигурации, которую они разделяют с PHP. Так что если вы измените свой код на что-то вроде
require_once $_SERVER['DOCUMENT_ROOT'].'/common/configs/config_templates.inc.php';
он будет работать с любым файлом, помещенным в любой каталог.
Обновление: в конце концов я написал статью, в которой объясняется разница между относительными и абсолютными путями в файловой системе и на веб-сервере, где подробно объясняется этот вопрос и содержатся некоторые практические решения.
К сожалению, такой удобной переменной не существует, когда вы запускаете скрипт из командной строки. В этом случае техника, называемая "единой точкой входа", должна выручить. Вы можете обратиться к статье выше для деталей.
Ответ 2
Если у вас есть запуск SELinux, вам может потребоваться разрешение httpd для чтения из /home dir с помощью:
sudo setsebool httpd_read_user_content=1
Ответ 3
Запустите php -f /common/configs/config_templates.inc.php
, чтобы проверить правильность синтаксиса PHP в файле.
Ответ 4
На всякий случай это помогает кому-то еще, я наткнулся на неясное дело об этой ошибке, вызванной прошлой ночью. В частности, я использовал метод require_once и указывал только имя файла и никакого пути, так как требуемый файл присутствовал в том же каталоге.
Я начал получать ошибку "Ошибка открытия файла" в одной точке. Некоторое время, разрывая мои волосы, я, наконец, заметил сообщение о предупреждении PHP сразу над фатальной ошибкой, указав "не удалось открыть поток: Permission denied", но что более важно, сообщив мне о пути к файлу, который он пытался открытый. Затем я сфокусировался на том, что создал копию файла (с собственностью, недоступной Apache) в другом месте, которое также оказалось в пути поиска "include" PHP, и впереди папки, в которой я хотел, чтобы ее подхватили, D'о!
Ответ 5
Эй, у меня была эта проблема, и я обнаружил, что не смотрю на папку достаточно близко:
У меня был
require_once /vagrant/public/liberate/**APP**/vendor/autoload.php
Что получилось:
require_once /vagrant/public/liberate/vendor/autoload.php
Было очень легко (как новичок) упустить эту очень незаметную проблему. Да, я понимаю, что проблема, связанная с проблемой, связана непосредственно с проблемой, но если вы новичок, как и я, эти вещи можно легко упустить.
ИСПРАВЛЕНИЕ:
Хорошо посмотрите на отладку (__ Dir __ '/etc/etc/etc/file.php), затем откроете свою файловую систему в другом окне и сопоставьте два файла напрямую. Если есть даже малейшая разница, это требование не будет работать, и вышеупомянутая ошибка будет выплюнуть.
Ответ 6
Вы можете исправить это с помощью константы PHP __DIR__
require_once __DIR__ . '/common/configs/config_templates.inc.php';
Это каталог файла. Если используется внутри включения, возвращается каталог включенного файла. Это эквивалентно dirname __FILE__
. Это имя каталога не имеет косой черты, если только оно не является корневым каталогом. 1
Ответ 7
У меня была одна и та же проблема, я трижды проверял пути включения, я также проверял, что груша установлена, и все выглядело нормально, и я все еще получал ошибки, после нескольких часов безумного взгляда на это я понял, что в моем script было следующее:
include_once "../Mail.php";
вместо:
include_once ("../Mail.php");
Yup, тупая скобка отсутствовала, но в этой строке моего script не было сгенерированной ошибки, которая была нечетной для меня