Постоянная загрузка в чате PHP


Оглавление (нажмите, чтобы открыть):

Постоянная загрузка в чате PHP

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

Что делать, если у меня медленый канал, что бы общатся в чате?
Увы, но мы не можем увеличить пропускную способность вашего канала, так как это зависит не от нас, но мы можем уменьшить объем передаваемых данных для чата,что бы данные успевали передаться в полном объеме. Для этого нужно перейти в сокращенную версю чата, нажав на эту кнопку https://autozvuk.org/forum2/images/misc/mgc_cb_evo/mgc_cb_evo_full.gif, и тогда объем передаваемых данных для чата сократиться в 10 раз. Если через 1-2минуты загрузка чата не произошла, произведите обновление чата, нажав эту кнопку https://autozvuk.org/forum2/images/misc/mgc_cb_evo/mgc_cb_evo_refresh.gif или F5. Процедуру можно повторить несколько раз пока чат не запустится.

Можно ли в чате править свои сообщения, после того как они уже отправлены?
Да, можно редактировать свои сообщения в чате после того, как они были уже отправлены. Для этого достаточно два раза щелкнуть мышкой в окне чата по своему сообщению, после чего оно будет переведено в режим редактрования. По окончанию редактирования, нажмите кнопку ENTER.

Можно ли в чате править чужие сообщения?
Нет, нельзя. Чужие сообщения в чате могут править или удалять только администраторы и супермодераторы.

Простой чат на PHP

Здравствуйте, уважаемые читатели блога LifeExample, в этой статье я хотел бы привести пример скрипта реализующего простой чат на php. Это простой скрипт чата сделан на основе PHP и JavaScript, с использованием OOP и AJAX.

Для работы с этим скриптом чата на php не нужна база данных.

Скрипт работает с текстовыми файлами, сохраненными на сервере, поэтому очень быстрый и не занимает много ресурсов сервера. Пользователь может добавить в чат смайлы и применять форматирование шрифтов текстовых сообщений: «жирный», «курсив», «подчеркивание». Имеется поддержка смайлов.

В чате имеется поддержка никнеймов, разделение по комнатам, настройки ВКЛ/ВЫКЛ для звукового сигнала сохраняются в cookies (на один день). Поэтому, при следующем визите их можно прочитать и воспользоваться с помощью файлов cookie. Скрипт был успешно протестирован на Mozilla Firefox, Internet Explorer, Google Chrome и Opera.

Минимальные требования для нашего чата на PHP следующие:

  • PHP 5+
  • Браузер с подключенным JavaScript (желательно с поддержкой для CSS3).

Как установить чат на PHP

После распаковки архива script_chat_simple.zip , скопируйте на сервер файл chat.php , папки: chatfiles, chattxt и chatex (со всеми файлами, в ту же самую директорию, в которой у вас находится файл, куда вы хотите включить чат). Файл test.php для теста.

Установите разрешения на чтение — запись — распаковку на директорию chattxt, CHMOD 0777 (или 0755). В этой директории PHP сохранит TXT файлы с чатом для каждой комнаты чата.

Добавьте следующий код в PHP файл, в который вы хотите включить этот скрипт чата:

Для надлежащей работы HTML страницы, возьмите эту строку кода (для CSS свойств) сначала файла chat.php:

Затем перенесите его в основной раздел страницы, куда вы вставили скрипт.

Этот скрипт также можно вставить в «.html» файлы, с помощью тегов или (но на сервере должен запускаться PHP). Поэтому для того чтобы добавить скрипт чата в «.html» файл (блог, форум), используйте один из следующих кодов:

dir/chat.php — путь к директории или файлу, где находится ваш скрипт. Если в той же папке, напишите только «chat.php».

Админские настройки

В файле setchat.php (в chatfiles/ директория) вы можете изменить настройки чата на php по умолчанию.

По умолчанию скрипт сохраняет и показывает последние 30 строк чата. Вы можете изменить этот номер в строке кода:

С помощью этого скрипта пользователи могут добавлять ссылки в чат (с атрибутом rel=»nofollow»), но, если вы хотите удалить эту опцию, замените 1 на 0 в строке кода:

В следующей строке кода вы можете установить пароль, который вы будете использовать для очистки истории чата (замените «adminpass» на желаемый вами пароль):

Для очистки истории чата обратитесь через браузерер в файл chatfiles/setchat.php с ?mod=admin в URL-ле. Например:

Затем выберите историю чата на php, которую вы хотите удалить и введите пароль установленный в директиве CADMPASS.

Если у вас на сайте установлен скрипт регистрации и авторизации и вы хотите чтобы функция чата была доступна только зарегистрированным пользователям, установите константу CHATADD в значение 0. Затем установите $_SESSION[‘username’] в сессию используемую вашим скриптом для удержания авторизированных пользователей на следующий код в «setchat.php».

В этом случае вам необходимо добавить session_start(); в начало PHP файла, по примеру файла «test.php».

Смена звуков для чата на PHP


В директории «chatex/» представлены два дополнительных WAV файла: beep2.wav и beep3.wav. По умолчанию в скрипте используется beep1.wav. Если вы хотите изменить звуковой файл, который проигрывается при добавлении нового текстового сообщения в чате, измените в файле chatfunctions.js (строка 13) значение переменной:

Первоначально в скрипте «Чат на PHP» содержится две чат комнаты: на английском языке и языке по умолчанию. Если вам нужна только одна чат комната удалите строку кода, которая содержит переменную $chatrooms[] после названия чат комнаты. Для изменения названия комнаты измените число соответствующих переменных.

Если вам нужно больше чат комнат добавьте переменные $chatrooms[] со следующим синтаксисом:

