php require_once пытается включить второй раз только на моем производственном сервере - PullRequest
3 голосов
/ 22 июня 2011

У меня есть этот код в верхней части различных включаемых файлов:

require_once("functions.php");

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

Когда я загружаю на свой рабочий сервер, он внезапно пытается включить файл functions.php во второй раз, что приводит к фатальной ошибке при попытке переопределить функции во второй раз.

Есть ли что-то в моей конфигурации php на моем рабочем сервере, что привело бы к тому, что require_once ведет себя по-другому?

Ответы [ 7 ]

3 голосов
/ 22 июня 2011

Вы можете использовать следующий код:

require_once(realpath(dirname(__FILE__) . '/functions.php'));

и изменить путь до functions.php, если functions.php находится в другом каталоге в корневом каталоге.Функция realpath (dirname ( FILE ) принимает путь к корневой папке. Поэтому вы должны включить вашу функцию в ваш index.php и изменить свой файл function.php в любом каталоге, например:

require_once (realpath(dirname(__FILE__) . '/your_directory_name/functions.php'));

Наслаждайтесь !!

2 голосов
/ 22 июня 2011

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

require_once dirname(__FILE__).'/functions.php';

2 голосов
/ 22 июня 2011

Возможно, у вас есть дубликаты файлов с именем functions.php?Ваш пример представляет относительное местоположение, возможно, вы загружаете его дважды?

Может быть, для отладки это будет echo __FILE__ из файла функций.

1 голос
/ 28 августа 2018

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

require_once __DIR__.'/address/src/Coordinates.php';
require_once __DIR__.'/Address/src/Coordinates.php';

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

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

var_dump(get_included_files());

Это даст вам список включенных файлов с их полными путями и точным использованием заглавных букв. Это поможет вам быстро найти критерий.

1 голос
/ 22 июня 2011

Может быть, уровень обработки ошибок установлен по-разному на 2 серверах?

require_once просто вернет true при вызове более одного раза, если я правильно помню.

С этой конструкцией возможны некоторые странные результаты:

Загружая (даже поддельный) файл дважды с помощью include_once, возвращаемое значение будет истинным.

Пример:

 <?php
  var_dump(include_once 'fakefile.ext'); // bool(false)
  var_dump(include_once 'fakefile.ext'); // bool(true)
 ?>

Это связано с тем, что согласно php файл уже был включен один раз (хотяне существует).

Не уверен, что это то же самое, что и require_once, но вполне может быть, поскольку документы ссылаются на include_once для ожидаемого поведения этой конструкции.

0 голосов
/ 22 июня 2011

Если вы включаете файлы, которые содержат классы, вы можете попробовать использовать __autoload, что должно препятствовать запуску нескольких включений / запросов и не позволяет перечислять несколько включений / запросов.

0 голосов
/ 22 июня 2011

Я, честно говоря, не могу придумать ничего, что могло бы вызвать такое поведение, если бы я немного знал о том, как устроен ваш сайт, я мог бы предложить несколько советов о том, как структурировать его по-другому, чтобы этого не произошло.

Что-то, что я делаю на своих сайтах, имеет такую ​​настройку:

global.php <- такие вещи, как настройка базы данных, включая файл со случайными функциями </p>

header.php <- базовый материал заголовка html, здесь требуется global.php. </p>

Тогда во всех остальных файлах просто требуется заголовочный файл, и у вас не должно быть конфликтов. Если вы используете конкретный фреймворк (CakePHP, Kohana), то это определенно меняет вещи ... как я уже сказал, недостаточно информации для продолжения.

...