PHP Fatal Error Не удалось открыть требуемый файл - PullRequest
43 голосов
/ 19 марта 2011

Я получаю следующую ошибку от 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/viapics1/public_html/common/configs/config.inc.php в строке 158

Я определенно не эксперт по Apache, но там есть файл config.inc.php & config_templates.inc.php. Я также попытался перейти на страницу test.html, которую я разместил в common / configs /, поэтому я предполагаю, что никаких проблем с правами не происходит. Я также установил права на config_templates.inc.php, чтобы дать всем права на чтение, запись и выполнение. Не зная, что делать в этот момент, я проверил, существует ли каталог / usr / share / php, и обнаружил, что его нет, но когда я установил php yum, он сказал, что у него последняя версия. Идеи?

Ответы [ 7 ]

81 голосов
/ 19 марта 2011

На самом деле это не вопрос, связанный с 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';

, он будет работать с любым файлом, размещенным в любом каталоге.

Обновление: в конце концов я написал статью, в которой объясняется разница между относительными и абсолютными путями в файловой системе и на веб-сервере, которая подробно объясняет этот вопрос и содержит некоторые практическиерешения.

К сожалению, такой удобной переменной не существует, когда вы запускаете скрипт из командной строки.В этом случае техника, называемая «единой точкой входа», должна выручить.Вы можете обратиться к статье выше для деталей.

8 голосов
/ 23 декабря 2014

Если у вас запущен SELinux, вам может потребоваться предоставить httpd разрешение на чтение из / home dir, используя:

 sudo setsebool httpd_read_user_content=1
3 голосов
/ 19 марта 2011

Запустите php -f /common/configs/config_templates.inc.php, чтобы проверить правильность синтаксиса PHP в файле.

1 голос
/ 04 декабря 2017

На всякий случай, если это кому-нибудь еще поможет, я наткнулся на неясный случай этой ошибки, вызванной прошлой ночью.В частности, я использовал метод require_once и указал только имя файла и никакой путь, поскольку требуемый файл находился в том же каталоге.

Я начал получать сообщение об ошибке «Ошибка открытия файла» в одной точке.Некоторое время я рвал на себе волосы и, наконец, заметил сообщение с предупреждением PHP непосредственно над выводом фатальной ошибки, указывающее «не удалось открыть поток: отказано в доступе», но, что более важно, информировало меня о пути к файлу, который он пытался открыть.открыть.Затем я понял, что создал копию файла (с владельцем, недоступным для Apache) в другом месте, которое также оказалось в пути поиска PHP «include», и перед папкой, в которой я хотел его найти.,D'ой!

0 голосов
/ 27 февраля 2019

Вы можете исправить это с помощью константы PHP __DIR__

require_once __DIR__ . '/common/configs/config_templates.inc.php';

Это каталог файла.Если используется внутри включения, возвращается каталог включенного файла.Это эквивалентно dirname __FILE__.Это имя каталога не имеет косой черты, если только оно не является корневым каталогом. 1

0 голосов
/ 16 августа 2016

Эй, у меня просто возникла эта проблема, и я обнаружил, что недостаточно внимательно смотрю на местоположение папки:

у меня было

require_once /vagrant/public/liberate/**APP**/vendor/autoload.php

То, что сработало, было:

require_once /vagrant/public/liberate/vendor/autoload.php

Было очень легко (как новичку) пропустить эту очень незаметную проблему. Да, я понимаю, что проблема, требующая регистрации, указывает непосредственно на проблему, но если вы новичок, как и я, эти вещи можно легко пропустить.

FIX:

Внимательно посмотрите на отладку (__Dir __ '/etc/etc/etc/file.php'), затем откройте свою файловую систему в другом окне и сопоставьте их напрямую. Если есть даже малейшее различие, это требование не будет работать, и вышеуказанная ошибка будет выплевана.

0 голосов
/ 23 декабря 2012

У меня была точно такая же проблема, я трижды проверил пути включения, я также проверил, что груша была установлена, и все выглядело нормально, и я все еще получал ошибки, после нескольких часов сумасшествия, глядя на это, я понял, что в моем скрипте было это:

include_once "../Mail.php";

вместо:

include_once ("../Mail.php");

Да, глупые скобки отсутствовали, но не было сгенерированной ошибки в этой строке моего скрипта, что было странно для меня

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...