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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Не могу понять поведение require_once 
V
    Опции темы
V0fka
Дата 24.11.2013, 12:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Привет!

Есть скрипт, в котором через require_once подключается файл config. Скрипт примерно такой структуры.

Код

function foo()
{
   
   // тут используются данные из файла config
   ...
   return $db_connection;

}

$db = foo();


Пишу require_once('../config.php') в самом начале скрипта, до объявления функции. В таком случае при попытке открыть скрипт браузером, браузер мне сообщает, что такого файла не существует. "Такого файла" - имеется ввиду скрипта, который я пытаюсь запустить.

Начинает работать, если я require_once('../config.php') вношу в тело функции.

Подскажите, пожалуйста, почему не работает в первом случае? И как получить "вменяемую" ошибку, вместо "файл не найден"?

Это сообщение отредактировал(а) V0fka - 24.11.2013, 13:00
PM MAIL   Вверх
ksnk
Дата 24.11.2013, 14:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(V0fka @  24.11.2013,  12:59 Найти цитируемый пост)
И как получить "вменяемую" ошибку, вместо "файл не найден"?

Код

if(!@include_once '...' ) {
  echo' file not found in '. getcwd();
}


тонкость в том, что при включении файла "текущим" каталогом становится каталог этого файла. А функция вызывается из другого файла.

Разумно включать абсолютным именем файла, а не относительным. 


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


Опытный
**


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

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



ksnk, не могли бы вы объяснить как для тех, кто в танке. Потому что не пойму. Сделал тест. Имеется такая структура:

. test1.php
. test (это каталог)
... test.php
... test2.php

Т.е. есть файл test1.php и каталог test, которые находятся на одном уровне. В каталоге находится 2 файла: test и test2. Содержимое файлов следующее:

test.php:

Код

require_once('../test1.php');
echo $a1;
echo '<br>';

require_once('test2.php');
echo $a2;


test1.php:
Код

$a1 = getcwd();


test2.php:
Код

$a2 = getcwd();


Запускаю на выполнение test.php и получаю результат:

.../public_html/test
.../public_html/test

Т.е. текущий каталог вроде как один и тот же показывает. Пробовал такой вариант файла test (запускаемого файла):

Код

require_once('../test1.php');
echo getcwd();
echo '<br>';

require_once('test2.php');
echo getcwd();


Аналогично, выводит один и тот же каталог. В общем, не дошло что-то ко мне...
PM MAIL   Вверх
ksnk
Дата 24.11.2013, 15:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(V0fka @  24.11.2013,  14:34 Найти цитируемый пост)
Запускаю на выполнение test.php и получаю результат:

Как запускается скрипт?

mod_php из под сервера Appache ведет себя как я написал, CLI из командной строки не меняет текущий каталог при включении. 


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


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

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



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

и да, решение в:
Цитата(ksnk @  24.11.2013,  14:03 Найти цитируемый пост)
Разумно включать абсолютным именем файла, а не относительным.  


в качестве опоры стандартно используют $_SERVER['DOCUMENT_ROOT']
PM MAIL WWW   Вверх
V0fka
Дата 26.11.2013, 11:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(ksnk @  24.11.2013,  15:03 Найти цитируемый пост)
Как запускается скрипт?
mod_php из под сервера Appache ведет себя как я написал, CLI из командной строки не меняет текущий каталог при включении. 

Из браузера. Но вообще скрипт должен отрабатывать по расписанию (по CRON-у). В общем, наверное, нужно просто взять себе за правило не указывать относительные пути, как вы пишете, и эти проблемы будут не актуальны.

Цитата(bars80080 @  24.11.2013,  15:08 Найти цитируемый пост)
не надо придумывать тестовые примеры, которые только запутывают.на существующем конкретном случае посмотри текущие пути. вставь echo getcwd() на место вызова require в обоих случаях и посмотри

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

Цитата(bars80080 @  24.11.2013,  15:08 Найти цитируемый пост)
в качестве опоры стандартно используют $_SERVER['DOCUMENT_ROOT']

Возьму это себе за правило.

ksnk, bars80080, большое спасибо за ответы!
PM MAIL   Вверх
bars80080
Дата 27.11.2013, 11:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

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



Цитата(V0fka @  26.11.2013,  11:36 Найти цитируемый пост)
Из браузера. Но вообще скрипт должен отрабатывать по расписанию (по CRON-у).

а это как раз разные вещи, если конечно скрипт не запускается с директивой wget

если же скрипт запустить из крона напрямую, то весьма вероятно что будут полностью отсутствовать переменные окружения. к примеру, тот же массив $_SERVER будет отсутствовать

конкретной задаче - конкретные решения
PM MAIL WWW   Вверх
V0fka
Дата 28.11.2013, 16:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



bars80080, понял, спасибо! Пищу для размышления получил.
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.0517 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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