TP5.1+原生swoole完美整合,解决常见问题

Posted buinar

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了TP5.1+原生swoole完美整合,解决常见问题相关的知识,希望对你有一定的参考价值。

1. 在tp框架根目录下建立server\http_server.php文件

<?php

use Swoole\Http\Server as HttpServer;

$http = new HttpServer("127.0.0.1", 8811);

$http->set([
    'worker_num' => 5,
    'enable_static_handler' => true,
    'document_root' => '/home/buinar/www/swoole/livematches/public/static',
    //document_root目录下要放一个ico图标,为了防止浏览器请求ico图标时走下面的流程
    'log_level' => SWOOLE_LOG_ERROR, // 日志等级 关闭开启debug
    'trace_flags' => SWOOLE_TRACE_SERVER, // 日志等级 关闭开启debug
    
]);

$http->on('WorkerStart',function($server, $worker_id){
    // 定义应用目录
    define('APP_PATH', __DIR__ . '/../application/');
    //加载框架引导文件
    require __DIR__ . '/../thinkphp/base.php';
});

$http->on('request', function ($request, $response) use($http){
    $_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) {
        echo $e->getMessage();
    }
    $res = ob_get_clean();
    // var_dump($res);
    $response->end($res);
    // $http->close($response->fd);  //关闭客户端连接,重新加载框架内容
});
$http->start();

2. 找到thinkphp/library/think/Request.php文件

function path 中的if (is_null($this->path)) {},这里不需要判断,只注释条件即可,里面的内容不动

function pathinfo中的if (is_null($this->pathinfo)) {},这里不需要判断,只注释条件即可,里面的内容不动

结尾:常见问题

1.报错:Fatal error: Uncaught think\exception\ErrorException: ob_end_clean(): failed to delete buffer.
加载框架不成功,检查自己是否写正确

2.echo会默认输出两次
这是因为document_root目录下没有ico文件,浏览器自动请求的,上面有解决方案

thinkphp5.1以上官方已经整合swoole了,建议用tp官网整合的swoole。

以上是关于TP5.1+原生swoole完美整合,解决常见问题的主要内容,如果未能解决你的问题,请参考以下文章

laravel 整合 swoole ,并简单 ab 测试对比性能以及在 PHPstorm 中利用debug调试配置swoole服务中的PHP代码

Elasticsearch学习 spring boot整合Elasticsearch的原生方式

Swoole 4.1.0 正式版发布,支持原生 Redis/PDO/MySQLi 协程化

TP5.1解决跨域

关于微信小程序原生组件与uniApp混合开发过程遇到的问题与解决方式

Swoole MySQL 连接池的实现