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


Автор: Alf162 16.5.2013, 09:12
Здравствуйте. Есть ли механизмы в firebird с помощью которых можно было бы отреагировать на событие изменения изменения бд. Т.е. в базу добавились новые записи и приложение на php могло на это отреагировать. Вариант с таймером единственное, что приходит на ум. Записи добавляются через десктопное приложение и туда влезть возможности нет. Какие могут быть варианты?

Автор: Zorak 16.5.2013, 09:50
работы с таймером на PHP попросту нет, хотя в зависимости от условий данную задачу можно решить. Далее... здесь надо не так firebird как PHP (тут же создана тема). Если хочешь с таймером - смотри в сторону js и будет тебе счастье. Если PHP - напиши больше ниформации, тогда мб и будут советы с использованием PHP.

Автор: Alf162 16.5.2013, 12:21
Как сделать с таймером я примерно знаю, но этот вариант не очень подходит. Нужен php.
Больше информации: есть база FB и приложение на Delphi, которое работает с этой базой. На php сделан web-интерфейс, с помощью которого отображаются данные из этой базы. Так вот, необходимо, чтобы при добавлении новой записи в базу, приложение на php немедленно реагировало и отображала новую, появившуюся в базе информацю

Автор: Zorak 16.5.2013, 14:01
смотри в сторону cron. Если не подходит то более извращенный способ php: header('refresh: 3') или как то так. Будет тебе каждые 3 секунды обновлять страницу (или укажи другое число). Чтобы не было долгой перезагрузки, то привяжи ajax, который будет обновлять не страницу а только данные в таблице.  Моментально реагировать не будет, но если указать вменяемый интервал в header, который тебе нужен, то вовремя будеш видить измененя в базе. 
Это 1 из примеров что пришли мне в голову, а вообще можно и другими способами, ну как по мне я бы делал именно так. 

Да будет тебе счастье.!

Автор: Fortop 16.5.2013, 14:31
http://www.cyberforum.ru/ado-net/thread588000.html

но для скрипта пхп это так просто не пройдет.

Т.е. тебе нужен какой-либо скрипт/демон (можно на самом пхп) который будет слушать события и твоя веб-часть которая будет аяксом этот скрипт/демон опрашивать.
По поводу связи веб-фронтенда с демоном можно посмотреть в сторону long polling технологий

Автор: Alf162 16.5.2013, 19:19
Спасибо за ответы, попробую через refresh, это как-то ближе)

Автор: Arantir 16.5.2013, 20:38
Цитата(Alf162 @  16.5.2013,  18:19 Найти цитируемый пост)
 попробую через refresh

Такой подход не очень удобно смотрится с точки зрения пользователя. Бесконтрольные обновления страницы...

Цитата(Alf162 @  16.5.2013,  18:19 Найти цитируемый пост)
 это как-то ближе) 

Я не знаю Ваш уровень, как программиста, но попробую предложить краткое описание возможного решения Вашей задачи.
Да, конечно, на PHP это не очень элегантно получится =)
Нужно уметь работать с сессиями в PHP, с кешем в PHP, с ajax в JavaScript, с long polling в JavaScript.
Поскольку запись в базу, видимо, так же производится через веб-интерфейс, то несложно дополнить скрипт новыми возможностями.
При успешной записи данных в БД (или любом другом требуемом месте) добавить в кеш в некий массив (например, "events") запись с указанием имени события и его временем, например событие "RecordCreated".
Создать скрипт, который будет выполняться по ajax-запросу (ну, обычный скрипт, в общем). В нем проверить в текущей сессии пользователя время последнего получения события. Из кеша из массива событий получить все события, которые случились после последней проверки. Если событий нет, то продолжать скриптом проверки массива в кеше, например, каждую 1 секунду (long polling). При наличии событий записать в сессию время последнего обработанного события и отправить события пользователю любым удобным образом.
На стороне пользователя получить ответ от сервера со списком событий. Нужным образом отреагировать на события. Например, при получении строки "RecordCreated" обновить таблицу данных с помощью ajax. После чего отправить новый ajax-запрос в скрипт событий.

Как-то так...

Автор: Zorak 16.5.2013, 20:47
Цитата(Alf162 @  16.5.2013,  18:19 Найти цитируемый пост)
Такой подход не очень удобно смотрится с точки зрения пользователя. Бесконтрольные обновления страницы...

Alf162, тут Arantir кстати прав, обьясню: (касается исключительно пользователя)
1. Если на стороне пользователя страница будет перезагружатся каждые n секунд.. лично я наверное убилбы разработчика,  и чем меньше секунд, тем больше раз убилбы. В этом случае спасает ajax, который обновляет часть страницы по сути БЕЗ перезагрузки самой страницы. Тут не убилбы... наоборот даже... возьми для примера букмекерские сайты. Очень часто встречается момент, когда данные обнвляются просто постоянно. Т.е. несколько раз в короткий промежуток времени. Иными словами если твоя страница будет для пользователя, то тут до refresha лепить ajax обьязательно
далее...
2. По поводу бесконтрольных обнвлений страниц. Опять же... при перезагрузке страниц по сути происходит отправка неких данных, и кто более менее понимает сущность интернета и программирования, то это просто напросто вызывает настороженность, а в друг он передает какието мои личные данные из компьютера?? Иначе зачем перезагружается раз в 3 секунды страница ???.. И тут опять же спасает ajax, хотя от опасения не полностью).

А если страница лично тебе, то тут смотри сам, как тебе удобно.

Автор: Fortop 16.5.2013, 21:46
Цитата(Arantir @  16.5.2013,  20:38 Найти цитируемый пост)
Из кеша из массива событий получить все события

У Firebird есть механизм "событий" насколько он рабочий не подскажу.
гуглите.

Автор: Arantir 16.5.2013, 22:40
Цитата(Fortop @  16.5.2013,  20:46 Найти цитируемый пост)
У Firebird есть механизм "событий" насколько он рабочий не подскажу.

Все равно их придется куда-то прикрутить, чтобы они "дошли" до пользователя. Не будет же СУБД напрямую юзеру в браузер ответы слать. 
А на PHP я вообще трудно представляю полноценные "человеческие" события. Я бы сразу отдельного демона на каком-то Node.js сделал. Хотя бы чтобы ночью спать спокойно...

В программировании все возможно, но не все оно хорошо и правильно. Я как-то больше сторонник рациональных решений.

Автор: Alf162 17.5.2013, 10:32
Про node.js я слышал, но у меня windows и только windows (ко всему прочему еще и IIS). В общем решил делать с таймером и ajax'ом, все почти готово. Добавляются записи через Delphi, поэтому вариант с сессиями тоже не очень

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