В этом скрипте, реализующим чат на PHP, предусмотрена функция автоматического создания текстовых файлов для каждой чат комнаты, но обязательно должно быть установлено разрешение на запись (CHMOD 0777, или 0755) в директории chattxt. Скрипт можно легко изменить для использования на других языках. Достаточно перевести текст в файле texts.php (в папке chatfiles/). Если вы хотите изменить цвет и дизайн чата, отредактируйте CSS свойства в chatstyle.css ( или chatstyle_mini.css, в мини версии), в папке chatfiles/. Файл chatstyle_mini.css может быть использован в целях экономии трафика пользователей чата.

На этом я завершаю обзор скрипта чата, надеюсь данная статья поможет вам создать чат на PHP. Приятной работы!

Современный чат на php с мгновенным получением сообщений

Решил я создать чат.
Пользователь жмёт кнопку «Создать», получает уникально сгенерированную ссылку
Даёт её кому угодно, все кто переходит по этой ссылке попадают в чат.
Настройки чата (всякие пароли на вход в конкретный чат и прочее) доступны только создателю «комнаты»
Все сообщения шифруются таким образом что не зная ключа — сообщения невозможно расшифровать.
Читая трафик — нельзя понять какого вида активность ведёт пользователь/о чём общается

Зная пароль — чат может удалить любой.
Удаляя чат удаляются все сообщения/прикрепления чата и никаких логов IP не ведётся.

Это мне кажется довольно удобным средством общения если необходима в некоторой степени защита информации.
PHP уже во многом готов. Но возникли огромные проблемы в части визуализации.
Кроме своей относительной функциональности чат должен быть удобным для пользователя.

На данный момент всё ультра примитивно.
После отправления сообщения страница попросту обновляется.

Разумеется я решил что пора уже прикрутить интерактивность.
Что бы диалог походил на привычный уже наверное всем ВК.
То есть отправил сообщение один пользователь, получили все читатели конкретного чата. Моментально.
Решил спросить у интернетов, что там и как. Я просто ох**л от того что творится в гуглах.

Я тут новичёк, но я жуткий хардкорщик (наверняка это связано). Сторонние библиотеки я не переношу априори!
Ну не то что бы я консерватор, но в проектах «для себя», я хочу понимать суть каждого символа в коде.
Таким образом я лучше запоминаю информацию и достаточно быстро отлаживаю возникшие проблемы.

Если речь идёт о каком нибудь jQuery скажем или о Bootstrap, то я в принципе и не против, несмотря на то что последнее призираю всячески.

Но когда я спрашиваю поисковик о том как бы мне оживить чат, а получаю ответы вроде «Ну переходишь на node.js» / «Демона пишешь для начала» / «Подключаешь вот эту нонэйм библиотеку» / «Подключаешь вот ту небольшую библиотеку с тысячей миллионов строк» я достаю свой огнетушитель и тушу своё кресло.

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

Какое то решение, прибегнув к которому я смогу мгновенно читать сообщения отправленные другими пользователями. Но без того что бы каждые n секунд обновлять что то.

Сейчас мне очень нравится идея с сокетами. Вроде бы это неплохо.
Но то что я вЫчитал просто удар кувалдой по голове! Насколько я понял, для сокетов необходимы «демоны».

Что мне можешь посоветовать ТЫ?

Важно: Постарайтесь аргументировать свой ответ.
AJAX с обновлением в n секунд? — Хорошо, почему?
Сокеты? — Прекрасно! Почему именно они?
Да даже та же node.js, обоснуйте своё мнение. Почему именно это должно мне помочь?

Сразу скажу, контрольные тесты провожу на обычном хостинге от джино. Никаких VPS, типикал хост.

Если вы считаете что я не прав насчёт сторонних библиотек и вообще я пищерный человек, вы конечно можете конструктивно покритиковать меня, но пишите это оффтопом. Подобные диалоги прошу вести в ЛС.

Заранее благодарен тем, кто придёт мне на помощь.

Добавлено через 8 минут
P.s. Очень важно — Чат хранит всю историю сообщений в БД! Варианты с «Отправил, получил, перезагрузил — пусто» отпадают сразу же.
Это я к тому что во всех примерах всё именно так. Просто знайте, сообщения хранятся в БД! А значит скорее всего и вытаскиваем их оттуда же.
Но варианты с «Отправил сообщение, добавилось в БД, отобразилось у всех не из базы» допустимы.
Просто учитывайте в своих ответах что данные должны храниться НЕ локально.

Добавлено через 1 час 39 минут
Бамп

petukhovsky.com

Не совсем ожидаемо для меня, хотя и совершенно закономерно, в моём блоге самой популярной стала тема, которой я посвятил больше всего времени — работа с веб-сокетами (предыдущая статья про чат). Сегодня я опубликую новый усовершенствованный инструмент управления веб-сокетами Downloads, ws server admin panel v.0.3., который будет полностью управляем через веб панель как под Windows, так и под *nix. Расскажу о том, с какими я столкнулся проблемами, как их лечил и предоставлю несколько полезных рецептов посвященных работе с веб-сокетами на PHP.

Мастер Йода рекомендует:  Провайдерам не грозит ответственность за размещение пиратского контента

Небольшой обзор проделанной работы

Я веду небольшой (около 3х тысяч строк) игровой проект Growing Crystals(последняя AJAX-версия до перехода на ws) о нём есть много материалов в моём блоге. Изначально весь обмен данными клиент-сервер был выстроен на технологии AJAX. Однако, по советам друзей, я обратил внимание на технологию веб-сокет что и привело к написанию первой статьи о работе с веб-сокетами на PHP. Затем пришлось решать задачи запуска веб-сокет демона, и закончилось эта история разработкой простых приложений: панели управления веб-сокет сервера и чата на веб-сокете. После получения панели управления и реального работающего чата, я вернулся к разработке проекта Growing Crystals, ради которого изначально и затевалось знакомство с веб-сокетами. Это было огромным удовольствием осознавать на сколько правильно поступил выбрав в качестве транспорта для своего игрового приложения веб-сокет, технология оказалась очень удобна и органична с точки зрения встраивания в проект. В то же время, с момента выхода статьи с чатом, прошло уже более месяца и благодаря вашим комментариям я почувствовал необходимость поделиться опытом разработки гораздо более сложного приложения чем чат, и заодно предоставить вашему вниманию обновленный и более удобный инструмент Downloads, ws server admin panel v.0.3., а также инструкцию по его разворачиванию.

