• 技术文章 >php框架 >ThinkPHP

    thinkphp5支持swoole携程吗

    VV2019-09-12 11:38:26转载42

    首先,了解一下ThinkPHP的运行机制。

    TP5运行机制

    任何请求都会经过tp5的入口文件,载入框架的配置文件,启动进程,然后处理请求。

    TP5运行机制.png

    在这个index.php的入口文件中,可以看到,它先定义的APP_PATH这个常量,然后引入的框架的启动文件start.php,那我们就去看下start.php这个文件做了些什么。

    TP5运行机制-1.png

    在这里,它先加载了基础文件base.php,然后启动框架run,这个时候就开始处理请求了。

    常规的nginx,Apache服务器,每次请求来到thinkphp,会清除静态变量,重新加载配置文件。但是,swoole做的服务器,是常驻进程,在启动服务后,会产生多个进程,来处理请求。我们要让它选择性的加载配置。

    Swoole来做http服务器

    <?php
    $http = new swoole_http_server("0.0.0.0", 8888);
    
    $http->set(
        [
            'enable_static_handler' => true,
            'document_root' => "/data/wwwroot/zhibo/public/static",
            'worker_num' => 5,//产生进程的个数
        ]
    );
    $http->on('WorkerStart',function ($ser,$worker_id){
        define('APP_PATH', __DIR__ . '/../application/');
        require __DIR__ . '/../thinkphp/base.php';
    });
    $http->on('request', function($request, $response) use($http) {
        if(isset($request->header)){
            foreach ($request->header as $k=>$v){
                $_SERVER[strtoupper($k)] = $v;
            }
        }
        if(isset($request->server)){
            foreach ($request->server as $k=>$v){
                $_HEADER[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\Container::get('app', [APP_PATH])->run()->send();
        }catch (\Exception $e){
    
        }
        $res = ob_get_contents();
        ob_end_clean();
        $response->end($res);
        //$http->close();
    });
    $http->start();

    代码说明

    (1)$http->onWorkerStart:启动进程的时候,加载thinkphp的框架文件,base.php,但是这个时候,不能run,等待请求来了再去run。

    (2)$http->onrequest:当收到客户端的请求时,把swoole的header头信息,server信息,get数据,post数据等消息转化为常规的$_SERVER,$_GET等信息,可以适配tp5。

    (3)最后开始run,这个时候需要把run得到的信息加载到缓存,然后再通过send()返回给客户端。

    Swoole适配thinkphp5

    因为swoole是常驻进程,前一个请求的$_POST,$_GET请求不会销毁,原因这个进程并没有kill,这个时候,需要在接收请求的时候,将$_GET,$_POST置空。

    swoole路由机制,总会从缓存中获取有没有这个请求,如果有,就不加载新的,所以,swoole常驻内存,会发现一直请求第一个url。除非重启swoole服务器。

    TP5运行机制-2.png

    在thinkphp框架里面,修改Request文件,将两个方法(pathinfo,path)里面的$this->path这个为空的判断去掉,让每次请求都去解析这个url。

    验证结果

    TP5运行机制-3.png

    TP5运行机制-4.png

    以上内容仅供参考!

    想了解更多相关内容请访问php中文网:thinkphp教程

    以上就是thinkphp5支持swoole携程吗的详细内容,更多请关注php中文网其它相关文章!

    phpstudy集成环境下载
    本文转载于:CSDN,如有侵犯,请联系a@php.cn删除
    专题推荐:thinkphp5 swoole 支持
    上一篇:ThinkPHP5-使用 think-API 部署 JWT 下一篇:thinkphp5支持oracle吗

    相关文章推荐

    • php为什么要用swoole?• swoole事件处理流程• thinkphp 6.0 swoole扩展websocket使用教程• Swoole在PHP-fpm/apache中使用task功能

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网