Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Подскажите по require_once 
:(
    Опции темы
V0fka
Дата 27.7.2013, 21:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 311
Регистрация: 5.11.2006
Где: Украина

Репутация: нет
Всего: нет



Привет!

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

.
.. 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 отрабатывало относительно того файла, в котором вызывается?
PM MAIL   Вверх
ksnk
Дата 27.7.2013, 22:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



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

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

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


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

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

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


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
V0fka
Дата 28.7.2013, 13:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 311
Регистрация: 5.11.2006
Где: Украина

Репутация: нет
Всего: нет



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


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



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

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


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
ksnk
Дата 28.7.2013, 17:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



еще один вариант - использовать в кроне команду fetch
Код

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

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



--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
V0fka
Дата 29.7.2013, 09:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 311
Регистрация: 5.11.2006
Где: Украина

Репутация: нет
Всего: нет



ksnk, спасибо за ответы! Буду пробовать применть что-то из вами предложенного. smile
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0633 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.