Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Подскажите по require_once


Автор: V0fka 27.7.2013, 21:37
Привет!

Имеем такую структура

.
.. dir1
.... file1.php
.... file2.php
.. dir3
.... file3.php

В файле file1.php подключается file2:

Код

require_once('file2.php');


в котором подключаем file3

Код

require_once('../dir3/file3.php');


Но если структура поменяется так

.
.. dir1
.... dir11
........ file1.php
.... file2.php
.. dir3
.... file3.php

И в file1 изменить путь подключения на

Код

require_once('../file2.php');


то получаю ошибку, что file3 не найден, т.к. вот это подключение

Код

require_once('../dir3/file3.php');


хоть и выполняется в file2.php, но путь ищется относительно file1.php.

Можно как-то сделать, чтобы require_once отрабатывало относительно того файла, в котором вызывается?

Автор: ksnk 27.7.2013, 22:23
V0fka, каким образом вызывается файл? С консоли или сервером? Если вызывается модулем апача, то всегда инклюдится относительно файла, если консолью - всегда относительно "главного" скрипта.

Для единообразия можно делать chdir перед включением.
Код

chdir(__DIR__);
require_once('../file3.php');


Существуют более другие средства автоматизации поиска файлов.

установить include_path с нужными каталогами iniset('include_path',...); и включать файлы без указания каталога.

не использовать инклюд в явном виде вообще, а настроить автолод (spl_autoload), чтобы он сам искал классы в нужных местах.

Автор: V0fka 28.7.2013, 13:59
ksnk, дело в том, что я не совсем в курсе что подразумевается под "консолью" или "сервером". Скрипт должен вызываться по CRON-у, но для отладки и проверки я запускаю его из браузера. Так вот при запуске из браузера, я как раз и обнаружил эту досадную штуку, т.к. перенес скрипты в каталог на уровень ниже, поменял путь к некоторым подключаемым файлам (вместо ../../ сделал ../../../) и скрипты перестали работать, ругаясь о невозможности подкчлючения файлов в в тех скриптах, которые не трогались и не перемещались. Менять что-то в не моих скриптах я не хочу, т.к. они используются в других, мне не известных, местах и я боюсь, что потом долго и нудно придется отлавливать новые неизвестные ошибки. Поэтому я подумал, что может быть есть возможность в вызывающем (главном/запускаемом) скрипте как-то явно указать, чтобы require_once во всех скриптах, в т.ч. и подключаемых, выполнялось относительно того файла, откуда эта функция вызывается.

Автор: ksnk 28.7.2013, 16:59
консоль - запуск через php. Крон именно так и запускает скрипт. Сервер запускает через модуль апача. У них разная логика в обработке.

Я уже предложил 3 возможных способа решить проблему.

Автор: ksnk 28.7.2013, 17:37
еще один вариант - использовать в кроне команду fetch
Код

/usr/bin/fetch -o /dev/null http://my.site.com/my_sccript.php >/dev/null 2>&1

тогда починять придется только один вариант запуска.

Автор: V0fka 29.7.2013, 09:37
ksnk, спасибо за ответы! Буду пробовать применть что-то из вами предложенного. smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)