Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Интерактивность на PHP
 
 автор: O-Planet   (12.03.2007 в 17:35)   письмо автору
 
 

Подскажите новичку, пожалуйста, по какому принципу организуется двухсторонний диалог с посетителем сайта на PHP?

1. Пользователь вошел на сайт
2. Пользователь что-то нажал
3. Сервер выполнил какие-то вычисления
4. Сервер самостоятельно перерисовал сайт пользователя

По 2: можно ли сделать, чтобы по нажатии кнопки скрипт PHP не перерисовывал содержимое экрана, а просто выполнял что-то на сервере (записывал в БД, изменял лок. переменную)? На js я это делаю так: <a href="" onclick="my_func();">Нажмите на эту кнопку</a>

По 4: Хотелось бы смоделировать ситуацию, когда перерисовка не явилась непосредственной реакцей на переход по ссылке с сайта. Но чтобы PHP "помнил" всех своих посетителей и у каждого в какой-то момент мог перерисовать сайт на локальном компе после каких-то своих вычислений, или просто по таймеру. То есть:
- Как помнить все лок. открытия сайта?
- Как обратиться к такому лок. открытию в любой момент, чтобы перерисовать?
- А можно без перерисовки просто что-то поменять, например, лок. переменную?

Спасибо заранее...

   
 
 автор: ddhvvn   (12.03.2007 в 17:44)   письмо автору
 
   для: O-Planet   (12.03.2007 в 17:35)
 

Пункт 2: см. использование AJAX
Пункт 4: не совсем понял, но думаю, возможно, тоже AJAX Вам поможет... :-)

   
 
 автор: Киналь   (12.03.2007 в 19:24)   письмо автору
 
   для: O-Planet   (12.03.2007 в 17:35)
 

Пункт 4, скорее всего, неосуществим (если я правильно его понял). Это общий закон: чтобы что-то произошло, пользователь должен совершить некие действия. Без ведома пользователя сделать ничего не получится. Ну, в крайнем случае, можно заменить пользователя JS-скриптом, но это ненадежно - JS может быть отключен.

   
 
 автор: O-Planet   (12.03.2007 в 23:29)   письмо автору
 
   для: Киналь   (12.03.2007 в 19:24)
 

> Пункт 4, скорее всего, неосуществим
Это точно? Действительно нет возможности что-то обновлять на открытом пользовательском сайте средствами ПХП, например, по IP, по какой-нить контекстной ссылке, с помощью сессий?..

Нет, я, конечно, знаю одно решение:

1. Пользователь жмет кнопку, сайт оставляет запись в БД "Input" о себе (UID) и действии пользователя.
2. Сервер в цикле отрабатывает все такие записи и генерирует ответы, оставляя новые записи в БД "Output"
3. Сайт в цикле опрашивает (js) базу БД "Output", ожидая появление ответа на свой запрос по UID, и когда таковой появляется - запускает скрипт перерисовки.

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

ВОПРОС: Можно ли на сервере "знать" о всех, кто сейчас работает на сайте, как-то их различать, посылать им отдельные сообщения?

   
 
 автор: Valick   (12.03.2007 в 23:46)   письмо автору
 
   для: O-Planet   (12.03.2007 в 23:29)
 

Можно ли на сервере "знать" о всех, кто сейчас работает на сайте, как-то их различать, посылать им отдельные сообщения?
Знать о тех кто сейчас на сайте? Для этого придумана регистрация
Различать и посылать сообщения... всё в ваших руках
Без кода, компьютер - это груда дорогостоящего железа, а сервер - это большая груда оченьдорогостоящего железа)))

   
 
 автор: Киналь   (12.03.2007 в 23:46)   письмо автору
 
   для: O-Planet   (12.03.2007 в 23:29)
 

>ВОПРОС: Можно ли на сервере "знать" о всех, кто сейчас работает на сайте, как-то их различать, посылать им отдельные сообщения?

Ответ: теоретически да, практически - с оговорками. И в виде бонуса - небольшой ликбез=)

Как вообще работает сайт на РНР? Пользователь посылает запрос, РНР его принимает и начинает работу. Работа заканчивается формированием HTML-кода, который и отдается пользователю. Как только HTML-код ушел, РНР забыл о пользователе, как будто его и не было никогда; пользователь перестал существовать для РНР. Чтобы при повторном обращении РНР "вспомнил" пользователя, применяют специальные приемы - сессии и cookie. Но в любом случае, работа РНР состоит из фаз запрос - ответ; никакого ожидания или отслеживания. Объясняется это тем, что протокол http - это протокол без сохранения состояния, он просто не приспособлен для такого.
С другой стороны, можно исхитриться и создать видимость такого "прямого контакта". Пример тому - чаты. Но и там все строится просто на регулярном обновлении страницы (или ее части). Всегда есть небольшая погрешность в определении того. на сайте человек или нет. Но все равно, написать Instant messenger на РНР вряд ли получится=) Он все же не для того.

   
 
 автор: O-Planet   (13.03.2007 в 01:50)   письмо автору
 
   для: Киналь   (12.03.2007 в 23:46)
 

Спасибо за лекбез. Впрочем, на ПХП я писал пару скриптов, и именно в таком ракурсе "вопрос-ответ" я его и воспринимал. Поэтому, особой необходимости в ПХП до сих пор не было. С помощью js, как правило, удавалось решить все, вплоть до корзины покупок на разных страницах сайта, не поддерживающего ПХП в принципе. Но сейчас передо мной задача - организовать совместную работу многих пользователей на моем сайте. (Хороший пример - чат) И не только работу, но некоторую циклическую обработку того, что они вводят. Отсюда - 2 проблемы:

