参考资料
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();
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));
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));