Прежде чем двинуться дальше напомню, что ws это веб-сокет, а pid-файл, это файл содержащий id процесса ws в системе, он создаётся и хранится только для того, чтобы можно было проверить запущен ли ws и если запущен то работает ли он в настоящее время.

ws сервер + панель управления v.0.3.

Прежде чем начать работу с ws, рекомендую скачать вам архив Downloads, ws server admin panel v.0.3., и установить его хотя бы в Денвере, поскольку все дальнейшие приёмы и способы будут разобраны на базе данной системы.

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

Инструкция по разворачиванию системы ws server admin panel v.0.3.


Система пригодна для разворачивая как в корневом каталоге домена так и в каталоге любой степени вложенности, единственное что изменяется, так это пути в конфигах.

Использование в Девере на localhost

Рассмотрю пример конфигурационных файлов для использования на localhost (они уже прописаны в архиве и пригодны для запуска на localhost).

  1. Распаковываем содержимое архива в каталог Денвера w:\home\localhost\www\
  2. Открываем в редакторе файл w:\home\localhost\www\chat\ws\wsadmin.js. Единственное, что нужно в него прописать это адреса скрипта панели управления, лог-файла и файла ошибок. Для localhost они выглядят следующим образом.

Такие же нехитрые манипуляции проделываются и с файлами w:\home\localhost\www\chat\chat.js, w:\home\localhost\www\chat\echoclient.js.

  • Открываем в редакторе файл w:\home\localhost\www\chat\ws\wsadmin.php, и задаём логин-пароль для администратора ws-сервера.
  • Открываем в редакторе файл w:\home\localhost\www\chat\cfg\ws.cfg.php, содержащий все основные настройки ws-сервера, по умолчанию менять в нём ничего не требуется, но вы можете обратить внимание что в нём указаны основные параметры работы ws-сервера, адрес, порт, максимальное количество подключений с одного IP-адреса и др.
  • Для того, чтобы убедиться в правильных настройках, заходим по адресу https://localhost/chat/ws/admin.php панели управления. Если авторизация прошла успешно и вы попали в меню управления ws, то теперь вам следует попробовать запустить и остановить ws-сервер нажав поочередно клавиши start и спустя 8-10 секунд stop.
  • Что нового в ws server admin panel v.0.3.

    Работая над проектом приходится часто перезагружать ws и если процесс завершил работу не корректно то pid-файл остаётся, хотя самого процесса нет. В старой версии программы приходилось вручную осуществлять удаление pid-файла, сейчас если система обнаружила что процесса нет и в панели администратора показалось сообщение красного цвета, то теперь достаточно нажать клавишу start и система принудительно в течение нескольких секунд запустится создав новый pid-файл без дополнительных манипуляций.

    Также реализовано получение данных о процессе ws под ОС Windows, пока удалось протестировать только под Windows 7, но, если окажется что не работает под Windows 8, дайте об этом знать и я выпущу обновление. Получение данных о процессе под ОС Windows было необходимо чтобы экономить время разработчика на перезапуск процесса в время отладки.

    Исправлена проблема запуска php скриптов из Денвера. Долго не мог разобраться в чём проблема при работе под ОС Windows, оказалось что правильный путь php в Денвере выглядит следующим образом w:\usr\bin\php5.exe. Если использовать другой путь w:\usr\local\php5\php.exe то запуск будет происходить далеко не каждый раз. Однако теперь в процессах появляется не php.exe а сразу несколько процессов php5.exe и php-cgi.exe.

    Единственное что я не реализовывал, это проверку занятости портов, и проверку на наличие запущенных процессов при отсутствии pid-файла, поскольку для разработки подразумевается что вы знаете какой порт использовать и не будете удалять pid-файл уже запущенного процесса. Но если вы случайно удалили pid-файл запущенного процесса, то просто перезагрузите веб-сервер целиком. Реализацию принудительно выключения процесса у которого нет pid-файла я пока не рассматриваю.

    Отладка приложений на веб-сокетах на PHP

    Первое на что нужно обратить внимание, это на то, что ошибки разрабатываемого кода могут быть нескольких видов, но самые распространённые с которыми может столкнуться разработчик:

    • ошибка интерпретации PHP кода (E_PARSE) при ней выдаётся сообщение о невозможности запуска PHP кода указывая на строку и тип возникшей ошибки в исходном коде;
    • ошибка которая может возникнуть во время выполнения программы (E_ERROR), как правило выдаётся ошибка PHP Fatal error с описанием того, что конкретно привело к этой ошибке.

    Всё просто когда вы работаете на прямую с веб-страницей на PHP, ведь для этого вам достаточно воспользоваться директивами error_reporting и display_errors, но как понять какая ошибка произошла когда вы работаете с демоном использующим веб-сокет и который не запускается при нажатии на кнопку start из панели управления ws server admin panel v.0.3.?

    Скорее всего ошибка E_PARSE. В таком случае я использую запуск PHP-скрипта через браузер, на примере данного архива запускаю чат по адресу https://localhost/chat/init.php. Если в скрипте имеется проблема интерпретации PHP кода, она сразу становится видна. Если же скрипт запустился, то это хорошо, можно убедиться в этом в панели управления https://localhost/chat/ws/admin.php.

    Далее, если в результате работы скрипт упал, вы увидите красную надпись в панели управления. Причину ошибки можно будет посмотреть там же в окне лога ошибок сервера echo ws server errorfile. Вы увидите в конце строку PHP Fatal error с описанием того, что случилось. Чаще всего это может быть обращение к несуществующему элементу массива, обращение к заприваченному свойству объекта или вызов неизвестной функции. Таким образом дописывая исходный код вашей программы, вы сможете проверять его не только на этапе интерпретации но и в процессе выполнения. Если не удаётся разобраться с проблемой во время выполнения программы (E_ERROR). Например, в логиге ошибок (echo ws server errorfile) указано что идёт обращение не по адресу или происходит попытка вызвать неизвестную функцию, в таком случае я предлагаю использовать функции логирования consolemsg и функцию представления содержимого переменной test_var_value в теле программы, чтобы посмотреть как ведёт себя программа во время выполнения и почему она приходит к таким результатам.

    Чат на веб-сокетах

    Взглянув один раз на код опубликованного в прошлой статье веб-чата я решил улучшить его снабдив новым интересным функционалом, заодно разобрав подробности реализации.

    Автоматический запуск

    Для чата автоматический запуск может быть необходим просто для того, чтобы администратору не нужно было постоянно следить за тем, поднялся ws после перезагрузки Apache или нет. Т.к. скрипт ws-сервер чата простой, то достаточно реализовать при запуске чат клиента обращение по AJAX к скрипту сервера который всегда инициирует проверку состояния и осуществляет запуск если ws-сервер чата не запущен. Но это применимо только для простых приложений типа чата. В случае с моим игровым проектом, я не использую автозапуск, т.к. там процесс запуска сложен сам по себе и может занимать до 40 секунд времени, поскольку игровые карты загружаются в память. Также к игровому проекту совершенно другой подход, при котором состояние игры должно мониториться более тщательно администратором и в случае проблем отправляться e-mail уведомление.

    Как реализовать автозапуск ws-сервера? Реализуется простая функция на javascript на стороне клиента wsserverrun(), которая каждый раз при загрузке клиента делает AJAX-запрос к серверному скрипту wsstart.php отвечающему за запуск ws, который запускает ws в случае, если он отключен.

    Скрипт wsstart.php очень простой, рекомендую ознакомиться с ним самостоятельно.

    Хранение логов

    В комментариях под прошлой статьёй был вопрос о том, как организовать логирование чата в БД. Реализация этого очень проста, единственное, что вместо запроса INSERT в БД я сохраняю данные в лог-файл. Для этого я написал простую функцию chatlogmsg($msg), которая сохраняет всё в отдельный файл chatlog.html.

    и добавил её во все необходимые места кода. На всякий случай в лог-файл я решил записывать еще и ip-адреса и порты клиентов.

    В итоге лог файл выглядит следующим образом


    [2014.08.04-00:29:46](127.0.0.1:50183) Мистер Слива вошел в чат
    [2014.08.04-00:30:01](127.0.0.1:50142)[00:30] Мистер Огурец: Всем привет и пока
    [2014.08.04-00:30:20](127.0.0.1:50183) Мистер Слива покинул чат

    Подсчёт количества пользователей он-лайн

    Тоже очень простая задача, для этого в классе websocketserver_class заводим приватную переменную $online, задаём значение 0 в конструкторе.

    При подключении пользователя

    при отключении соответственно

    Единственное, что теперь необходимо сообщать количество он-лайн пользователей всем подключенным клиентам, что я и делаю, передавая каждый раз всем сообщение, когда значение $this->online изменяется

    На стороне клиента я делаю проверку на наличие маркера и записываю значение после двоеточия в соответствующее поле на html странице клиента.

    Немного о разработке большого приложения

    Постараюсь в несколько слов рассказать о своём опыте. Ранее у меня уже было приложение которое работало на AJAX. Переход оказалось осуществить достаточно просто. В классе websocketserver_class я завёл экземпляр главного класса игрового проекта game_class. В game_class я заменил получение данных из переменных $_GET на получение данных из переменных передаваемых в него из websocketserver_class в качестве аргументов. Также websocketserver_class передавал еще и id игрока с которым произошло событие, поскольку процесс всегда загружен в памяти и для него не могло существовать сессий игроков. С помощью полученного id game_class опознавал игрока, восстанавливал данные игрока в класс player_class, производил над ним определенные манипуляции в итоге сохраняя данные из player_class в БД или файл или память. Таким образом переход с AJAX на ws оказался действительно очень прост. Вот, кстати, как стала выглядеть диаграмма классов после перехода на ws.

    Что касается клиентского приложения то переход также оказался весьма прост: вместо XMLHttpRequest() для отправки данных стала использоваться socket.send(); и socket.onmessage для получения соответственно. Вместо GET-запросов, стали отправляться данные по JSON, что фактически перевело всю коммуникацию клиент-сервер исключительно в формат JSON.

    Комментарии, как всегда, приветствуются.

    upd 2014.11.27: следующая статья, релиз анонимного чата.

    Как сделать автообновления чата ajax без тысячи запросов [дубликат]

    На данный вопрос уже ответили:

    Вообщем сделал я чат PHP + AJAX + MYSQL все работает отлично, но меня смущает одно дело. чтобы интерактивно не обновляя страницы проверить есть ли новое сообщение нужно отправить AJAX запрос, чтобы все было быстро я отправляю этот запрос с проверкой каждую секунду и вот что собственно меня смущает. В минуту отправляется 60 запросов, смотрел на других сайтах с чатом, там такого нет, и вот вопрос: я зря беспокоюсь? и как можно сделать альтернативно автообновление

    Отмечен как дубликат участниками Алексей Шиманский, Regent, aleksandr barakin, user194374, Bald 1 авг ’16 в 4:08 .

    Подобный вопрос задавали ранее и на него уже получен ответ. Если представленные ответы не являются исчерпывающими, пожалуйста, задайте новый вопрос.

    2 ответа 2

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

    Схема:

    1) Отправляется запрос на сервер.

    2) Соединение не закрывается сервером, пока не появится сообщение.

    3) Когда сообщение появилось – сервер отвечает на запрос, пересылая данные.

    4) Браузер тут же делает новый запрос. Ситуация, когда браузер отправил запрос и держит соединение с сервером, ожидая ответа, является стандартной и прерывается только доставкой сообщений.

    Схема коммуникации:

    При этом если соединение рвётся само, например, из-за ошибки в сети, то браузер тут же отсылает новый запрос.

    Примерный код клиентской части:

    Функция subscribe делает запрос, при ответе обрабатывает результат, и тут же запускает процесс по новой.

    Сервер, конечно же, должен уметь работать с большим количеством таких «ожидающих» соединений.

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

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

    1. Отправляется запрос на сервер.
    2. Соединение не закрывается сервером, пока не появится сообщение.
    3. Когда сообщение появилось – сервер отвечает на запрос, пересылая данные.
    4. Браузер тут же делает новый запрос.


    Это позволяет снизить нагрузку на сервер и ускорить появение свежих данных на клиенте путём небольших изменений на сервере.

    Host-Food.ru

    Форум хостинга Host-Food.ru

    • Темы без ответов
    • Активные темы
    • Поиск

    Некорректно работает чат на php

    • Отправить тему по email
    • Версия для печати

    Некорректно работает чат на php

    Сообщение Леон » 2020-02-08, 6:07:33

    Здравствуйте. Проблема такого характера:

    Создал чат на php на другом хостинге, с которого решил перейти сюда. На прошлом хостинге всё работало корректно, а здесь столкнулся сразу с несколькими проблемами:

    1)Перенаправление на стартовую страницу чата с формой для ввода имени и выбора цвета при случайном попадании незалогиненного пользователя на основную страницу чата не работает. Вместо перенаправления осуществляется вход в основное окно чата с последующей возможностью оставлять сообщения без имени. https://h93256.s05.test-hf.su/chat.php — это сам чат, https://h93256.s05.test-hf.su — это страница с формой ввода имени, минуя которую, по идее, в чат попасть нельзя. Это от версии php зависит, или от чего? Почему так по-разному работает?
    Выдаёт вот такое предупреждение:
    Warning: Cannot modify header information — headers already sent by (output started at /home/h93256/data/www/h93256.s05.test-hf.su/chat.php:81) in /home/h93256/data/www/h93256.s05.test-hf.su/chat.php on line 189

    2)Тоже проблема, с которой при использовании этого же чата на предыдущем хостинге не встречался: прямо в окне чата мне сообщается о переменных, которые не использовались во время отправки форм и не получили значения. Всего у меня пять переменных:
    $strSubject=$_POST[‘subject’];

    $strMycolor=$_POST[‘webcolors’]; — эти две используются единожды при переходе на страницу чата со страницы с именной формой.

    AJAX веб чат с использованием PHP, MySQL и jQuery (Часть 1 из 2-х)

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

    В данном уроке из двух частей мы создадим AJAX веб чат с использованием PHP, MySQL и jQuery. В первой части урока мы обсудим использование PHP и MySQL, а в следующей — клиентскую часть jQuery и CSS.

    Как обычно первый шаг посвящен разметке HTML. Наш документ строится в соответствии с HTML5, что позволяет использовать новый, более короткий синтаксис DOCTYPE, и опускать атрибут type в тегах script.

    index.html

    Для оптимизации загрузки, стили включены в секции head, а файлы JavaScript подключаются внизу документа, перед закрывающим тегом body.

    Для организации прокручиваемой области со строками чата мы используем плагин jScrollPane. Данный плагин имеет свои собственные стили, который включаются в секции head.

    Разметка чата состоит из четырех основных элементов div – верхней панели, контейнера чата, контейнера пользователей и нижней панели. Последний div содержит формы для регистрации пользователя и отправки сообщения. Форма отправки сообщения по умолчанию скрыта и выводится, только если пользователь успешно вошел в систему чата.

    Затем мы включаем файлы JavaScript: библиотеку jQuery, плагин mousewheel (используется в jScrollPane), плагин jScrollPane и наш файл script.js.

    Схема базы данных

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

    Для нашего скрипта мы используем две таблицы. В таблице webchat_users хранится информация об участниках чата. Таблица имеет поля id, name, gravatar и last_activity. Поле name определено как уникальное, таким образом предотвращается использование дублирующихся имен в чате.


    Другим полезным свойством поля с уникальным индексом является то, что запрос на вставку данных завершится с ошибкой и свойство inserted_rows объекта MySQLi будет установлено в значение 0, если попытаться вставить дублирующиеся строки. В классе PHP Chat данное свойство будет активно использоваться.

    Поле last_activity содержит значение времени. Значение обновляется каждые 15 секунд для каждого пользователя. Поле также определено как индекс, что позволяет быстро удалять неактивных пользователей (значение в поле last_activity более 15 означает, что пользователь более не просматривает окно чата).

    Таблица webchat_lines содержит записи в чате. Заметьте, что мы храним имя автора и gravatar здесь тоже. Такое дублирование позволяет нам отказаться от использования затратной директивы join при запросе последних записей – наиболее часто используемых в нашем приложении.

    Определения таблиц имеются в файле tables.sql в исходниках. Вы можете использовать текст запросов для создания таблиц. Также, при установке чата на свой хост, нужно поменять установки в ajax.php на ваши данные для соединения с базой MySQL.

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

    Первый файл, который мы рассмотрим, ajax.php. Он обрабатывает запросы AJAX от клиентской части из jQuery и выводит данные в формате JSON.

    ajax.php

    Для удобства используется оператор switch для определения действий, которые обрабатывает скрипт. Здесь реализованы подсистемы чата, функциональность входа/выхода и действия по запросу списка реплик и пользователей в режиме онлайн.

    Вывод осуществляется в форме сообщений JSON (которые удобно обрабатывать с помощью jQuery), ошибки генерируют исключения. Оператор switch распределяет все запросы соответствующим статическим методам класса Chat, который будет обсуждаться позже в данном разделе.

    Класс DB — менеджер базы данных. Конструктор объявлен как private, таким образом, объект не может быть создан вне пределов класса, и инициализация возможна только из статического метода init(). Он берет массив с параметрами соединения с MySQL и создает экземпляр класса, который содержится в статической переменной self::$instance. Таким образом, обеспечивается существование единственного соединения с базой данных в конкретный момент времени.

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

    ChatBase. >

    Это простой базовый класс. Его основное назначение — определить конструктор, который получает массив параметров, но сохраняет только те, которые определены в классе.

    ChatLine. >

    Класс ChatLine является производным классом от ChatBase. Объект данного класса может быть легко создан с помощью передачи конструктору массива с текстом, именем автора и элементом gravatar. Свойство класса gravatar содержит хэш md5 email адреса. Оно нужно для получения пользовательского аватара, соответствующего email адресу, с сайта gravatar.com.

    Данный класс также определяет метод save, который сохраняет объект в базе данных. Так как метод возвращает объект MySQLi, содержащийся в классе DB, вы можете проверить успешность завершения операции с помощью свойства affected_rows.

    ChatUser. >

    Класс имеет свойства name и gravatar (обратите внимание на модификатор доступа protected – свойства доступны в классе ChatBase, и мы можем устанавливать их значения в конструкторе).

    В классе определен метод update(), который обновляет поле last_activity значением текущего времени. Таким образом показывается, что пользователь держит окно с чатом отрытым и его надо учитывать как автора в режиме онлайн.

    Этот код выполняет всю работу. В операторе switch в файле ajax.php выбирались действия, которые соответствовали методам данного класса. Каждый из этих методов возвращает массив, который затем конвертируется в объект JSON с помощью функции json_encode() (это происходит внизу в файле ajax.php).

    Когда пользователь входит в систему, его имя и gravatar сохраняются как элементы массива $_SESSION и становятся доступны в последующих запросах.

    jQuery отправляет запросы getUsers() каждые 15 секунд. Мы используем данный факт, чтобы удалить реплики, которые старше 5 минут и неактивных пользователей из базы данных. Потенциально можно было бы удалять данные записи в getChats, но этот запрос поступает каждую секунду и дополнительная нагрузка может повлиять на производительность приложения.

    В методе getChats() используется функция gmdate вывода времени в формате GMT. В клиентской части мы используем значения часов и минут для установки в объекте JavaScript, а в результате время отображается в соответствии с часовым поясом пользователя.

    Продолжение во второй части!

    Данный урок подготовлен для вас командой сайта ruseller.com
    Источник урока: tutorialzine.com/2010/10/ajax-web-chat-php-mysql/
    Перевел: Сергей Фастунов
    Урок создан: 3 Ноября 2010
    Просмотров: 129695
    Правила перепечатки

    5 последних уроков рубрики «PHP»

    Фильтрация данных с помощью zend-filter

    Когда речь идёт о безопасности веб-сайта, то фраза «фильтруйте всё, экранируйте всё» всегда будет актуальна. Сегодня поговорим о фильтрации данных.

    Контекстное экранирование с помощью zend-escaper

    Обеспечение безопасности веб-сайта — это не только защита от SQL инъекций, но и протекция от межсайтового скриптинга (XSS), межсайтовой подделки запросов (CSRF) и от других видов атак. В частности, вам нужно очень осторожно подходить к формированию HTML, CSS и JavaScript кода.

    Подключение Zend модулей к Expressive

    Expressive 2 поддерживает возможность подключения других ZF компонент по специальной схеме. Не всем нравится данное решение. В этой статье мы расскажем как улучшили процесс подключение нескольких модулей.

    Совет: отправка информации в Google Analytics через API


    Предположим, что вам необходимо отправить какую-то информацию в Google Analytics из серверного скрипта. Как это сделать. Ответ в этой заметке.

    Подборка PHP песочниц

    Подборка из нескольких видов PHP песочниц. На некоторых вы в режиме online сможете потестить свой код, но есть так же решения, которые можно внедрить на свой сайт.

    Запуск VOC++ чата на «PHP 5.6» — без проблем! И что с PHP7.1?

    #1 2020-03-25 14:21:04

    Запуск VOC++ чата на «PHP 5.6» — без проблем! И что с PHP7.1?

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

    1. В файл inc_comon.php в самом верху добавить такие зелёные строки:

    //MIGRATION to PHP5.6
    ini_set(‘default_charset’,’cp1251′);
    mb_internal_encoding(«cp1251»);
    foreach($GLOBALS as $k=>$v) if($k[0]==»_») <
    if($k==»_FILES») $<"HTTP_POST$k">=$GLOBALS[$k]; else $<"HTTP$k"."_VARS">=$GLOBALS[$k];
    >

    2. В файле events.php найти 73 строку и меняем на новую, изменения синим:

    if(function_exists($eventHandlers[$i][«handler»])) $eventHandlers[$i][«handler»]($HParam, $LParam);

    3. Чат уже работает, но есть другие файлы с номерами строк где возможны ошибки, просто удаляем красные & :

    admin/clan_list.php:19: $url = fsockopen($address, 80, & $errno, & $errstr, 30);
    edit_clan.php:24: $url = fsockopen($address, 80, & $errno, & $errstr, 30);
    plugins/antiproxy/Client.php:632: $this->socket = fsockopen( $host, $port, & $this->reply, & $this->replyString, 5);
    powmod/friends/friends.php:690: array_push( & $approval_friend, $row_a[‘friend_name’] );
    powmod/friends/friends.php:691: array_push( & $approval_friend_id, $row_a[‘fid’] );

    SSH команда поиска лишних &, кроме папки форума, для экспертов:

    egrep -n -R ‘[( ]<1>&\$’ ./|grep -v Binary|grep -v ‘function ‘|grep -v ‘/forum/’

    4. Если присутствует нижеприведенная строка 341 в файле sender.php, то добавим пропущенный знак равно =, добавьте его так как в строке ниже:

    if (($type==»JPG») || ($type = =»JPEG»)) $open_file=imagecreatefromjpeg($file.$text);

    5. В файле admin_work.php и в файле adm_cmd.php находим все функции strcasecmp и заменяем на эту:

    strnatcasecmp

    6. У кого не работает вход в админку, нужно в файле admin/check_session.php изменить 2 верхние строки так:

    $_GET )) $$var = $val;
    while (list($var, $val) = each( $_POST )) $$var = $val;

    7. >>> Этот пункт по желанию. Рекомендация для быстрой работы викторины, для всех таблиц в базе данных через phpMyAdmin установить вид движка InnoDB. Зайти в phpMyAdmin, нажать на таблицу, затем в Операции через верхнее меню, и там можно выбрать движок базы InnoDB и конвертировать.

    8. В чужой старой сборке найдена проблема кодировки при написании в чате, исправлять надо в файле sender.php найдя 2 строки с функцией htmlspecialchars и приведя их к такому виду:

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

    egrep -n -R ‘htmlspecialchars’ |grep ‘NULL,’

    Для запуска чата VOC++ на версии 5.6 достаточно пунктов 1 и 2, а чтобы заработали некоторые модули, нужно сделать ещё и 3.
    Пункты 4, 5, 6 это мелкие исправления, таких у каждого может быть много, зависит от сборки! Номер строк может также не совпадать, если файлы менялись. После всех исправлений, не забудьте переключить версию PHP на 5.6 через панель Webserv24 в настройках вашего домена.

    #2 2020-03-29 04:20:21

    Протестировал на рабочем чате.

    После внесения поправок и перехода на PHP5.6 — чат работает, но не принимает кириллицу.
    В сообщениях проходят смайлы, цифры и английские буквы. Вместо текста на русском языке — пустое сообщение.

    #3 2020-03-29 12:17:03

    Это единственный баг?
    Если да, то может быть стоит им заняться.

    #4 2020-06-18 23:58:08


    Кажется понял причину кодировки, достаточно прописать в common файле такое

    #5 2020-06-20 02:39:21

    В принципе, проблема локализована.

    Чат заработал! Сообщения идут.

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

    Потестировал ещё — викторина считает количество знаков и только по этому параметру принимает ответ.
    Если знаков меньше, чем в условии вопроса — то не примет ответ, а если больше — то принимает.
    Вызов ТОП-10 по команде !топ — работает.

    Судя по всему, проблема теперь в mysql_connect — нужно менять на mysqli_connect.
    Как-то так.

    Расширение — mysql_connect() — устарело, начиная с версии PHP 5.5.0, и будет удалено в будущем. Используйте вместо него MySQLi или PDO_MySQL.

    У меня сделан вывод статистики ответов и награда для пользователей, находящихся в 10-ке лидеров через mysqli_connect — всё работает без изменений.
    Но только я поставил обращение к базе через mysql_connect — сразу же пропала статистика.

    Создание мини-чата на PHP и jQuery

    Дата публикации: 2015-04-28

    От автора: В данной обучающей статье мы с вами научимся создавать мини-чат на PHP и jQuery, который позволит посетителям вашего сайта оставлять друг другу небольшие комментарии. Сообщения будут храниться на стороне сервера в виде файлов, никакой базы данных, например, MySQL не потребуется. Для облегчения работы мы будем использовать две PHP библиотеки – Flywheel для хранения сообщений в виде файлов в формате JSON и RelativeTime для создания относительных временных меток в удобочитаемом для человека виде. Для установки данных библиотек будет использоваться Composer.

    На стороне клиента мы будем использовать обычный jQuery код и библиотеку Emoji One, которая является бесплатной и служит для добавления симпатичных смайликов-эмоджи в веб-приложения. Давайте начинать!

    Запускаем мини-чат

    Вы можете скачать исходники по вышеприведенной ссылке. В исходном коде содержится много комментариев, и весь код легко читается. Для запуска нужно загрузить исходный код на хостинг или добавить его в папку htdocs сервера Apache, если вы пользуетесь чем-нибудь вроде XAMPP или MAMP. Затем наберите в вашем браузере адрес localhost (или адрес вашего сайта, если вы загрузили исходники на хостинг). Вот несколько моментов, на которые следует обратить внимание:

    В zip архивах уже содержатся необходимые зависимости, поэтому вам не нужно устанавливать Composer. Так гораздо проще начать работать с кодом – просто загрузите и используйте!

    Как создать сайт самому?

    Какие технологии и знания необходимы сегодня, чтобы создавать сайты самостоятельно? Узнайте на интенсиве!

    Убедитесь в том, что директория для хранения данных/сообщений существует и доступна для записи. В противном случае вы увидите сообщения об ошибках в вашем лог-файле, и сообщения не будут сохранены. Возможно, вам потребуется изменить права директории на 777 с помощью команды chmod, если ошибки будут продолжать появляться.

    Загрузка файлов с помощью PHP на сервер

    Что может быть общего у фотографий, находящихся в онлайн-фотоальбоме, прикреплённых к электронному письму или у файлов, представленных в онлайн-приложении для пакетной обработки? Всех их необходимо загрузить на сервер через интернет из веб-браузера. Действительно, загрузка файлов является важной особенностью многих сайтов и веб-приложений, которые мы используем ежедневно. Из этой статьи вы узнаете, как добавить к себе на сайт поддержку загрузки файлов используя для этого PHP.

    Требования перед загрузкой файлов

    Обработка загружаемых файлов — стандартный процесс, но существует несколько мелочей, на которые необходимо обратить внимание перед началом работы. Первое, в чем нужно удостовериться, что PHP настроен и позволяет загружать файлы. Для этого в php.ini стоит проверить директиву file_uploads , и, если она выключена, то включить.

    Загружаемые файлы сначала сохраняются во временном каталоге (но не волнуйтесь . ваш PHP-скрипт впоследствии может переместить файлы в более подходящее место). Исходное местоположение является временным каталогом для системы по умолчанию. Вы можете указать другой каталог, используя директиву upload_tmp_dir в php.ini. Независимо от этого, будет не лишним проверить, что процесс PHP имеет правильные права на запись в зависимости от используемого каталога.

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

    Стоит отметить, что разные браузеры будут визуализировать поле загрузки файла по-разному. IE, Firefox и Opera отображают его как текстовое поле с кнопкой рядом с ней надписью «Обзор» или «Выбрать». Safari отображает ее так же, как кнопку с надписью: «Выбрать файл». По большому счету это не проблема с тех пор, как пользователи привыкли к тому, как поле отображается в своем браузере и умеют его использовать. Иногда, однако, вы столкнетесь с клиентом или дизайнером, который непреклонно представляет его определенным образом. Количество CSS и JavaScript, которые могут применяться к файловому полю, крайне ограничено из-за соображений о безопасности, наложенных браузерами. Типизация файла может быть затруднена. Если внешний вид очень важен для вас, я рекомендую вам прочитать одну из статей «Питер-Пол Кох» типа ввода = «файл» .

    Переходим на сервере и работаем с PHP

    Информация о загрузке файла предоставляется с помощью многомерного массива $_FILES . Этот массив обладает своей структурой, назначенными именами для полей файла в форме HTML, точно так же, как и при работе с $_GET и $_POST . Затем массив каждого файла содержит следующие элементы:

    • $_FILES[«myFile»][«name»] — хранит исходное имя файла;
    • $_FILES[«myFile»][«type»] — сохраняет mime-типа файла;
    • $_FILES[«myFile»][«size»] — сохраняет размер файла (в байтах);
    • $_FILES[«myFile»][«tmp_name»] — хранит имя временного файла;
    • $_FILES[«myFile»][«error»] — хранит код ошибки, полученный в результате передачи.

    При помощи функции move_uploaded_file() мы можем перенести файл из своего временного каталога в постоянное место. Так же хорошей практикой является использовать именно её вместо copy() и rename() для этой цели, поскольку она выполняет дополнительные проверки, чтобы гарантировать, что файл был действительно загружен запросом HTTP методом POST.

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

    Вот так как выглядит получение и обработка загрузки файла при помощи PHP:

    Сначала мы удостоверяемся, что PHP загрузка файла на сервер прошла без ошибок. Затем определяем безопасное имя файла, как я только что описал выше, а затем перемещаем файл в его конечный каталог с помощью move_uploaded_file() . И наконец делаем вызов chmod() , чтобы убедиться, что в новом файле установлены необходимые права доступа.

    Вопросы безопасности

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

    Один из них заключается в том, чтобы проверить тип загружаемого файла, каким он должен быть. Опираться на значение $_FILES[«myFile»][«type»] или на расширение имени файла не является безопасным, поскольку оба могут легко подделываться. Скорее, используйте функцию exif_imagetype() , чтобы проверить содержимое файла и определить, действительно ли это GIF, JPEG или один из нескольких других поддерживаемых форматов изображений. Если exif_imagetype() недоступен (функция требует, чтобы расширение Exif было включено), вы можете использовать getimagesize() . Массив, возвращаемый ей, будет содержать тип изображения, если он распознан.

    Для файлов без изображения вы можете использовать exec() для вызова утилиты файлов unix. он определяет тип файла, ища известные двоичные подписи в ожидаемых местах.

    Еще один шаг, который вы можете предпринять, — наложить жесткие ограничения на общий размер запроса POST и количество файлов, которые можно загрузить. Для этого укажите соответствующее значение для директив upload_max_size , post_max_size и max_file_uploads в php.ini. Директива upload_max_size указывает максимальный размер загрузки файла. В дополнение к размеру загрузки вы можете ограничить размер всего запроса POST директивой post_max_size . max_file_uploads — это новая директива (добавлена в версии 5.2.12), которая ограничивает количество загрузок файлов. Эти три директивы помогают защитить ваш сайт от атак, которые пытаются нарушить его доступность, вызывая интенсивный сетевой трафик или загрузку системы.

    Третий шаг, который вы можете предпринять для минимизации риска, — это сканирование загруженных файлов с помощью антивирусного сканера. Это жизненно важно для защиты от распространённых вирусов и вредоносных программ, особенно если ваш сайт осуществляет файлообмен между разными людьми, как пример — вложения в веб-почтовый клиент или (юридический) сайт для обмена файлами. Существует расширение PHP, которое обеспечивает доступ к ClamAV , но, конечно, вы можете вызвать утилиту командной строки ClamAV так же, как я продемонстрировал для файла.

    Подводим итоги и делаем выводы

    Сегодня вы узнали, как происходит настройка и осуществляется процесс PHP загрузки файлов на сервер с вашего сайта или веб-приложения. Чтобы загрузка была успешной, форма HTML должна быть отправлена через запрос POST с множественным форматированием данных, а PHP должен разрешать передачу, как указано, с помощью директивы file_uploads . После переноса файла, сценарий, ответственный за обработку загрузки, использует информацию, найденную в массиве $_FILES , чтобы переместить файл из временного каталога в нужное место. Я также поделился некоторыми дополнительными мерами предосторожности, которые вы можете предпринять, чтобы защитить себя и своих пользователей от некоторых рисков, связанных с возможностью загрузки файлов. Чтобы гарантировать свою безопасность — проверяйте тип файла, наложите жесткие ограничения на загрузку трафика и применяйте сканирование на наличие вирусов.

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

    Мастер Йода рекомендует:  Предварительной модерации поисковой выдачи в России не будет
    Добавить комментарий