Недавно, - если быть точным - 3 года назад, я начал делать чат на PHP для собственных нужд. Буквально на днях я доработал пару функций и решил его всё-таки выпустить в мир. Технология, которую использует данная система, уже считается устаревшей: PHP (ООП, MVC), AJAX (XMLHttpRequest), HTML5, MYSQLI, CSS3. На одном из каналов Telegram кто-то пошутил и назвал чат ламповым, по аналогии с ламповыми телевизорами. Что тут скажешь?! Метафорически точно и остроумно подмечено! Изначально система задумывалась для замены чата на файлах в движке одной браузерной игры. Основная задача была: сделать максимально простую систему.

В 2022 году считается, что чаты на Ajax уже не делают, но почему-то продолжают делать системы комментариев к блогам, новостям и доскам объявлений. В моем представлении системы, которые называют message board и chat, в целом имеют схожую схему работы, а порой вообще отличаются только названием. Система, которая получилась у меня, - что-то среднее между доской сообщений и чатом.

Особенности

1) Система не хранит все сообщения, количество сообщений в базе данных всегда 50 (количество настраивается администратором).

2) Поскольку чат работает без перезагрузки страницы (Ajax), то история сообщений хранится у пользователей. Каждые 30 минут окно перезагружается и стирает историю. Это часть концепции чата: забота о хранении истории перекладывается на пользователя.

3) Чат многоканальный. Есть возможность создавать закрытые каналы. На главной странице отображается только 15 открытых каналов. Для работы с закрытым каналом требуется указать пароль (общий) и имя канала. Есть переключение между каналами с помощью мыши.

4) Ссылки в чате конвертируются. Также отображаются в чате изображения (конвертация ссылок на изображения).

5) Присутствует система выделения текста, а также возможность отправить приватеное сообщение пользователю через alert.

6) Система открытая и не имеет панели управления. Редактировать базу данных предлагается через phpmyadmin. Только каналы можно создавать на лету.

Где может пригодиться подобная система?

1) На системах, где нет необходимости создавать специальные учётные записи пользователей (небольшие офисы в одном здании).

2) На системах, где нет необходимости или возможности использовать интернет-мессенджеры и чаты.

3) Если нужно быстро развернуть сервер для общения и дать доступ десятку-двум пользователям через браузер.

Система протестирована и корректно работает с последними версиями браузеров Firefox и Chrome. Для установки требуется иметь навык работы с phpmyadmin и начальные навыки редактирования кода. Описание системы и установки находятся в сопроводительном файле.

Пример работы чата можно посмотреть здесь: http://comb.org.ru/chat/index.php

Последнюю версию чата можно скачать здесь: https://gitflic.ru/project/dcc0/open

Или здесь: https://github.com/dcc0/OpenChatPhp/tree/OpenChatPhp-1.1-2022

Обложка: отечественный телеграф. Фото из Интернета.

Данная система является открытым ПО, разработанным в России.

На правах рекламы: чат полностью написан в редакторе Geany.

