Мы переместили наш хостинг с сервера, на котором размещался 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 __?
Также проверьте, как вызывается скрипт. Если вы вызываете файл php в /var/www/html/addons/ из другого файла php в том же каталоге, __DIR__ будет отличаться от того, когда вы вызываете этот файл из совершенно другого каталога.
@Syscall Добавил конкатенацию, плохо!
@kevin В основном это проблема, которая возникла при миграции на новый сервер. Файлы и база данных точно такие же, версия PHP отличается и, вероятно, это php.ini. Есть ли какие-то настройки, которые должны заставить его работать, как на предыдущем сервере? Причина, по которой я спрашиваю, состоит в том, что у нас есть более 2000 файлов, которые определенно нуждаются в некотором рефакторинге, поскольку они были написаны многими разными разработчиками, и что-то может не остаться незамеченным.
Простое перемещение файлов на другой сервер не гарантирует одинакового поведения. Конфигурация сервера может отличаться, из-за чего ваш код ведет себя по-другому, переменная среды может отличаться. Вы говорите, что версия PHP отличается, что может вызвать огромные изменения, но это определенно не то, что нельзя сбрасывать со счетов как вероятную причину проблем. Попробуйте установить чистую виртуальную машину точно так же, как старый сервер, и посмотрите, работает ли она там, затем попробуйте медленно сделать виртуальную машину более похожей на ваш новый сервер и посмотрите, когда код сломается.






try
realpath()function..!
include_once realpath(__DIR__."/../classes/ClassA.php");
Функция realpath() возвращает абсолютный путь.
Эта функция удаляет все символические ссылки (например, /./, «/../» и дополнительный «/») и возвращает абсолютный путь.
Эта функция возвращает FALSE в случае ошибки.
Почему вы рекомендуете использовать эту функцию? Пожалуйста, добавьте пояснение.
Используйте $ _SERVER ['DOCUMENT_ROOT'] вместо _DIR_. Удалите компоненты пути ../../ и укажите абсолютный указатель на файл с помощью переменной $ _SERVER.
Или же
Создайте константу БАЗЕПАТ со значением абсолютного пути к корневому каталогу вашего сайта. Что вы можете использовать для абсолютного указания на включаемый файл. Если вы перейдете на другой сервер, просто обновите значение этой переменной, если это необходимо.
Когда дело доходит до PHP, это путь наименьшего сопротивления, слишком большая головная боль, чтобы отслеживать текущий рабочий каталог и его изменения (вызов другого файла), а когда нет (вызов метода во включенном файле), и позволить коду зависеть от этого.
Примечание: отсутствует
.для конкатенации между__dir__и строкой.