PHP require и require_once не работают на относительном пути

Мы переместили наш хостинг с сервера, на котором размещался PHP 5.6, на новый сервер, на котором размещен PHP 7.0.. После миграции мы заметили следующую проблему:

PHP Warning: include_once(../classes/ClassA.php): failed to open stream: No such file or directory in /var/www/html/addons/addon.php php on line 37

Я понимаю, что это должно работать с

include_once __DIR__."/../classes/ClassA.php";

Но я не понимаю, почему он работал на предыдущем сервере, а не на новом. Существуют ли какие-либо изменения php.ini, которые позволяли ему работать без префикса __DIR __?

Примечание: отсутствует . для конкатенации между __dir__ и строкой.

Syscall 30.03.2018 10:22

Также проверьте, как вызывается скрипт. Если вы вызываете файл php в /var/www/html/addons/ из другого файла php в том же каталоге, __DIR__ будет отличаться от того, когда вы вызываете этот файл из совершенно другого каталога.

kevin 30.03.2018 10:25

@Syscall Добавил конкатенацию, плохо!

Viktor 30.03.2018 10:58

@kevin В основном это проблема, которая возникла при миграции на новый сервер. Файлы и база данных точно такие же, версия PHP отличается и, вероятно, это php.ini. Есть ли какие-то настройки, которые должны заставить его работать, как на предыдущем сервере? Причина, по которой я спрашиваю, состоит в том, что у нас есть более 2000 файлов, которые определенно нуждаются в некотором рефакторинге, поскольку они были написаны многими разными разработчиками, и что-то может не остаться незамеченным.

Viktor 30.03.2018 11:09

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

kevin 30.03.2018 11:40
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
5
59
2

Ответы 2

try realpath() function..!

include_once realpath(__DIR__."/../classes/ClassA.php");

Функция realpath() возвращает абсолютный путь.

Эта функция удаляет все символические ссылки (например, /./, «/../» и дополнительный «/») и возвращает абсолютный путь.

Эта функция возвращает FALSE в случае ошибки.

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

A.L 30.03.2018 10:57

Используйте $ _SERVER ['DOCUMENT_ROOT'] вместо _DIR_. Удалите компоненты пути ../../ и укажите абсолютный указатель на файл с помощью переменной $ _SERVER.

Или же

Создайте константу БАЗЕПАТ со значением абсолютного пути к корневому каталогу вашего сайта. Что вы можете использовать для абсолютного указания на включаемый файл. Если вы перейдете на другой сервер, просто обновите значение этой переменной, если это необходимо.

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

kevin 30.03.2018 11:37

Другие вопросы по теме