php уведомления на сайте
Уведомления в браузере ( типа вк или другое)
3 ответа 3
Есть два типа пуш уведомлений: на одном вебсокеты точеные, с другим проблем тоже хватает.
Для реализации первого типа вам по сути нужна любая обычная система мессаджей от вашего сервера вашему клиенту. Это могут быть хоть вебсокеты, может быть лонг поллинг, может быть sse. Да хоть сигнальные костры на гуглмапс =)
Алексей Шиманский в своем комментарии подразумевал именно этот тип сообщений.
Со вторым типом все сложнее. И реализовать их «просто прикрутив какую-то библиотеку или плагин на js» нельзя. Потому что нету этого вашего клиентского js когда вкладка закрыта. Ну собственно почему у клиента должен выполняться ваш скрипт если он не у вас на сайте?
Сделать это можно, но на пути нас поджидают неприятности.
Начнем с того, что есть спецификация Notifications api. Но разумеется она еще совсем не готова, браузеры ее нормально не поддерживают (что поддерживать то, что десять раз еще поменяется). Использовать в кровавом энтерпрайзе нельзя точно. Если у вас много энтузиазма и смузи, можете попробовать прикрутить для каких-то браузеров.
Это разумеется порождает следующую проблему: для того чтобы у вас все было чудесно кроссбраузерно и розовые единороги прыгали по зеленой лужайке, вам нужно найти как можно больше таких сервисов и для каждого написать прослойку на своей стороне, которая будет этот сервис дергать. А универсального формата нету. А сервисов не так уж и мало. И каждый что-то да меняет иногда, и придется поддерживать как-то этот зоопарк.
Соответственно появились прослойки разной степени надежности, функциональности и платности. Упомянутые пользователем mics onesignal.com и clevertap.com относятся к таким прослойкам.
А теперь к плохому. Готовое работающее исключительно бесплатное решение я не нашел (искал где-то полдня, если кто-то подскажет, буду благодарен.). Есть решения платные, есть сервисы предоставляющие бесплатную триалку и есть «бесплатные».
Push рассылки на PHP (Android и IOS). Минимальное готовое решение
О рассылке Push уведомлений уже много раз писали на Хабре, например тут и тут, но прямого руководства к действию до сих пор нет. Итак, если интересно, прошу под кат.
Регистрация токенов устройств
В первую очередь разработчик приложения творит магию, в которой указывает адрес регистрации, он может быть таким: htpp://test.ru/secret/android?token=value и htpp://test.ru/secret/ios?token=value.
Самое примечательное что защиты от левых регистраций просто нет, хотя может магия подвела либо была не совсем качественной, если все таки защита есть, отпишите в комментариях, я обязательно дополню статью полезным советом.
На входе получаем значение токена который приходит при установке приложения, могут быть небольшие задержки, но буквально 10-20 секунд. Токены уникальны, но можно сделать и проверку на уникальность при записи в базу данных.
Пример токена для android:
На этом шаге с регистрацией устройств мы закончили.
Рассылка уведомлений
Apple использует сервис APNS, а Google GCM (C2DM считается устаревшим, учитывайте это) и после прочтения документации можно перейти к любимому делу, а именно к велосипедостроению, но бюджет был ограничен и я начал поиски готовых решений. Самое годное что встретилось это ApnsPHP и GCMMessage, работают как на 5.3+ так и на 5.4+.
При использовании библиотек самое главное получить правильные сертификаты и секретную фразу в случае с APNS и секретный токен для работы с GCM.
Пример готового кода для отправки уведомлений для GCM, токены советуют отправлять пачкой, работает даже при больших количествах довольно таки быстро, сервис возвращает недействительные токены (пользователи удалили приложение), их сразу стоит удалить.
Везде пишут что APNS весьма прост в использовании, в принципе это соответствует действительности, если учитывать что есть сертификаты для теста и продакшена, стоит обратить внимание, нужен сертификат, секретная фраза и корневой сертификат, все это получается в личном кабинете разработчика.
Пользователи имеют свойство удалять особо назойливые приложения, так что перед отправкой стоит удалить мертвые токены.
Затем сама отсылка:
Если Вы не напутали с сертификатами, то рассылка пройдет успешно.
Браузерные Push-уведомления на Javascript и PHP
Предисловие
В попытке найти годную статью по настройке уведомлений в браузере, я получал только статьи где в основном описывалось использование совместно с Firebase, но мне такой вариант не особенно то и подходил.
В данной статье не будут «размусолены» принципы работы и тонкости Push уведомлений, только код.
Push-уведомления работают только с HTTPS.
К слову, в добавок с HTTPS должен присутствовать валидный SSL сертификат, подойдет и Let’s Encrypt
Для разработки подойдёт localhost. Проблем возникнуть не должно, но если все же возникли данная статья поможет разобраться с ними.
Да будет код
Авторизация (VAPID)
Для начала стоит установить библиотеку WebPush в ваш php проект:
Далее для авторизации вашего сервера браузером (VAPID), вам нужно сгенерировать публичный и приватный ssh ключи. Данные ключи понадобятся как на сервере, так и на клиенте (за исключением того что на клиенте нужен лишь публичный).
Чтобы сгенерировать несжатый публичный и приватный ключ, закодированный в Base64, введите следующее в свой Linux bash:
Так же автор библиотеки предоставляет генерацию vapid ключей с помощью встроенного метода:
Подписка
Этап 1 (JS)
В начале стоит проверить наличие поддержки ServiceWorker, PushManager, а так же showNotification в браузере:
Создаем файл sw.js и далее регистрируем его:
Так же нам понадобится функция для проверки состояния подписки:
С сервера нам нужно получить публичный ssh ключ сгенерированный выше:
Далее на ваше усмотрение, вешаем вызов окна на разрешение получение уведомлений. В моем примере человек через 10 секунд получает предложение подписаться.
Далее если процесс получения разрешения подписки прошел успешно вызываем функцию successSubscriptionHandler
Формируем данные пользователя для дальнейшей отправки уведомлений.
Так же нам нужно сформировать отправляемое уведомление
Вы можете манипулировать данными уведомления при помощи Post Message API
Этап 2 (PHP)
Далее в файле subscribeUserToPushNotifications на который мы сделали запрос с фронта при получении разрешения на подписку, мы формируем данные пользователя
На данном этапе мы можем записать данные пользователя в Базу данных (Ну или что у вас там), для последующей отправки уведомлений.
Непосредственно сама отправка происходит следующим образом
Достаем юзера с места его сохранения, и далее создаем объект подписчика:
Далее формируем VAPID для авторизации:
После того как сформировали нужные данные, создаем новый объект WebPush:
Ура! Наконец мы можем отправить запрос на отправку Push уведомления
Для отправки уведомлений в итерации, стоит использовать функцию, с теми же параметрами, что и в функции выше:
Сервис push-уведомлений Pushover для Android и iOS в связке с PHP
Пример задачи
Предположим, что раз в день мы хотим знать что-либо о количестве заказов на сайте за день и их стоимости.
Сайт крутится на некоторой CMS на PHP и mySQL, принимающая сторона имеет стильные iPhone и Android-телефоны.
Срочность доставки сообщения не относится к жизненно-важным показателям.
Надо найти условно безгеморройное решение.
Pushover
Pushover — это скромный сервис уведомлений, а также приложения для iOS и Android, планируются поделки и для BlackBerry и OS X Mountain Lion. Сервис имеет свой API, позволяет отправлять бесплатно до 7.5 тысяч сообщений в месяц.
Сообщение, помимо основного текста сообщения длиной 512 символов, может содержать крупный заголовок, URL (тогда длина сообщения увеличивается до 500) и его тайтл (все отображается отдельными сформированными блоками, потому такое разграничение). Сообщение можно доставить под неким выбранным указанным приоритетом. Пользователь может указать «тихие» часы, когда его не стоить будить уведомления, а также подключать и отключать устройства, на которые будут приходить уведомления.
Уведомление может быть доставлено пользователям, предоставившим свой код, всем устройствам этого пользователя или по выбору. Для приема сообщения пользователю необходимо быть зарегистрированным в сервисе и обладать хотя бы одним рабочим устройством.
Добавление пользователя
После прохождения регистрации, каждый пользователь попадает в свой кабинет, где он сразу видит свой хэш-токен. Это уникальный идентификатор пользователя, на который в последствии и отправляются уведомления.
Пользователю, желающему принимать сообщения, необходимо поставить на свой телефон/планшет/абы что приложение из соответствующего магазина.
Добавление сервиса
Добавление сервиса ничуть не сложнее. Из личного кабинета надо перейти на страницу создания приложения, где предлагается описать продукт:
После заполнения соответствующих полей, нам становится известен токен приложения. В принципе, это все, что необходимо для отправки сообщения.
На странице приложения в последующем будет красивый график успешно отправленных сообщений.
Связывание приложений и получателей
… не выполняется никак. Любое приложение может отправить любому пользователю уведомление, если знает его токен. Прием токенов от населения остается на совести приложения. Также как и отписка от рассылок.
Ответ сервера
Ответ сервера будет представлен в json или xml формате (в зависимости от расширения вызываемого скрипта).
Если все прошло удачно будет отдан объект содержанием поля status, равном 1.
Иначе, поле status будет содержать нечто иное, а поле errors — массив описания ошибок. Вот примеры ответов удачной и неудачной отправок в формате XML:
и
На главной странице и в факе в разделах «смотрите, как легко!» приводятся коды простейшего скрипта на различных языках для отправки и есть ссылка на 3rd-party php-класс от Chris Schalenborgh.
Везде используется сURL, что впрочем, понятно.
Зафигарим свой класс
Минимальное сообщение теперь довольно просто отправить, ошибки можно разбирать:
Как сделать оповещение на сайте с помощью php + mysql + ajax для большого количества пользователей?
Всем доброго времени суток и с наступающим)
Суть вопроса такова:
Наверное как и все начинающие изучение php mysql ajax хотят сделать велосипед, чтобы разобраться как это все работает от и до.
Хочу сделать мгновенное оповещение
— на сайте сидит более 500 человек онлайн
— появляются новые данные в базе
— появляется мгновенное сообщение о новой записи
Вроде задача не сложная, но есть НО.
на сайте делается запрос аля comet, ожидает ответа, если ответа нет,
то через 2 минуты делает новый запрос, и все до тех пор, пока цикл php не выдаст ответ
Сделал на php обработчик, который проверяет новые записи while
в цикле делается проверка на новые сообщения с интервалом 1 секунда
как только появляется новая запись например со статусом new, сразу отдается ответ, и снова запускается цикл
открывал 5 окон браузера, вроде все работает быстро и без проблем, но как только открываю более 6 окон, начинает все виснуть, хром в статусе пишет, что ищет свободный сокет, может проблема в хроме, но если в этот момент открыть сайт с другого компьютера, то страница и там висит.
Я так понимаю, что запускается более 6 циклов и сервер не справляется (мониторить ресурсы сервера нет возможности, ибо хостинг reg ru)
Прошу помощи поделиться опытом, какая математика должна быть.
Не знаю как и в чем найти причину
— либо ресурсы сервера не позволяют выполнять много циклов одновременно
— либо кол-во соединений ограничено сервером
— либо циклы должны работать как то параллельно