PHP require_once вызывается более одного раза - PullRequest
0 голосов
/ 29 мая 2018

Я опубликовал решение в качестве ответа

У меня возникла странная проблема при переносе некоторого кода PHP на новый сервер.Старый сервер работает под управлением PHP 5.3 (x86), а новый сервер работает под управлением PHP 7.0 (x64).Оба работают на IIS 7.5.

Код, вызвавший проблему, был в работе без проблем в течение почти трех лет.Он отлично работает на текущем производственном сервере, а также на двух системах разработки.Все три работают на PHP 5.3 (x86).

Эти ошибки не возникают, когда я использую PHP 5.3 (x86) на новом сервере.

Общий файл (с именем _common_funcs.php) содержит общие функции, которые вызываются из многих сценариев.Поскольку некоторые из этих сценариев могут взаимодействовать, я использую require_once ('_ common_funcs.php'), чтобы включить файл.Это довольно простой подход.

На новом сервере в первый раз a скрипт запускает, он генерирует ошибку 'Cannot redeclare'.Обновление страницы не отображает ошибку - она ​​отображает страницу, как ожидалось.Например:

  • // localhost / app / display_account.html? Account = 123456 генерирует ошибку.
  • // localhost / app / display_account.html? Account = 123456 снова делаетошибка не отображается.

Перезапуск сервера IIS приводит к повторному генерированию ошибки при первом запуске.

Теперь для нечетной части.Обратите внимание на заглавные буквы дисков в приведенной ниже ошибке:

Cannot redeclare acct_has_graduated() (previously declared in D:\app_directory\includes\_common_funcs.php:2061) in d:\app_directory\includes\_common_funcs.php on line 2061

Если я жестко закодирую полный путь в одной строке require_once () и использую строчную букву d, то ошибка в журнале поменяется местамикапитализация.Это результаты 'd: \ app ...' и 'D: \ app ...'.

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

И чтобы сделать это немного интереснее, функция acct_has_graduated () является последней функцией в файле _common_funcs.php.Но если я отключаю OpCache в php.ini, я получаю следующую ошибку:

Cannot redeclare update_ledger() (previously declared in D:\app_directory\includes\_common_funcs.php:7) in d:\app_directory\includes\_common_funcs.php on line 42

Обратите внимание на две вещи: update_ledger () - это первая функция в файле _common_funcs.php, а «строка 42» - этозакрывающая скобка функции update_ledger () (строка 7 - объявление).

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

Ответы [ 2 ]

0 голосов
/ 29 мая 2018

Решение

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

Этот сценарий, безусловно, является выбросом, но вот он:

  1. У меня есть ссылка на директорию из c: \ inetpub \ wwwroot \app_location to d: \ app_location.
  2. Конфигурация IIS для этого сайта указывает на c: \ inetpub \ wwwroot \ app_location.
  3. Файл конфигурации приложения определяет include_path с помощью c: \ inetpub \ wwwroot\ app_location в качестве базы.
  4. Все файлы для этого сайта находятся в каталоге d: \ app_location.

Использование конфигурации над всеми записями в файлах журнала приложения (отслеживание, аудит, ошибка и обратная трассировка) show D: \ app_location в качестве базового расположения всех файлов.

Вызов require_once () для файла более одного раза, в то же время позволяя include_path разрешить местоположение файла в один или оба из вызовов генерируют ошибку «Cannot redeclare».В сообщении об ошибке указывается обратная заглавная буква буквы «D:» (см. Текст ошибки в посте выше).

Изменение базы include_path (# 3 выше) на d: \ app_location решило эту проблему.

0 голосов
/ 29 мая 2018

Вопрос очень прост.

require_once('D:\file.php');
require_once('file.php');

будет выполняться дважды, потому что вы указали абсолютный путь!

Решение Используйте относительный путь

require_once('../core/file.php');
...