何为Moment
名称由来
本人不是很会取名字,从ioHTTP
到WebRPC
,一直都是直来直往
但是那天我打算启动MomentPHP工程时看到了英语书单词表的词汇moment
,感觉可以就用上了
就如本身的含义那样,我们希望做到 极快 的响应速度客户端的请求
于是我们使用了这个名字
设计理念
Moment就是要快,即通过低系统占用实现更多的客户端并发,这就需要做到类似于浏览器的异步
想要异步就需要对PHP做一个框架级拓展,这样我们定义了以下的概念
- Promise JavaScript上的概念 使用Promise
Promise用于异步地执行一个命令,不会阻塞进程执行下一行命令,而是当执行完成后调用回调 - Event
与Javascript的Event不同,我们只保留了最基础的功能,即监听on()
和类内部调用_trig()
- Pipe
与Javascript的Event不同,Pipe需要同时具备read()
和write()
函数
但是特殊的管道(如只可以读的ProcPipe
)可能会直接报错或者(如以r
为参数的FilePipe
)根本不会真实地写入 - vThread 或者称为协程更加恰当
vThread不是单独的线程,而是将异步变成vThread中同步后造成“似乎是阻塞的”的错觉
vThread共享全局变量和命名空间,而且减少了由于yield
构成的异步函数没有使用Promise::await
造成的遗漏错误 - RPC
RPC用于多进程远程调用,或者说是多进程通信(IPC),也可以搭配Web端的RPC实现与前端交互
Moment版本的RPC实现了大部分功能,如call
var
,但是砍掉了pipe
- ReactiveTable
做出这个简易数据库功能是为了共享一个数据库同时做到多vThread同步更改,和自动保存避免数据丢失和减少磁盘IO次数,同时减小APP开发周期 WebSocket JavaScript上的WebSocket
同样仿照了JavaScript上的概念,使用相似的API(send
close
),但是有两个用途fetch
了一个ws地址HttpHandle::ws
使得HTTP请求变成了WebSocket请求
这两个方法返回的都是WebSocket
类,无须担心
- fs://
异步文件系统访问协议,只有在vThread中可用。仅vThread内阻塞,include
也可用
上手体验
安装Moment
MomentPHP有两个体验方法,可以使用moment-cli也可以直接使用PHP源码
解压后使用
./moment
或者
php moment.php
启动内置HTTP服务器,你可以创建或更改config.json
自定义功能
如果你使用VSCode,编辑JSON时你可以看到每个选项的提示,对于配置更有帮助
获取帮助?直接输入参数--help
即可
第一个MomentCGI程序
为了减小每次请求解析php文件的负担,所以每个入口php程序都需要return
一个函数
需要共同遵守的规则:
- 在
return
函数中写业务代码 - 在函数外定义
constant
常量、function
或者class
- 切忌在函数中动态定义,除非是
static
的变量,否则会报错 - 请使用
namespace
隔离网站的几个入口,防止互相干扰 - 使用框架时尽量使应用提前初始化,在返回的函数中
run()
示例:
<?php return function(\MomentCore\HttpHandle $h){
if(!$h -> auth('iz','hiz','ws.php'))
return;
/* 让请求变成WebSocket管道,回显输入的内容 */
if($h -> client -> header['sec-websocket-key']):
return $h -> ws() -> then(function(\MomentCore\WebSocket $ws){
$ws -> send(' >>> ');
$ws -> onMessage(function(string $data) use ($ws){
$ws -> send($data);
$ws -> send(' >>> ');
});
});
else:?>
<?php /* 这里是HTML+PHP混排代码,直接输出到客户端而不是控制台 */ ?>
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="refresh" content="1">
<title>几点了?</title>
</head>
<body><?php echo date('H:M:S'); ?></body>
</html>
<?php endif;?>
这里需要注意! 为了做到异步引入,所以__FILE__
与__DIR__
略有不同
比如这些代码:
return function(\MomentCore\HttpHandle $h){
echo __FILE__;
echo '<br>';
echo __DIR__;
}
||http://localhost:81/d/fetch.php
||
fs:///mnt/d/fetch.php
fs:///mnt/d
扩展:MomentTaskMGR
TaskMGR是另一个Moment进程,用于定时重启主进程和进程持久化管理
TaskMGR启动时会自动创建Moment进程,并且使用WebSocket
+ RPC
实现多进程交互(IPC)
启动TaskMGR时自动导入所有*.task.json
成为一个UNIT,可选 值守 自启等
除此之外,由于TaskMGR共用Moment的代码,因此其自带完整的EventLoop
,可以在同一个文件夹中放入后缀为.task.php
的文件,可以定时执行任务,如DDNS
之类的用途
示例:
use function MomentAdaper\fetch;
use function MomentAdaper\sleep;
use function MomentCore\go;
go(function(){
sleep(10);
fetch('http://demo.com/im_alive.php?id=123456');
});
go
负责创建vThread,sleep
负责延时,fetch
负责URL请求
本文由 zlh 创作,采用 知识共享署名4.0 国际许可协议进行许可。
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名。