总结
豆包 AI 助手文章总结
首页 > php框架 > ThinkPHP > 正文

thinkphp5支持swoole携程吗

王林
发布: 2019-09-12 11:38:26
转载
3597人浏览过

thinkphp5支持swoole携程吗

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

TP5运行机制

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

TP5运行机制.png

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

立即学习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中文网其它相关文章!

携程旅行
携程旅行

携程旅行是一款能够帮助用户在假期出门旅行的旅行用app,也可以帮助用户出差订酒店和机票,还可以给用户提供旅行攻略,用户也可以在里面查询目的地附近的美食和人文。有需要的小伙伴快来保存下载体验吧!

下载
来源:CSDN网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
豆包 AI 助手文章总结
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号