1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/hhxsv5-php-sse

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

PHP SSE: Server-sent Events

Простая и эффективная библиотека, реализующая события, отправленные сервером (server-sent events) в HTML5, используется для отправки событий в реальном времени с сервера клиенту. Это проще, чем Websocket, и не требует запросов AJAX.

Требования: PHP 5.4 или более поздней версии.

Установка через Composer:

composer require "hhxsv5/php-sse:~2.0" -vvv

Использование:

  • Запуск демо:

    • Запустите веб-сервер PHP:
    cd examples
    php -S 127.0.0.1:9001 -t .
    • Откройте URL http://127.0.0.1:9001/index.html.
  • Демо на JavaScript:

    Клиент: получение событий от сервера.

    // withCredentials=true: передать файлы cookie для междоменного доступа серверу
    const source = new EventSource('http://127.0.0.1:9001/sse.php', {withCredentials: true});
    source.addEventListener('news', function (event) {
        console.log(event.data);
        // source.close(); // отключить поток
    }, false);
  • Демонстрация на PHP:

    Сервер: отправка событий с помощью чистого PHP.

    use Hhxsv5\SSE\Event;
    use Hhxsv5\SSE\SSE;
    use Hhxsv5\SSE\StopSSEException;
    
    // Пример PHP-FPM SSE: отправка сообщений клиенту
    
    header('Content-Type: text/event-stream');
    header('Cache-Control: no-cache');
    header('Connection: keep-alive');
    header('X-Accel-Buffering: no'); // Nginx: небуферизованные ответы подходят для Comet и HTTP потоковых приложений
    
    $callback = function () {
        $id = mt_rand(1, 1000);
        $news = [['id' => $id, 'title' => 'title ' . $id, 'content' => 'content ' . $id]]; // Получить новости из базы данных или сервиса.
        if (empty($news)) {
            return false; // Вернуть false, если нет новых сообщений
        }
        $shouldStop = false; // Остановить, если что-то произойдёт или очистить соединение, браузер повторит попытку
        if ($shouldStop) {
            throw new StopSSEException();
        }
        return json_encode(compact('news'));
        // return ['event' => 'ping', 'data' => 'ping data']; // Временное пользовательское событие: отправить событие ping
        // return ['id' => uniqid(), 'data' => json_encode(compact('news'))]; // Пользовательский идентификатор события
    };
    (new SSE(new Event($callback, 'news')))->start();
  • Symfony и Laravel:

    Отправка событий с помощью Laravel или Symfony.

    use Hhxsv5\SSE\SSE;
    use Hhxsv5\SSE\Event;
    use Hhxsv5\SSE\StopSSEException;
    
    // Метод действия в контроллере
    public function getNewsStream()
    {
        $response = new \Symfony\Component\HttpFoundation\StreamedResponse();
        $response->headers->set('Content-Type', 'text/event-stream');
        $response->headers->set('Cache-Control', 'no-cache');
        $response->headers->set('Connection', 'keep-alive');
        $response->headers->set('X-Accel-Buffering', 'no'); // Nginx: небуферизованные ответы подходят для Comet и HTTP потоковых приложений
        $response->setCallback(function () {
            $callback = function () {
                $id = mt_rand(1, 1000);
                $news = [['id' => $id, 'title' => 'title ' . $id, 'content' => 'content ' . $id]]; // Получить новости из базы данных или сервиса.
                if (empty($news)) {
                    return false; // Вернуть false, если нет новых сообщений
                }
                $shouldStop = false; // Остановить, если что-то произойдёт или очистить соединение, браузер повторит попытку
                if ($shouldStop) {
                    throw new StopSSEException();
                }
                return json_encode(compact('news'));
                // return ['event' => 'ping', 'data' => 'ping data']; // Временное пользовательское событие: отправить событие ping
                // return ['id' => uniqid(), 'data' => json_encode(compact('news'))]; // Пользовательский идентификатор события
            };
            (new SSE(new Event($callback, 'news')))->start();
        });
        return $response;
    }
  • Swoole:

    Отправка событий с помощью Swoole Coroutine Http Server. Установите Swoole 4.5.x: pecl install swoole.

    use Hhxsv5\SSE\Event;
    use Hhxsv5\SSE\SSESwoole;
    use Swoole\Http\Request;
    use Swoole\Http\Response;
    use Swoole\Http\Server;
    use Hhxsv5\SSE\StopSSEException;
    
    // Swoole SSE Example: push messages to client
    
    $server = new Server('0.0.0.0', 5200);
    ``` ```

$server->set([ 'enable_coroutine' => true, 'max_coroutine' => 10000, // worker_num*10000 'reactor_num' => swoole_cpu_num() * 2, 'worker_num' => swoole_cpu_num() * 2, 'max_request' => 100000, 'buffer_output_size' => 4 * 1024 * 1024, // 4MB 'log_level' => SWOOLE_LOG_WARNING, 'log_file' => DIR . '/swoole.log', ]);

$server->on('Request', function (Request $request, Response $response) use ($server) { $response->header('Access-Control-Allow-Origin', '*'); $response->header('Content-Type', 'text/event-stream'); $response->header('Cache-Control', 'no-cache'); $response->header('Connection', 'keep-alive'); $response->header('X-Accel-Buffering', 'no');

$event = new Event(function () {
    $id = mt_rand(1, 1000);
    $news = [['id' => $id, 'title' => 'title ' . $id, 'content' => 'content ' . $id]]; // Получить новости из базы данных или сервиса.
    if (empty($news)) {
        return false; // Вернуть false, если нет новых сообщений
    }
    $shouldStop = false; // Остановить, если что-то произойдёт или для очистки соединения, браузер повторит попытку
    if ($shouldStop) {
        throw new StopSSEException();
    }
    return json_encode(compact('news'));
    // return ['event' => 'ping', 'data' => 'ping data']; // Пользовательское событие временно: отправить событие ping
    // return ['id' => uniqid(), 'data' => json_encode(compact('news'))]; // Идентификатор пользовательского события
}, 'news');
(new SSESwoole($event, $request, $response))->start();

}); $server->start();


## License

[MIT](https://github.com/hhxsv5/php-sse/blob/master/LICENSE)

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

Вы можете оставить комментарий после Вход в систему

Введение

PHP SSE: Server-sent Events. Реализовал HTML5 серверные события через PHP. Используется для отправки событий от сервера к клиенту в реальном времени. Проще, чем WebSocket. Развернуть Свернуть
MIT
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/hhxsv5-php-sse.git
git@api.gitlife.ru:oschina-mirror/hhxsv5-php-sse.git
oschina-mirror
hhxsv5-php-sse
hhxsv5-php-sse
master