|
|
|
| Подскажите новичку, пожалуйста, по какому принципу организуется двухсторонний диалог с посетителем сайта на PHP?
1. Пользователь вошел на сайт
2. Пользователь что-то нажал
3. Сервер выполнил какие-то вычисления
4. Сервер самостоятельно перерисовал сайт пользователя
По 2: можно ли сделать, чтобы по нажатии кнопки скрипт PHP не перерисовывал содержимое экрана, а просто выполнял что-то на сервере (записывал в БД, изменял лок. переменную)? На js я это делаю так: <a href="" onclick="my_func();">Нажмите на эту кнопку</a>
По 4: Хотелось бы смоделировать ситуацию, когда перерисовка не явилась непосредственной реакцей на переход по ссылке с сайта. Но чтобы PHP "помнил" всех своих посетителей и у каждого в какой-то момент мог перерисовать сайт на локальном компе после каких-то своих вычислений, или просто по таймеру. То есть:
- Как помнить все лок. открытия сайта?
- Как обратиться к такому лок. открытию в любой момент, чтобы перерисовать?
- А можно без перерисовки просто что-то поменять, например, лок. переменную?
Спасибо заранее... | |
|
|
|
|
|
|
|
для: O-Planet
(12.03.2007 в 17:35)
| | Пункт 2: см. использование AJAX
Пункт 4: не совсем понял, но думаю, возможно, тоже AJAX Вам поможет... :-) | |
|
|
|
|
|
|
|
для: O-Planet
(12.03.2007 в 17:35)
| | Пункт 4, скорее всего, неосуществим (если я правильно его понял). Это общий закон: чтобы что-то произошло, пользователь должен совершить некие действия. Без ведома пользователя сделать ничего не получится. Ну, в крайнем случае, можно заменить пользователя JS-скриптом, но это ненадежно - JS может быть отключен. | |
|
|
|
|
|
|
|
для: Киналь
(12.03.2007 в 19:24)
| | > Пункт 4, скорее всего, неосуществим
Это точно? Действительно нет возможности что-то обновлять на открытом пользовательском сайте средствами ПХП, например, по IP, по какой-нить контекстной ссылке, с помощью сессий?..
Нет, я, конечно, знаю одно решение:
1. Пользователь жмет кнопку, сайт оставляет запись в БД "Input" о себе (UID) и действии пользователя.
2. Сервер в цикле отрабатывает все такие записи и генерирует ответы, оставляя новые записи в БД "Output"
3. Сайт в цикле опрашивает (js) базу БД "Output", ожидая появление ответа на свой запрос по UID, и когда таковой появляется - запускает скрипт перерисовки.
Что-то из разряда микропроцессорных технологий :) А можно ли более типовыми методами эту задачу решить?
ВОПРОС: Можно ли на сервере "знать" о всех, кто сейчас работает на сайте, как-то их различать, посылать им отдельные сообщения? | |
|
|
|
|
|
|
|
для: O-Planet
(12.03.2007 в 23:29)
| | Можно ли на сервере "знать" о всех, кто сейчас работает на сайте, как-то их различать, посылать им отдельные сообщения?
Знать о тех кто сейчас на сайте? Для этого придумана регистрация
Различать и посылать сообщения... всё в ваших руках
Без кода, компьютер - это груда дорогостоящего железа, а сервер - это большая груда оченьдорогостоящего железа))) | |
|
|
|
|
|
|
|
для: O-Planet
(12.03.2007 в 23:29)
| | >ВОПРОС: Можно ли на сервере "знать" о всех, кто сейчас работает на сайте, как-то их различать, посылать им отдельные сообщения?
Ответ: теоретически да, практически - с оговорками. И в виде бонуса - небольшой ликбез=)
Как вообще работает сайт на РНР? Пользователь посылает запрос, РНР его принимает и начинает работу. Работа заканчивается формированием HTML-кода, который и отдается пользователю. Как только HTML-код ушел, РНР забыл о пользователе, как будто его и не было никогда; пользователь перестал существовать для РНР. Чтобы при повторном обращении РНР "вспомнил" пользователя, применяют специальные приемы - сессии и cookie. Но в любом случае, работа РНР состоит из фаз запрос - ответ; никакого ожидания или отслеживания. Объясняется это тем, что протокол http - это протокол без сохранения состояния, он просто не приспособлен для такого.
С другой стороны, можно исхитриться и создать видимость такого "прямого контакта". Пример тому - чаты. Но и там все строится просто на регулярном обновлении страницы (или ее части). Всегда есть небольшая погрешность в определении того. на сайте человек или нет. Но все равно, написать Instant messenger на РНР вряд ли получится=) Он все же не для того. | |
|
|
|
|
|
|
|
для: Киналь
(12.03.2007 в 23:46)
| | Спасибо за лекбез. Впрочем, на ПХП я писал пару скриптов, и именно в таком ракурсе "вопрос-ответ" я его и воспринимал. Поэтому, особой необходимости в ПХП до сих пор не было. С помощью js, как правило, удавалось решить все, вплоть до корзины покупок на разных страницах сайта, не поддерживающего ПХП в принципе. Но сейчас передо мной задача - организовать совместную работу многих пользователей на моем сайте. (Хороший пример - чат) И не только работу, но некоторую циклическую обработку того, что они вводят. Отсюда - 2 проблемы:
1. Помнить состояние пользователя на сервере и влиять на него
2. Обрабатывать спонтанные запросы от разных пользователей в цикле.
Пока я понял для себя, что для первого подойдет mysql, а для второго - внешнее приложение, работающее на сервере. Но я все-таки надеялся, что и ПХП имеет механизмы, кот. хоть отчасти эти вопросы решают. Предполагаю, что cgi также предназначены в основном для технологий "вопрос-ответ"
Поэтому, спрошу, пожалуй, только еще одно: а есть ли альтернатива ПХП, mysql, внешнему приложению, предоставляющая возможность так организовать сервер, чтобы поддерживались некие каналы связи "сервер - активный пользователь"? | |
|
|
|
|
|
|
|
для: O-Planet
(13.03.2007 в 01:50)
| | >Поэтому, спрошу, пожалуй, только еще одно: а есть ли альтернатива ПХП, mysql, внешнему приложению, предоставляющая возможность так организовать сервер, чтобы поддерживались некие каналы связи "сервер - активный пользователь"?
Тут боюсь ошибиться, но скорее всего, чтобы "держать руку на пульсе", вам придется изобретать собственный протокол на основе TCP/IP=) Http, насколько я знаю, не позволяет держать постоянный канал связи. Это можно обойти, в зависимости от задачи. Например, в тех же чатах проблема решается периодическими (раз в несколько секунд) запросами от браузера к серверу. Но, опять, все зависит от задачи. Он-лайн игру-шутер так не сделать - информация пользователя всегда будет отставать от информации сервера на две-три секунды.
>2. Обрабатывать спонтанные запросы от разных пользователей в цикле.
Так это другое дело) Запрос от пользователя сервер может обработать в любой момент; он не может сам посылать запрос пользователю, а наоборот - сколько угодно. При желании можно и бесконечный цикл организовать, другой вопрос, нужно ли. Проще так: пользователь, когда ему захотелось, сделал некий запрос (допустим, на изменение некоторого числа). Запрос пришел на сервер к обработчику; обработчик принял и записал число в базу; Остальные пользователи опрашивают сервер каждые пять (допустим) секунд, и каждый раз он им выдает им число из базы. Таким образом, максимум через пять секунд после изменения числа первым пользователем остальные увидят это изменение.
Может, я просто не очень понимаю, чето вам нужно, так что прошу прощения, если чересчур многословно объясняю и так вам известное) | |
|
|
|
|
|
|
|
для: Киналь
(13.03.2007 в 11:57)
| | Нет, с эмуляцией диалога через опрос со стороны пользователей - все Ок. Я и говорил, что такое часто в микропроцессорной технике используется, когда какой-то процесс опрашивает в цикле состояние регистра, и если оно поменялось, то начинает качать данные, например.
> он не может сам посылать запрос пользователю
Да. Но я-то надеялся на обратное... Казалось бы, что проще! Сервер "запоминает" некое состояние (IP) и пытается туда достучаться.
А вот в целях леквидации безграмотности... Как сделать так, чтобы скрипт PHP менял не все на экране, или даже ничего? (Например, выводить его результат во фрейм) Можно ли поменять уже имеющиеся в памяти браузера переменные с помощью очередного запроса на ПХП, или запрос - это всегда перезапись?
Пример:
<script ... >
А=1;
</script>
...
<a href="NNN.php">ЖМИ!!!</a>
B результате А станет равной 2. Или это самое А всегда надо передать на вход? | |
|
|
|
|
|
|
|
для: O-Planet
(13.03.2007 в 14:18)
| | > Как сделать так, чтобы скрипт PHP менял не все на экране, или даже ничего? (Например, выводить его результат во фрейм) Можно ли поменять уже имеющиеся в памяти браузера переменные с помощью очередного запроса на ПХП, или запрос - это всегда перезапись?
Ну, вообще можно и так извернуться. Например, сделать невидимый фрейм, в который по клику на "ЖМИ!!!" будет загружаться результат работы РНР-скрипта, представляющий собой уже JS-скрипт, меняющий значение А в основном фрейме. Но это, так сказать. топорно и, в общем, устарело.
Если вы хорошо знакомы с JS, то посмотрите в сторону технологии AJAX - она больше всего похожа на то, что вы описываете - отсутствие перезагрузок, незаметная для пользователя обработка данных, хорошие возможности для эмуляции неперывного диалога. Без РНР (или другого серверного языка), конечно, все равно не обойдется, но его роль сведется только к обработке данных, причем в чисто "служебном" XML-формате. | |
|
|
|
|
|
|
|
для: Киналь
(13.03.2007 в 14:46)
| | Почитал. Интересная технология. Ключевым, я так понимаю, в AJAX является: "отправляет запрос и получает ответ с сервера скрипт на стороне клиента, а вместо обновления всей страницы - обновляется только ее часть". В принципе, я таким образом и делаю свои сайты, только не использовал до сих пор XMLHTTPRequest. :) Я делаю просто: создаваю невидимый фрейм, туда помещаю все скрипты и нужные мне переменные, а страницу вывожу и обновляю в видимом фрейме функциями из невидимого. Но главное: по нажатиям кнопок я выполняю не прямые ссылки, а опять же, управляющие функции из невидимосй части, повешенные на onclick. И моя невидимая часть старницы, фактически, организовывала работу и с сервером, и с пользователем, и позволяет хранить глобальные для всех страниц переменные без кукисов и сессий. Пример: http://www.belkamag.ru
Попробую разобраться с AJAX | |
|
|
|
|
|
|
|
для: Киналь
(13.03.2007 в 11:57)
| | Тут сессия - с какого боку? | |
|
|
|
|