1. Помнить состояние пользователя на сервере и влиять на него
2. Обрабатывать спонтанные запросы от разных пользователей в цикле.

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

Поэтому, спрошу, пожалуй, только еще одно: а есть ли альтернатива ПХП, mysql, внешнему приложению, предоставляющая возможность так организовать сервер, чтобы поддерживались некие каналы связи "сервер - активный пользователь"?

   
 
 автор: Киналь   (13.03.2007 в 11:57)   письмо автору
 
   для: O-Planet   (13.03.2007 в 01:50)
 

>Поэтому, спрошу, пожалуй, только еще одно: а есть ли альтернатива ПХП, mysql, внешнему приложению, предоставляющая возможность так организовать сервер, чтобы поддерживались некие каналы связи "сервер - активный пользователь"?

Тут боюсь ошибиться, но скорее всего, чтобы "держать руку на пульсе", вам придется изобретать собственный протокол на основе TCP/IP=) Http, насколько я знаю, не позволяет держать постоянный канал связи. Это можно обойти, в зависимости от задачи. Например, в тех же чатах проблема решается периодическими (раз в несколько секунд) запросами от браузера к серверу. Но, опять, все зависит от задачи. Он-лайн игру-шутер так не сделать - информация пользователя всегда будет отставать от информации сервера на две-три секунды.

>2. Обрабатывать спонтанные запросы от разных пользователей в цикле.
Так это другое дело) Запрос от пользователя сервер может обработать в любой момент; он не может сам посылать запрос пользователю, а наоборот - сколько угодно. При желании можно и бесконечный цикл организовать, другой вопрос, нужно ли. Проще так: пользователь, когда ему захотелось, сделал некий запрос (допустим, на изменение некоторого числа). Запрос пришел на сервер к обработчику; обработчик принял и записал число в базу; Остальные пользователи опрашивают сервер каждые пять (допустим) секунд, и каждый раз он им выдает им число из базы. Таким образом, максимум через пять секунд после изменения числа первым пользователем остальные увидят это изменение.

Может, я просто не очень понимаю, чето вам нужно, так что прошу прощения, если чересчур многословно объясняю и так вам известное)

   
 
 автор: O-Planet   (13.03.2007 в 14:18)   письмо автору
 
   для: Киналь   (13.03.2007 в 11:57)
 

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

> он не может сам посылать запрос пользователю
Да. Но я-то надеялся на обратное... Казалось бы, что проще! Сервер "запоминает" некое состояние (IP) и пытается туда достучаться.

А вот в целях леквидации безграмотности... Как сделать так, чтобы скрипт PHP менял не все на экране, или даже ничего? (Например, выводить его результат во фрейм) Можно ли поменять уже имеющиеся в памяти браузера переменные с помощью очередного запроса на ПХП, или запрос - это всегда перезапись?

Пример:

<script ... >
А=1;
</script>

...

<a href="NNN.php">ЖМИ!!!</a>

B результате А станет равной 2. Или это самое А всегда надо передать на вход?

   
 
 автор: Киналь   (13.03.2007 в 14:46)   письмо автору
 
   для: O-Planet   (13.03.2007 в 14:18)
 

> Как сделать так, чтобы скрипт PHP менял не все на экране, или даже ничего? (Например, выводить его результат во фрейм) Можно ли поменять уже имеющиеся в памяти браузера переменные с помощью очередного запроса на ПХП, или запрос - это всегда перезапись?

Ну, вообще можно и так извернуться. Например, сделать невидимый фрейм, в который по клику на "ЖМИ!!!" будет загружаться результат работы РНР-скрипта, представляющий собой уже JS-скрипт, меняющий значение А в основном фрейме. Но это, так сказать. топорно и, в общем, устарело.
Если вы хорошо знакомы с JS, то посмотрите в сторону технологии AJAX - она больше всего похожа на то, что вы описываете - отсутствие перезагрузок, незаметная для пользователя обработка данных, хорошие возможности для эмуляции неперывного диалога. Без РНР (или другого серверного языка), конечно, все равно не обойдется, но его роль сведется только к обработке данных, причем в чисто "служебном" XML-формате.

   
 
 автор: O-Planet   (13.03.2007 в 21:29)   письмо автору
 
   для: Киналь   (13.03.2007 в 14:46)
 

Почитал. Интересная технология. Ключевым, я так понимаю, в AJAX является: "отправляет запрос и получает ответ с сервера скрипт на стороне клиента, а вместо обновления всей страницы - обновляется только ее часть". В принципе, я таким образом и делаю свои сайты, только не использовал до сих пор XMLHTTPRequest. :) Я делаю просто: создаваю невидимый фрейм, туда помещаю все скрипты и нужные мне переменные, а страницу вывожу и обновляю в видимом фрейме функциями из невидимого. Но главное: по нажатиям кнопок я выполняю не прямые ссылки, а опять же, управляющие функции из невидимосй части, повешенные на onclick. И моя невидимая часть старницы, фактически, организовывала работу и с сервером, и с пользователем, и позволяет хранить глобальные для всех страниц переменные без кукисов и сессий. Пример: http://www.belkamag.ru

Попробую разобраться с AJAX

   
 
 автор: O-Planet   (13.03.2007 в 14:28)   письмо автору
 
   для: Киналь   (13.03.2007 в 11:57)
 

Тут сессия - с какого боку?

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования