参考资料

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 事件类,实现一个简单的定时轮询任务

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<?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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?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

1
2
3
4
5
6
<?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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?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

1
2
3
4
5
6
<?php
$fp = stream_socket_client("tcp://127.0.0.1:8000");

fwrite($fp, "niHaoYa6666666666666666");

var_dump(fread($fp,65535));

image-20210519203651148

image-20210519203713460