为了账号安全,请及时绑定邮箱和手机立即绑定

Swoole完美支持Think5.1

标签:
ThinkPHP Swoole

1、首先创建一个http_server对象

ThinkPHP目录下创建一个server目录,里面创建一个HTTP Server的php文件

2、需要在WorkerStart回调事件加载ThinkPHP核心文件

define('APP_PATH', __DIR__ . '/../application/');// 定义应用目录
require __DIR__ . '/../thinkphp/base.php'; //加载基础文件

3、转换TP可识别的请求类型

因为swoole接收get、post参数等和TP中接收不一样,所以需要转换为TP可识别,转换get参数示例如下:

$_GET = [];
if (isset($request->get)) {
    foreach ($request->get as $key => $value) {
        $_GET[$key] = $value;
    }
}

4、thinkphp会把模块、控制器、方法放到一个变量里去,所以通过pathinfo模式访问会存在只能访问第一次的pathinfo这个问题,worker进程里是不会注销变量的

解决办法:
thinkphp/library/think/Request.php
function path 中的if (is_null($this->path)) {}注释或删除
function pathinfo中的if (is_null($this->pathinfo)) {}注释或删除
注意:只删除条件,不删除条件中的内容

5、Swoole完美支持TP代码示例:

<?php
$http = new swoole_http_server("0.0.0.0", 8811);
$http->set(
    [
        'enable_static_handler' => true,
        'document_root' => "/home/thinkphp/public/static",
        'worker_num' => 5,
    ]
);
$http->on('WorkerStart', function(swoole_server $server,  $worker_id) {
    // 定义应用目录
    define('APP_PATH', __DIR__ . '/../application/');
    // 加载框架里面的文件
    require __DIR__ . '/../thinkphp/base.php';
    //require __DIR__ . '/../thinkphp/start.php';
});
$http->on('request', function($request, $response) use($http){

    //define('APP_PATH', __DIR__ . '/../application/');
    //require __DIR__ . '/../thinkphp/base.php';
    $_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\Container::get('app', [APP_PATH])
            ->run()
            ->send();
    }catch (\Exception $e) {
        // todo
    }

    //echo "-action-".request()->action().PHP_EOL;
    $res = ob_get_contents();
    ob_end_clean();
    $response->end($res);
    //$http->close();
});

$http->start();

// topthink/think-swoole
点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消