项目地址:
https://github.com/dvaknheo/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 其他类都是无状态的
中断的异常类。一般不直接用,你需要 WorkermanHttpd::Exit()
;
封装了 DuckPhp\Http\Server
的类 用于 DuckPhp 工程
可变单例请求类, 扩充自 Workerman\Protocols\Http\Request
使用 SingletonExTrait
可用 Request::G(MyRequest::G()) 替换
可变单例请求类, 扩充自 Workerman\Protocols\Http\Response
使用 SingletonExTrait
可用 Request::G(MyRequest::G()) 替换
可变单例类。 和 DuckPhp 的一样效果
主类。主要调用这个。 使用 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 开始 而且所有插件真的是都可以不强改第三方代码的情况下各种对第三方代码魔改。
1
PHPJit 2021-03-24 09:01:27 +08:00 via iPhone
👍
|
2
xiaodim 2021-03-24 09:38:39 +08:00
赞
|
3
xiaochong0302 2021-03-24 10:31:16 +08:00
就冲 duckphp 也回复一下
|
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 更加好。。。 |
5
ywisax 2021-03-28 01:07:27 +08:00 1
我错了。已经有了 https://github.com/walkor/psr7 那你再搞一套就没意义了。
|