upscale / swoole-reflection
Swoole web-server 的反射 API
3.1.0
2023-06-12 19:37 UTC
Requires
- php: >=8.0
- upscale/ext-openswoole: ^4.8||^22.0
- upscale/ext-swoole: ^5.0
Requires (Dev)
- ext-curl: *
- phpunit/phpunit: ^9.5
- upscale/swoole-launchpad: ^2.0
README
此库为 Swoole / Open Swoole web-server 的类提供 Reflection API。
特性
- 服务器中间件操作
- 响应生命周期跟踪
安装
该库应通过 Composer 作为依赖项安装
composer require upscale/swoole-reflection
用法
中间件操作
可选地覆盖服务器中间件,并重新使用原始回调
$server = new \Swoole\Http\Server('127.0.0.1', 8080); $server->on('request', function ($request, $response) { $response->end("Served by Swoole server\n"); }); $reflection = new \Upscale\Swoole\Reflection\Http\Server($server); $middleware = $reflection->getMiddleware(); $reflection->setMiddleware(function ($request, $response) use ($middleware) { $response->header('Content-Type', 'text/plain'); $middleware($request, $response); }); $server->start();
响应生命周期
头部跟踪
在发送之前修改响应头部
$server->on('request', function ($request, $response) { $callback = function () use ($request, $response) { $response->header('Content-Type', 'text/plain'); }; $response = new \Upscale\Swoole\Reflection\Http\Response\Observable($response); $response->onHeadersSentBefore($callback); $response->end("Served by Swoole server\n"); });
在第一次调用 \Swoole\Http\Response::write/end/sendfile()
时,回调将在每个请求上被调用。
警告!需要修改响应的回调必须使用原始响应而不是其可观察代理。依赖于可观察代理会在代理及其内部注册的回调之间创建循环引用。涉及孤立的循环交叉引用的实例将不会被销毁,直到下一次垃圾回收周期。Swoole 在请求完成时调用响应析构函数中的 \Swoole\Http\Response::end()
。如果响应析构函数没有被调用,则工作进程将挂起而不会发送响应。
拦截体
在发送之前修改响应体
$server->on('request', function ($request, $response) use ($server) { $response = new \Upscale\Swoole\Reflection\Http\Response\Observable($response); $response->onBodyAppend(function (&$content) use ($server) { $content .= "<!-- Served by worker {$server->worker_id} -->\n"; }); $response->header('Content-Type', 'text/html'); $response->end("Served by <b>Swoole server</b>\n"); });
在每次调用 \Swoole\Http\Response::write/end()
并带有非空内容时,都会调用回调。
贡献
欢迎提交包含修复和改进的拉取请求!
许可证
版权所有 © Upscale Software。保留所有权利。
根据Apache 许可证 2.0 版本授权。