Недавно PHPChina запустил специальную тему, посвященную технологии чатов PHP. Я недавно работаю над этим проектом, поэтому хотел бы выразить здесь свое личное мнение.
Основные функции чата:
1. Зарегистрируйтесь, войдите, выйдите из системы, измените информацию.
2. Пользователь подает заявку на создание комнаты чата и настраивает атрибуты комнаты чата.
3. Отображение названия чата, описания, модератора, объявлений и рекламных объявлений.
4. Отображение списка онлайн-пользователей в режиме реального времени, и вы можете просматривать информацию о онлайн-пользователях (псевдоним, адрес электронной почты, IP-адрес, время онлайн и т. д.).
5. Публикуйте контент чата, атрибуты шрифта, действия, выражения и общие фразы.
6. Позволяет невидимость, приватный чат, прокрутку, блокировку пользователей, очистку экрана, выбор сцены чата, фоновую музыку и настройку метода отправки.
7. Администраторы имеют право управлять участниками (выгонять их, запрещать им выступать, передавать права управления).
Что следует отметить:
1. Запрещено использовать фреймовую структуру (iframe не приносит никакой пользы, кроме снижения вашей рабочей нагрузки)
2. Интерфейсный и фоновый код полностью разделены, данные передаются только через канал ajax, и должны передаваться только необходимые данные. (Отображать данные на переднем плане и обрабатывать данные в фоновом режиме)
3. Запрещено обновлять всю страницу, вызванное программой, и обновлять только тот контент, который необходимо изменить (запрещено использовать заголовок и мета для обновления страницы).
4. При отправке контента чата вы не можете слепо гоняться за скоростью взаимодействия с пользователем и игнорировать фактический порядок отправки записей чата. (То есть отправленные записи чата должны быть реорганизованы в фактическом порядке на сервере, а затем переданы клиенту, поскольку многие люди могут отправлять информацию одновременно)
Используемые технологии:
1. Мост между фронтом и бэкендом — AJAX. Вы можете выбрать jquery, XAJAX. Я предпочитаю jquery, который быстрый, простой и надежный, имеет множество плагинов и быстро обновляется.
2. Форма носителя информации – XML. На самом деле общие данные чата не очень сложны, и json достаточно.
3. Уровень абстракции базы данных — ADODB. Быстрее использовать PDO. Я уже привык использовать ADODB.
4. Базовый носитель данных – MySQL. В этом нет никаких сомнений.
5. Промежуточный носитель данных – Memcache. Храните данные высокоскоростного чтения и записи в общей памяти memcache, чтобы снизить нагрузку на базу данных.
6. Если вы хотите реализовать видео и голос, вам нужна поддержка сервера FMS (flash media server), а клиенту необходимо установить flash player. И это предполагает взаимодействие данных между HTML, Javascript, Flash и фоном. Информации по этому поводу не так много.
Это основные технологии. В реальной разработке приложений все еще остается множество детальных проблем, которые необходимо решить.
Например: как обрабатывать обновления онлайн-списков?
Есть два способа:
1. Обновить весь список (есть обновления или нет).
2. Добавляйте новых онлайн-участников, удаляйте автономных участников и меняйте участников, информация которых изменилась.
Очевидно, что второй вариант является лучшим.
Как справиться с проблемами параллелизма XmlHttpRequest?
JavaScript является однопоточным. Если одновременно существуют два объекта XmlHttpRequest, могут легко возникнуть проблемы, что требует от нас контроля над генерацией и завершением XmlHttpRequest.
В чате данные, которые нам необходимо обновить, в основном включают в себя: онлайн-список (включая обновления информации об участниках), записи чата, атрибуты чата и т. д. Частота этих обновлений непостоянна (если время одинаковое, вам нужно всего лишь создать XmlHttpRequest для его обработки). Обновление истории чата занимает меньше времени, а обновление онлайн-списков может занять немного больше времени. Если без использования платформы вы создаете объекты XmlHttpRequest отдельно, могут возникнуть проблемы с параллелизмом. Для этого необходимо создать функцию контроля времени и процессов.
setInterval('process_control()',3000) //Вызывается раз в три секунды
Функцияprocess_control реализует планирование задач, например, выполнение задач через определенный интервал и выполнение следующей задачи только после ее завершения.