как узнать имеется ли на данный момент активное соединение с базой

col

Guest
как узнать имеется ли на данный момент активное соединение с базой

Привет всем.
Суть вопроса в сабже.

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

Покудова у меня только одна "бредовая" идея, это обьявлять в калассе коннекта к базе константу, а потом смотреть в остальных классах обьявлена ли такая.
Вот собственно всё.
Нус.. кто что скажет.
 

Falc

Новичок
col
У меня конект к базе вынесен в отдельный файл, а везде где нужна база делаю:
include_once 'connect.php';

Никаких проблем не было :)
 

col

Guest
не так не хоцца .......
у меня класс для етого есть
ну не про ето разговор...

ну ждемс дальше
 

AlexVN

Новичок
:)
Смотря что ты имеешь в виду.
Грамотнытный класс Connection обычно позволяет сделать что-то вроде такого:
// $cn = new Connection();
if ($cn->isOpen()) {
// do something
}

Можно еще так:
if (is_object($cn) && $cn->isOpen()) {
// do something
}
 

lucas

Guest
А можно заставлять класс проверять установленность соединения при каждом реквесте (is_resource($this -> connection) == true) { ... }) и коннектиться в противном случае (часто при первом реквесте).
 

JVN

Guest
Есть такая хорошая штука mysql_ping() см. мануал. Появилось с версии 4.3.0.
А is_resource(), насколько я понимаю, проверяет ТИП переменной. Т.е. если сервер БД закрыл соединение переменная останется переменной, так что толку от такой проверки мало. Впрочем могу ошибаться, возможно is_resource() проверяет еще и валидность ресурса - в исходниках пхп я не рылся...
 

lucas

Guest
0. is_resource() действительно проверяет тип переменной и не проверяет валидность ресурса.

1а. Толк от такой проверки в том, что, сохранив в свойстве connection класса работы с БД ресурс коннекта к базе (подконнектившись, например, в конструкторе), мы потом сможем вышеприведенной проверкой узнать, успешно ли мы приконнектились прежде.

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

2. В силу вышеприведенных причин mysql_ping() в большинстве случаев использовать нет нужды.
 

Фанат

oncle terrible
Команда форума
Я, может, не в теме, но не понимаю, че вы паритесь?

if (!$this->link) $this->connect();

или я чего-то не понимаю?
 

JVN

Guest
Автор оригинала: Фанат
или я чего-то не понимаю?
По ходу я тоже чего-то не понимаю... :)))
Нормально написанный скрипт за время своей короткой "жизни" коннектится к одному серверу БД только один раз.

Если первая попытка законнектится не удалась то с огромной вероятностью можно утверждать что не удадуться и последующие:

PHP:
($this->link = mysql_connect(...)) || die('приплыли...');
Если не удалось установить соединение, в большинстве случаев продолжать выполнение скрипта бессмысленно.
Если он продолжает выполнение после этой строки - линк валидный. Но он может стать недействительным если сервер разорвет соединение между вызовами mysql_connect() и mysql_query().
Согласен, вероятность этого довольно мала, но это есть тема данного топика, насколько я понял.

Проверка переменной $this->link ничего в этом смысле не дает значит остается только mysql_ping().
Кстати эта функция восстановит соединение, если конечно сервер в данный момент на это способен.
 

lucas

Guest
Фанат
if (!$this->link) $this->connect();
Это (в несколько расширенном виде) я и объяснял JVN'у.


JVN
Проверка переменной $this->link ничего в этом смысле не дает значит остается только mysql_ping().
Дубль два:
1б. Вероятность, что сервер баз данных (MySQL) отвалится по таймауту или по любой другой причине обычно довольно мала, но любой такой случай может быть детектирован функцией mysql_error().

2. В силу вышеприведенных причин mysql_ping() в большинстве случаев использовать нет нужды.
 

JVN

Guest
Автор оригинала: lucas
Дубль два:
Дубль два-бис:
Понятно что вероятность мала и в реальной жизни этот mysql_ping() абсолютно не нужен, если конечно его скрипт не работает дительное время. Но человек-то который топик открыл именно об этом и спрашивал.

Но проверка is_resource()'ом бессмысленна в любом случае.
 

lucas

Guest
1.
в реальной жизни этот mysql_ping() абсолютно не нужен
Аплодисменты в студию. :) :)
если конечно его скрипт не работает дительное время
Больше восьми часов?

2.
Но проверка is_resource()'ом бессмысленна в любом случае.
Дубль три:
1а. Толк от такой проверки в том, что, сохранив в свойстве connection класса работы с БД ресурс коннекта к базе (подконнектившись, например, в конструкторе), мы потом сможем вышеприведенной проверкой узнать, успешно ли мы приконнектились прежде.
Плюс медитировать над кодом Фаната.
 

JVN

Guest
Автор оригинала: lucas
1.
Аплодисменты в студию. :) :)
Не надо прикалываться...
Я ничего смешного не рассказываю. Скрипт может и восемь часов работать, между прочим. В жизни все бывает.
Если твой скрипт должен что-то делать даже в случае неудачного коннекта к базе, т.е. между mysql_connect() и mysql_query должно что-то отработать вне зависимости от результата первого - вопросов нет - is_resource().
Но я что-то не сталкивался с подобными скриптами и не представляю зачем это может понадобиться.
 

lucas

Guest
JVN
Не надо прикалываться...
Я почти серьезен. Это означало радость в отношении факта, что ты согласился насчет mysql_ping().
Скрипт может и восемь часов работать, между прочим. В жизни все бывает.
Ты сам когда-либо сталкивался со скриптом на PHP, непрерывно работающем несколько часов? (Отдельные извраты типа чатов не рассматриваем.)
вопросов нет - is_resource().
Напряжем зрителей в третий раз. :)
Но я что-то не сталкивался с подобными скриптами и не представляю зачем это может понадобиться.
Например:
1. При создании экземпляра класса работы с БД коннект не осуществляется.
2. При каждом вызове метода query происходит вызов метода connect, который проверяет (is_resource), не произошел ли коннект к серверу прежде, и коннектит в противном случае.

Это полезно, если необходимо создать экземпляр класса в люьом случае, а коннектиться не обязательно. В противном случае можно коннектиться в конструкторе.
 

Фанат

oncle terrible
Команда форума
И правда.
Рыбятки, вы определитесь, чего вы хотитя.

проверять перед каждым запросом - а не делся ли куда-нибудь мускуль?

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

col

Guest
то ALL

Мда ... народ.

Причиной такой оживленной и по большинству ответов направленных вообще не вту степь дисскусси, является моё как оказалось недосканальное описание проблемы. За что приношу свои извинения.

Ну во первых БД не мускул, а InterBase. Поэтому я и поместил свою тему не в раздел про мускул.

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

Ну и в заключении.
Из того что я прочитал выше могу сказать следующее.
Если бы речь шла о мускуле, то сохранение link_identifier в константу, а потом проверка его в конструкторе mysql_ping'ом - было бы для МЕНЯ (никому своё мнение не навязываю) идеальным решением. За что отдельное спасибо JVN. Вот если бы такое решение было бы применимо к InterBase это былоб супер.
Так что жду дальнейших ваших ЦЕННЫХ советов и рекоммендаций.

PS
to Вечно ставящему все под сомнение Demiurg'у и поддержавшему его AlexVN.

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

Фанат

oncle terrible
Команда форума
Мда.
что-то писать человеку со съехавшим чердаком - это себя не любить :)
Здесь еще страницу напишут, а потом он еще что-нибудь вспомнит:)
 
Сверху