PHPackages                             iphper/event-source - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Utility &amp; Helpers](/categories/utility)
4. /
5. iphper/event-source

ActiveLibrary[Utility &amp; Helpers](/categories/utility)

iphper/event-source
===================

1.0.0(2y ago)06MITPHP

Since Apr 24Pushed 2y ago1 watchersCompare

[ Source](https://github.com/iphper/event-source)[ Packagist](https://packagist.org/packages/iphper/event-source)[ RSS](/packages/iphper-event-source/feed)WikiDiscussions main Synced 1mo ago

READMEChangelogDependenciesVersions (3)Used By (0)

event-source
============

[](#event-source)

event-source 是简单的PHP服务端对于`SSE(Server-Sent Events)`的封装

\##安装

```
composer require iphper/event-source
```

使用示例
----

[](#使用示例)

### html

[](#html)

```
>

    event-srouce-example

    开始获取

```

### js

[](#js)

```
let listDom = document.getElementById('list');
document.getElementById('beginBtn').addEventListener('click', () => {
    console.log("开始监听")
    const eventSource = new EventSource("example.php");
    // 1、默认形式监听message事件
    // eventSource.onmessage = function(event){
    //     console.log('onmessage', event)
    //     let item = document.createElement("li")
    //     let data = JSON.parse(event.data);
    //     item.innerHTML = data.message
    //     listDom.appendChild(item)
    // }

    // 2、自定义形式监听message事件
    eventSource.addEventListener('message', function(event) {
        console.log('onmessage', event)
        let item = document.createElement("li")
        let data = JSON.parse(event.data);
        item.innerHTML = data.message
        listDom.appendChild(item)
    });

    // 监听stop事件
    eventSource.addEventListener('stop', function(event) {
        console.log('服务端传来:', event.data)
        eventSource.close();
    });

    // 监听error事件
    eventSource.onerror = function(errs) {
        console.log('出错了')
        console.error(errs)
    }

    // ... 监听其它事件
});
```

### php-fpm

[](#php-fpm)

```
use EventSource\EventSource;

$eventSource = new EventSource(3, '新消息123456789');
while(true) {
    // $eventSource->write(); // write与json方法仅对非string类型数据进行json格式化
    // 不传参数时，会直接发送构造方法中的'新消息123456789'; 若构造方法也没传则发送空串
    $eventSource->json([
        'message' => '消息'.random_int(1, 1000),
        'time' => time()
    ]);
    // 判断是否关闭连接
    if ($eventSource->reborted()) {
        break;
    }
    sleep(1);
}
```

### swoole

[](#swoole)

```
use EventSource\SwooleEventSource;
use Swoole\Http\Request;
use Swoole\Http\Response;
use Swoole\Http\Server;
use Swoole\Coroutine;

$http = new Server('0.0.0.0', 18088);
$http->on('request', function (Request $request, Response $response) {

    if ($request->server['path_info'] == '/favicon.ico' || $request->server['request_uri'] == '/favicon.ico') {
        $response->end();
        return;
    }
    echo 'path:', $request->server['request_uri'],PHP_EOL;

    if ($request->server['path_info'] == '/index.html') {
        $response->write(file_get_contents(__DIR__.'/index.html'));
        return;
    }

    // 使用SSE
    $sev = SwooleEventSource::make($response);

    while(true) {

        $sev->json([
            'message' => 'swoole消息'. rand(1, 100),
            'time' => time(),
        ]);
        $back = time() done();

        if ($sev->aborted()) {
            // 客户端应当对stop事件进行监听处理
            $sev->write('结束了', 'stop');
            break;
        }

        Coroutine::sleep(1);
    }
});
$http->start();
```

###  Health Score

20

—

LowBetter than 14% of packages

Maintenance20

Infrequent updates — may be unmaintained

Popularity4

Limited adoption so far

Community7

Small or concentrated contributor base

Maturity42

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Unknown

Total

1

Last Release

754d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/5dc682b0aeb62c471051daab953810521b4150fd6647cdcd6e98bd45435abb8b?d=identicon)[iphper](/maintainers/iphper)

---

Top Contributors

[![iphper](https://avatars.githubusercontent.com/u/37887253?v=4)](https://github.com/iphper "iphper (2 commits)")

### Embed Badge

![Health badge](/badges/iphper-event-source/health.svg)

```
[![Health](https://phpackages.com/badges/iphper-event-source/health.svg)](https://phpackages.com/packages/iphper-event-source)
```

###  Alternatives

[symfony/ux-chartjs

Chart.js integration for Symfony

1003.2M18](/packages/symfony-ux-chartjs)[arokettu/composer-license-manager

License management plugin for Composer

61207.9k](/packages/arokettu-composer-license-manager)[flipsite/flipsite

Static website compiler that scores 100/100 on all Lighthouse tests

182.3k](/packages/flipsite-flipsite)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
