swoole与tp5

最后更新于:2022-04-02 02:20:54

[TOC] ## 创建http.php 在导入 tp框架的时候有两种方式 1. 放在 `WorkStart` 中, 优点:只需要载入一次框架,速度快 缺点:由于 tp5duiswoole 支持不好,所以需要更改一些 tp5 的源码 2. 把 `define` 和 `require`直接在放在`request`的请求中 ``` define('APP_PATH', __DIR__ . '/../application/'); //// 加载基础文件 require __DIR__ . '/../thinkphp/base.php'; ``` 优点:不需要更改 tp5 的源码,但是在 task任务中无法通过命名空间加载类 缺点:速度稍微慢与 `WorkStart` 在根目录下创建 `server/http.php` ``` $http = new swoole_http_server('0.0.0.0', 8811); $http->set([ 'document_root' => '/Users/idcpj/Web/swoole/thinkphp/public/static', //静态文件存放路径 'enable_static_handler' => true, ]); $http->on('WorkerStart', function (swoole_server $server){ define('APP_PATH', __DIR__ . '/../application/'); //// 加载基础文件 require __DIR__ . '/../thinkphp/base.php'; }); //在 request 中执行代码 $http->on('request', function ($request, $response) use ($http){ //把值赋值给$_SERVER,$_GET,$_POST 方便tp5快加执行 $_SERVER=[]; if (isset($request->server)) { foreach ($request->server as $k => $v) { $_SERVER[strtoupper($k)] = $v; } } if (isset($request->header)) { foreach ($request->header as $k => $v) { $_SERVER[strtoupper($k)] = $v; } } $_GET=[]; if (isset($request->get)) { foreach ($request->get as $k => $v) { $_GET[$k] = $v; } } $_POST=[]; if (isset($request->post)) { foreach ($request->post as $k => $v) { $_POST[$k] = $v; } } ob_start();//开启缓存 try{ think\App::run()->send(); } catch (Exception $e){ //todo } $res = ob_get_contents();//获取缓存的内容 ob_end_clean(); //发送给浏览器 $response->end($res); //$http->close(); }); $http->start(); ``` 由于 tp 的问题,此代码只有第一次访问的路径会成功,之后改变路径,都指向第一次访问的路径,只是由于 `onWorkerStart` 已经提前加载了 tp 代码导致,所以需要对tp 框架做调整 在`thinkphp/thinkphp/library/think/Request.php`中是注释代码 1. 在`path` 方法中 ```php //if (is_null($this->path)) { $suffix = Config::get('url_html_suffix'); $pathinfo = $this->pathinfo(); //} ``` 2. 在`pathinfo`方法中 ``` //if (is_null($this->pathinfo)) { code } ``` 此时访问连接可以正常找到对应的控制器和方法 但是此时连接必须是`/?s=index/index/demo`形式
';