V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
dvaknheo
V2EX  ›  PHP

Workerman 简单 Web 服务器 WorkermanHttpd 发布

  •  
  •   dvaknheo · 2021-03-23 20:01:39 +08:00 · 2426 次点击
    这是一个创建于 1371 天前的主题,其中的信息可能已经有所发展或是发生改变。

    项目地址:

    https://github.com/dvaknheo/workermanhttpd

    WorkermanHttpd 是什么

    WorkermanHttpd 致力于 Workerman 代码和 fpm 平台 代码几乎不用修改就可以双平台运行。 是对 Workerman 类的一个封装。

    直接用 echo 输出。直接用超全局变量 $_GET,$_POST 等 只有少量系统函数改为 WorkermanHttpd 封装,按字母排序有:

    • exit
    • header
    • setcookie
    • session_start
    • session_id
    • session_destro
    • session_set_save_handler
    • set_exception_handler (TODO)
    • register_shutdown_function (TODO)

    比如原先代码里有 exit(); 要修改成 WorkermanHttpd::exit(); 调用参数都一样 比如原先代码里有 session_start(); 要修改成 WorkermanHttpd::session_start(); 调用参数都一样 具体可以调用 WorkermanHttpd::system_wrapper_get_providers()看有什么

    基本应用

    composer require dvaknheo/workermanhttpd
    
    <?php
    require(__DIR__.'/vendor/autoload.php');
    function hello()
    {
        \WorkermanHttpd\WorkermanHttpd::header('test',DATE(DATE_ATOM));
        echo "<h1> hello ,have a good start.</h1><pre>\n";
        var_dump($_GET,$_POST,$_SERVER);
        echo "</pre>";
        return true; //  正常 true , 404 false;
    }
    
    $options=[
        'port'=>8080,
        'http_handler'=>'hello',
    //* 更多的默认选项
    /*//
        //'host'  =>'127.0.0.1',          //绑定 IP
        //'port'  =>'8787',               //绑定端口
        
        'worker_name'            => 'WorkermanHttpd', //标题
        'worker_count'           => -1,       //CPU
        'worker_properties'      => [],       //给 Worker 类传递的属性
        'request_class'          => '',       //默认的请求类,一般不动。
        'command'                => 'start',  //对应命令 , stop 等
        'background'             => false,    //后台模式
        'gracefull'              => false,    //优雅模式
     
        //// 这段是几个服务器通用的
        //'http_handler' => null,           //执行的 http_handler
        'http_handler_basepath' => '',      //下版本再说, 资源目录
        'http_handler_root' => null,        //下版本再说,
        'http_handler_file' => null,        //下版本再说,
        'http_exception_handler' => null,   //下版本再说,对应 set_exception_handler
        'http_404_handler' => null,         //下版本再说,404 处理
        
        'with_http_handler_root' => false,  //下版本再说,是否主目录 index.php
        'with_http_handler_file' => false,  //下版本再说,是否开启资源文件读取
    //*/
    ];
    \WorkermanHttpd\WorkermanHttpd::RunQuickly($options);
    

    浏览器打开 http://127.0.0.1:8080/ ,即可看到效果 ,header 多了一行, 几个超全局变量也能正常使用。

    类解读

    除了主类和 SingletonExTrait 其他类都是无状态的

    ExitException

    中断的异常类。一般不直接用,你需要 WorkermanHttpd::Exit();

    HttpServerForDuckPhp

    封装了 DuckPhp\Http\Server 的类 用于 DuckPhp 工程

    Request

    可变单例请求类, 扩充自 Workerman\Protocols\Http\Request 使用 SingletonExTrait

    可用 Request::G(MyRequest::G()) 替换

    Response

    可变单例请求类, 扩充自 Workerman\Protocols\Http\Response 使用 SingletonExTrait

    可用 Request::G(MyRequest::G()) 替换

    SingletonExTrait

    可变单例类。 和 DuckPhp 的一样效果

    WorkermanHttpd

    主类。主要调用这个。 使用 SingletonExTrait

    静态方法

    RunQuickly($options)

    ​ 快速运行

    WorkermanHttpd::Request() 获得当前 Request 对象。 Response 获得当前 Response 对象。 OnWorkerStart($worker) 事件处理 OnMessage($connection, $request) 消息处理。

    G($object = null)

    ​ 可用 WorkermanHttpd::G(MyWorkermanHttpd::G()) 修改你的实现

    备忘

    php duckphp.php run --override-class=WorkermanHttpd/HttpServerForDuckphp --command start

    其他碎碎念:

    DuckPhp 框架的 workerman 平台(开发中)就是用这个封装,不需要改任何代码就从 fpm 平台跑到 workerman 平台加速了。

    QQ 群: 714610448

    过几天同步到 gitee 平台去。 这段时间的效率很低下,发出来看看能否提高一点效率 workermanhttpd 做了,以前的 swoolehttpd 也要改进适配新版 duckphp 。 性能测试是个 todo 。 然后大活就是后台框架了。 duckphp “把其他工程当成当前工程 composer lib 的” 的模式正在打磨。 到时候做新后台只要 composerrequire 就行了, 而不是现在各种 php 框架从 composer project 开始 而且所有插件真的是都可以不强改第三方代码的情况下各种对第三方代码魔改。

    6 条回复    2021-03-28 20:47:21 +08:00
    PHPJit
        1
    PHPJit  
       2021-03-24 09:01:27 +08:00 via iPhone
    👍
    xiaodim
        2
    xiaodim  
       2021-03-24 09:38:39 +08:00
    xiaochong0302
        3
    xiaochong0302  
       2021-03-24 10:31:16 +08:00
    就冲  duckphp  也回复一下
    ywisax
        4
    ywisax  
       2021-03-28 00:53:21 +08:00
    我也搞过这个事情,后来意识到其实是做了歪路。有个更加好的路可以选:在 workerman 实现一个标准的 psr request / response 的输入输出层。这就足够了,剩余的事情让框架自己去适配和改造。

    大包大揽想解决 fpm/workerman 的兼容问题是不可能的,最终都是要倒逼框架、应用开发者去改造。随便举几个例子:
    1. 全局变量的管理(如微擎很傻缺的 $_W,CI 古老的$_CFG )
    2. 静态变量的管理(如类中的静态变量计数器,我记得 Yii 和 Laravel 都有类似的地方这样做)
    3. 改常驻后,include_once/require_once 的逻辑变化(配置文件等的加载都可能有问题)

    我看你项目都已经用了 workerman4,搞这个不如看看怎么哄下 workerman 作者放弃迷之执念的兼容要求,直接内置个 psr request / response 更加好。。。
    ywisax
        5
    ywisax  
       2021-03-28 01:07:27 +08:00   ❤️ 1
    我错了。已经有了 https://github.com/walkor/psr7 那你再搞一套就没意义了。
    dvaknheo
        6
    dvaknheo  
    OP
       2021-03-28 20:47:21 +08:00
    @ywisax 谢谢
    workerman 4 已经有 request/response,psr 的标准似乎有点问题,各家的 request/response 都没和官方的实现一致
    我这简单封装,没屏蔽 request/response.

    workerman 只是 fork 子进程,没和 swoole 那样搞协程。 所以内存管理要比 swoole 省事得多?
    或者我理解有误么
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2492 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 15:48 · PVG 23:48 · LAX 07:48 · JFK 10:48
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.