MomentPHP 参考手册

in 日常 with 0 comment

何为Moment

名称由来

本人不是很会取名字,从ioHTTPWebRPC,一直都是直来直往
但是那天我打算启动MomentPHP工程时看到了英语书单词表的词汇moment,感觉可以就用上了

单词卡

就如本身的含义那样,我们希望做到 极快 的响应速度客户端的请求
于是我们使用了这个名字

设计理念

Moment就是要快,即通过低系统占用实现更多的客户端并发,这就需要做到类似于浏览器的异步
想要异步就需要对PHP做一个框架级拓展,这样我们定义了以下的概念

上手体验

安装Moment

MomentPHP有两个体验方法,可以使用moment-cli也可以直接使用PHP源码
解压后使用

./moment

或者

php moment.php

启动内置HTTP服务器,你可以创建或更改config.json自定义功能
如果你使用VSCode,编辑JSON时你可以看到每个选项的提示,对于配置更有帮助
获取帮助?直接输入参数--help即可

第一个MomentCGI程序

为了减小每次请求解析php文件的负担,所以每个入口php程序都需要return一个函数
需要共同遵守的规则:

示例:

<?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请求

Responses