Комментарии (42)


  1. space2pacman
    18.10.2022 13:56

    Отправка сообщений через get запрос? Почему не post?


    1. dcc0 Автор
      18.10.2022 14:02

      Чтобы лимитировать длину сообщения. Расчёт был — заменить файловый чат в игре (в которой много флуда и баловства от игроков).
      Этот чат можно рассматривать как некую вспомогательную систему для локальной сети.
      Но мне интересны отзывы, если кто-то будет пользоваться. Мне так и не удалось потестировать этот чат, допсутим с тремя десятками пользователей.


      1. space2pacman
        18.10.2022 14:05
        +4

        Лимитировать можно и post запросы на бэке


        1. kuber
          18.10.2022 14:45
          -1

          Лимитировать можно и POST запросы на фронте.


          1. Areso
            18.10.2022 14:46

            До первого скрипт кидди, умеющего в DevTools


            1. kuber
              18.10.2022 16:07

              Не понял. И как вы это реализуете если будет проверка и на фронте и на бэке?


              1. Areso
                18.10.2022 18:01
                +1

                А смысл лимитировать дважды? Сделали на бэке, все, задача выполнена.

                Делать одну и ту же задачу дважды - раздувать кодовую базу и ловить потом баги.


                1. kuber
                  18.10.2022 21:56
                  +3

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


                  1. Areso
                    18.10.2022 23:01
                    +1

                    Потом фронт и бэк разъедутся в части правил валидации и начнется хождение по мукам.

                    Реальный опыт, впрочем, у всех может быть разным. У меня - негативный.


                    1. kuber
                      19.10.2022 07:27

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


                    1. Giperoglif
                      20.10.2022 06:57

                      обычно фронт и валидируется правилами бэка. в любом нормальном фрэймворке.


      1. lair
        18.10.2022 18:27

        Чтобы лимитировать длину сообщения

        Что мешает это в POST сделать?


        1. dcc0 Автор
          18.10.2022 21:00

          В общем ни что не мешает.
          Когда я начинал писать, то мне показось проще ипользовать GET.
          Можно переделать, если это кому-нибудь вообще нужно.

          Посмотрел вот эту тему:
          stackoverflow.com/questions/1872965/get-vs-post-in-ajax
          Тут пишут, что GET кешируется и что через него не рекмендуют отправлять персональные данные.
          Но чат открытый и авторизации не предполагает.
          А про кеширование у меня самого вопрос: на что это может влиять?!


          1. lair
            18.10.2022 21:01

            А про кеширование у меня самого вопрос: на что это может влиять?!

            Например, на то, что повторно отправленный GET может не достичь сервера вообще.


            1. dcc0 Автор
              18.10.2022 22:09

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


              1. lair
                18.10.2022 22:12
                +3

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


                Ну и да, то, что человек каждый день приходит и пишет "привет", а со второго дня эти сообщения никому не доходят (а он думает, что доходят) — это тоже так себе решение.


          1. kuber
            18.10.2022 22:11

            Смотрите. Вы отправили сообщение GET запросом и браузер старательно сохранил это в истории. Через час опять зашли в чат, а браузер подставил сохранённый URL и то же сообщение отправлено повторно.

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


  1. pewpew
    18.10.2022 14:24

    Ого. В далёком 2000 году делал похожий проект. Точнее это была первая попытка сделать что-то на PHP. О базах данных тогда знал весьма туманно и сделал на текстовых файлах, хранящихся на сервере. А для коллизий при записи реализовал файл-флаг записи, при наличии которого писать в основной файл с чатом было нельзя.
    В чате даже были роли, а модерация и администрирование работала через команды.
    Ух! Ностальгия!


  1. Ilusha
    18.10.2022 14:35
    +7

    Шел 2022. Чаты на WebSockets уже делают ученики на курсах от всяких инфоцыган, а разворачиваются запуском пары команд (поставить nodejs, запустить скрипт).
    Но зачем делать легко и просто, правда?)


  1. Areso
    18.10.2022 14:38
    +2

    1. Первый файл в репе при попытке открыть падает с ошибкой 500. Ну, это не к вам претензия, а к GitFlic, но возможно, там какая-то дичь и он это не может запроцессить.

    2. Readme.txt надо бы переименовать в md. Тогда описание вашей репы начнет индексироваться поисковиками, а люди смогут сразу увидеть описание проекта, без необходимости проваливаться внутрь.

    3. Держать ЗИП файлы в репе это моветон. Для этого есть раздел релизы

    4. открытое ПО предусматривает соответствующую лицензию. Будьте любезны, потрудитесь выбрать одну из доступных и подгрузить её в репо


    1. dcc0 Автор
      18.10.2022 15:20

      Поправил.


  1. masterWeber
    18.10.2022 15:20

    А почему в репозитории весь код в zip??


    1. gsaw
      18.10.2022 15:52

      Для рекурсивности


  1. theGrove
    18.10.2022 16:12

    Жаль что не на GitHub....


    1. dcc0 Автор
      18.10.2022 16:31
      -1

      Чат есть и на гитхабе.


  1. fire64
    18.10.2022 16:13

    Чат похоже уже все.... или на хроме из под андроида не работает.


    1. dcc0 Автор
      18.10.2022 18:05

      Тестовый чат на бесплатном хостинге.


  1. donpadlo
    18.10.2022 16:21

    Не уверен что эта статья в формате Хабра. В личном бложике, но уж не здесь.. Ведь есть вероятность, что начинающие будут смотреть, читать и использовать сиё...


  1. FSA
    18.10.2022 19:31
    +5

    Из-за финального абзаца («Данная система является открытым ПО, разработанным в России.») больше похоже на стёб. Понятно, что код рабочий или может быть рабочим. Но такое огромное количество ошибок начинающих: код не имеет стилевого оформления, используются устаревшие возможности браузеров для которых есть современная замена работающая с лохматых версий, сохранение реквизитов соединения с базой данных в репозитории, куча require вместо автозагрузки классов... Я устал искать. Не делайте так в 2022 году.


    1. dcc0 Автор
      18.10.2022 19:59
      -1

      Нет это не стёб, но я все равно не последую Вашему совету.
      Спасибо за комментарий.


    1. kuber
      18.10.2022 22:27
      +1

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


      1. lair
        19.10.2022 00:46
        -1

        Если его не трогать — да, будет. Но зачем его через 10 лет таким кому-то показывать? (ну, кроме археологического интереса)


        1. kuber
          19.10.2022 07:25
          -1

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


          1. dcc0 Автор
            19.10.2022 08:15

            Согласен. Но этому есть объяснение: программисты хотят кушать тоже, а опубликованное ПО вообще может не приносить заработка.
            Вдобавок есть постоянное движение (конкуренция) в сфере, по принципу всё течет, всё изменяется.


            1. kuber
              19.10.2022 08:30

              Безусловно. Я сам стараюсь использовать все самые современные техники и технологии. Но у бизнеса другое мнение. Нужно привести очень весомые аргументы, чтобы он захотел потратить много времени и денег на переписывание успешно работающего проекта на все новенькое.


              1. dcc0 Автор
                19.10.2022 12:59

                Снова соглашусь. Но так везде: не только в айти. Любое изменение схемы работы чего-либо обычно должно быть как-то обосновано.


          1. lair
            19.10.2022 14:05
            -1

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


            Так, конечно, не всегда бывает, и это решение, которое каждый для себя принимает сам. Но к публикации это все отношения не имеет.


  1. dcc0 Автор
    19.10.2022 00:30
    -4

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


    1. lair
      19.10.2022 00:45
      -1

      … а как вы определяете "лучший"?


  1. Dier_Sergio_Great
    19.10.2022 21:31

    Поддержку "Server-Sent Events" будет?

    А какие бывают другиетехнологии кроме ajax и SSE?


    1. lair
      19.10.2022 23:51

      Вебсокеты бывают. Long-polling бывает.


      (а еще бывают абстракции, которые прячут выбор между WS/SSE/лонг-поллингом, основываясь на способностях клиента и сервера)


  1. dcc0 Автор
    20.10.2022 12:18
    -1

    По поводу устаревания технологий: мне думается, что это не про Ajax на ближайшую перспективу. Как мне кажется, эту технологию можно отнести к "прижившейся" технологии.