参考资料

PHP中Event扩展安装:https://blog.mailjob.net/posts/877067227.html

EventBase 类:https://www.php.net/manual/zh/class.eventbase.php

注册事件函数(Event::__construct):https://www.php.net/manual/zh/event.construct.php

添加事件函数(Event::add):https://www.php.net/manual/zh/event.add.php

创建应用监督事件函数(EventBase::__construct):https://www.php.net/manual/zh/eventbase.construct.php

调度未决事件(EventBase::loop):https://www.php.net/manual/zh/eventbase.loop.php

Event预定义常量

参考文档:https://www.php.net/manual/zh/class.event.php#event.constants.read

Event-flags 函数描述
Event::READ 此标志表示当所提供的文件描述符(通常是流资源或套接字)准备好可读取时活动的事件。
Event::WRITE 标志表示当提供的文件描述符(通常是流资源或套接字)准备好写入时活动的事件。
Event::SIGNAL 用于实现信号检测。参见下面的“构造信号事件”
Event::TIMEOUT 这个Event::TIMEOUT在构造事件时忽略标志:可以在事件发生时设置超时。或者不是。设置为 $什么 当超时发生时,回调函数的参数

代码测试

代码下载

https://github.com/mailjobblog/dev_swoole/tree/master/210519_event

轮询Event测试

基于php原生的 event 事件类,实现一个简单的定时轮询任务

<?php
/**
 * 设置事件库
 * https://www.php.net/manual/zh/class.eventbase.php
 */
$eventBase = new EventBase();

/**
 * 定义事件类
 * https://www.php.net/manual/zh/event.construct.php
 * base 要关联的事件库
 * fd 计时器使用 -1,信号则使用信号编号
 * what (Event::TIMEOUT | Event::PERSIST)表示定时并且不结束
 * cb 事件的回调函数
 */
$event = new Event($eventBase, -1, Event::TIMEOUT | Event::PERSIST, function(){
    // 事件类的动作
    echo microtime(true). ": 我第一次来了\n";
});

/**
 * 将事件挂起 设置事件时间
 * https://www.php.net/manual/zh/event.add.php
 */
$event->add(2);// 2 秒


// 重复上面的功能
$event1 = new Event($eventBase, -1, Event::TIMEOUT | Event::PERSIST, function(){
    echo microtime(true). ": 嘎嘎嘎嘎,我又来了\n";
});
$event1->add(0.5); // 0.5 秒

/**
 * 调度未解决的事件 将事件变成活动状态
 * https://www.php.net/manual/zh/eventbase.loop.php
 */
$eventBase->loop();

image-20210519105556998

Event的Socket测试

代码下载

https://github.com/mailjobblog/dev_swoole/tree/master/210519_event/event_socket

代码

event_socket_server.php

<?php
// 建立协议服务
$socket = stream_socket_server("tcp://0.0.0.0:8000", $errno, $errstr);

$eventBase = new EventBase();

/**
 * socket 可读,可写,持续监听
 */
$event = new Event($eventBase, $socket, Event::READ | Event::WRITE | Event::PERSIST, function($socket) {

    $connect = stream_socket_accept($socket);
    $read = fread($connect, 65535);
    var_dump($read);
    fwrite($connect,"this is eventSocketServer \n");
    fclose($connect);

});

$event->add();

$eventBase->loop();

event_socket_client.php

<?php
$fp = stream_socket_client("tcp://127.0.0.1:8000");

fwrite($fp, "niHaoYa");

var_dump(fread($fp,65535));

image-20210519202003108

image-20210519201941218

Swoole 实现 Event 事件

代码下载

https://github.com/mailjobblog/dev_swoole/tree/master/210519_event/event_swoole

代码

swoole_event.php

<?php
$server = stream_socket_server("tcp://0.0.0.0:8000", $errno, $errstr);
var_dump($server);

Swoole\Event::add($server, function($socket){
    // 事件类的动作
    $conn = stream_socket_accept($socket);
    Swoole\Event::add($conn, function($socket){
     // 事件类的动作
     var_dump(fread($socket, 65535));
     fwrite($socket, 'The local time is ' . date('n/j/Y g:i a') . "\n");
     Swoole\Event::del($socket);
     fclose($socket);
    });
});

client.php

<?php
$fp = stream_socket_client("tcp://127.0.0.1:8000");

fwrite($fp, "niHaoYa6666666666666666");

var_dump(fread($fp,65535));

image-20210519203651148

image-20210519203713460