搜索
首页php框架ThinkPHPthinkphp5支持swoole携程吗

thinkphp5支持swoole携程吗

Sep 12, 2019 am 11:38 AM
swoolethinkphp5支持

thinkphp5支持swoole携程吗

首先,了解一下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(
    [
        &#39;enable_static_handler&#39; => true,
        &#39;document_root&#39; => "/data/wwwroot/zhibo/public/static",
        &#39;worker_num&#39; => 5,//产生进程的个数
    ]
);
$http->on(&#39;WorkerStart&#39;,function ($ser,$worker_id){
    define(&#39;APP_PATH&#39;, __DIR__ . &#39;/../application/&#39;);
    require __DIR__ . &#39;/../thinkphp/base.php&#39;;
});
$http->on(&#39;request&#39;, 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(&#39;app&#39;, [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中文网其他相关文章!

声明
本文转载于:CSDN。如有侵权,请联系admin@php.cn删除

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

SecLists

SecLists

SecLists是最终安全测试人员的伙伴。它是一个包含各种类型列表的集合,这些列表在安全评估过程中经常使用,都在一个地方。SecLists通过方便地提供安全测试人员可能需要的所有列表,帮助提高安全测试的效率和生产力。列表类型包括用户名、密码、URL、模糊测试有效载荷、敏感数据模式、Web shell等等。测试人员只需将此存储库拉到新的测试机上,他就可以访问到所需的每种类型的列表。

SublimeText3 英文版

SublimeText3 英文版

推荐:为Win版本,支持代码提示!

Atom编辑器mac版下载

Atom编辑器mac版下载

最流行的的开源编辑器

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境