Workerman 简单 Web 服务器 WorkermanHttpd 发布

2021-03-23 20:01:39 +08:00
 dvaknheo

项目地址:

https://github.com/dvaknheo/workermanhttpd

WorkermanHttpd 是什么

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

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

比如原先代码里有 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 开始 而且所有插件真的是都可以不强改第三方代码的情况下各种对第三方代码魔改。

2426 次点击
所在节点    PHP
6 条回复
PHPJit
2021-03-24 09:01:27 +08:00
👍
xiaodim
2021-03-24 09:38:39 +08:00
xiaochong0302
2021-03-24 10:31:16 +08:00
就冲  duckphp  也回复一下
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
2021-03-28 01:07:27 +08:00
我错了。已经有了 https://github.com/walkor/psr7 那你再搞一套就没意义了。
dvaknheo
2021-03-28 20:47:21 +08:00
@ywisax 谢谢
workerman 4 已经有 request/response,psr 的标准似乎有点问题,各家的 request/response 都没和官方的实现一致
我这简单封装,没屏蔽 request/response.

workerman 只是 fork 子进程,没和 swoole 那样搞协程。 所以内存管理要比 swoole 省事得多?
或者我理解有误么

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/764395

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX