Ошибка пути к файлу PHP для автозагрузчика

Вот моя файловая структура на моем веб-сервере cpanel

root
   > vendor
         > autoload.php
   > public_html
         > folder
               > file2.php
         > script_folder
               > include_file.php
         > file1.php

Внутри include_file.php у меня есть

 require_once('../vendor/autoload.php');

file1.php и file2.php содержат один и тот же вызов include_file.php.

 require_once($_SERVER["DOCUMENT_ROOT"]."/script_folder/include_file.php");

Это отлично работает, когда я запускаю file1.php, но когда я запускаю file2.php, я получаю следующее сообщение об ошибке.

Нет такого файла или каталога Неустранимая ошибка: require_once(): Не удалось открыть требуемый файл '../vendor/autoload.php' (include_path='.:/opt/cpanel/ea-php71/root/usr/share/pear') в /lvl1/lvl2/public_html/script_folder/include_file.php

Однако, если я изменю require_once('../vendor/autoload.php'); на require_once('../../vendor/autoload.php'); в include_file.php, тогда file2.php будет работать, а file1.php не будет работать. Показывает аналогичную ошибку.

Я понимаю, что это проблема пути к файлу, но я не понимаю, почему. Разве путь в include_file.php не должен быть всегда одним и тем же, независимо от того, какой файл его вызывает; то есть файл1.php или файл2.php?

Я вижу, что фактический оператор require_once вызывается из include_file.php, но поведение, которое я вижу, заставляет меня думать, что оператор require_once запускается из file1.php или file2.php, что приводит к ошибке пути к файлу.

Может кто-нибудь уточнить?


ОБНОВЛЕНИЕ: внутри include_file.php я пытался использовать:

require_once($_SERVER["DOCUMENT_ROOT"] . '/vendor/autoload.php');

и

require_once(dirname(__FILE__).'/vendor/autoload.php');

ни один из них не работает, поскольку оба возвращают public_html в качестве основного рабочего каталога. Моя папка vendor находится за пределами основного рабочего каталога.

то, что возвращается, это:

/script_folder/vendor/autoload.php

Я понимаю, что могу просто указать правильный путь к файлу в начале file1.php и file2.php, но я пытался найти способ уменьшить количество требований, которые мне нужны в каждом файле, до одного, указав их на include_file.php, а затем разрешив include_file.php сделать остальную работу.

Мой файл include_file.php содержит несколько других операторов require для других скриптов на моем сервере. Что-то вроде мини-автозагрузчика. Все остальные операторы require работают нормально, кроме autoload.php, с которым у меня возникли проблемы.

Единственная разница, которую я вижу, заключается в том, что мои другие сценарии находятся в моей папке public_html, а мой файл autoload.php находится за пределами public_html.


person Austin    schedule 25.09.2017    source источник
comment
Возможный дубликат ошибка относительного пути PHP require()   -  person cmorrissey    schedule 25.09.2017


Ответы (2)


Предполагая, что вы используете Composer, вам нужно только один раз указать «autoload.php» в file1.php, и файл должен содержать пространство имен, например namespace App;, в верхней части файла под открывающим тегом PHP. Впоследствии file2.php должно содержать namespace App\folder;, а included_file.php должно содержать namespace App\script_folder;.

Пространство имен также должно быть определено в composer.json следующим образом:

"autoload": {
    "psr-4": {
        "App\\": "public_html/"
    }
}
person Nathanael McDaniel    schedule 25.09.2017

Кажется, это работает отлично. Думаю, вместо относительного пути мне нужно использовать абсолютный путь.

include_file.php:

$autoload = str_replace('public_html','vendor/autoload.php',$_SERVER["DOCUMENT_ROOT"]);
include($autoload);

это позволяет мне звонить:

require_once($_SERVER["DOCUMENT_ROOT"]."/script_folder/include_file.php");

из любых файлов, находящихся в моей папке public_html.


в include_file.php $_SERVER["DOCUMENT_ROOT"] возвращает /lvl1/lvl2/public_html (полный путь сервера к общедоступной папке)

затем я заменяю public_html на путь к моему автозагрузчику vendor/autoload.php

person Austin    schedule 25.09.2017