首页> 实战笔录 >PHP开发笔记 >ThinkPHP ThinkPHP

Swoole 结合TP5创建http服务

作者:小萝卜 2019-11-21 浏览 1339

简介因为进程会常驻在内存中,所以在一次请求结束后相关的信息不会被销毁,导致请求路径发生变化时程序仍定位到前一次请求的方法,原因:是因为TP框架在Request类中对pathinfo进行判断,如果已存在则不再从$_SERVER中读取,解决方案:在/thinkphp/library/think/Request.php pathinfo方法和path方法中修改判断条件,使得每次请求都重新加载pathinfo

下载TP5框架,在项目根目录下创建server目录

http_service.php

<?php
//创建服务
$http = new swoole_http_server("0.0.0.0", 8811);
//设置参数
$http->set( 
    [
        'enable_static_handler' => true,    //开启静态资源目录
        'document_root' => "/home/work/hdtocs/swoole_mooc/thinkphp/public/static",  //设置静态资源目录
        'worker_num' => 4,  //开启进程数
    ]
);
//WorkerStart事件监听进程启动 
//进程启动时发生,这里创建的对象可以在进程生命周期内使用
//在进程启动时加载ThinkPHP框架,启动程序放在request回调中
$http->on('WorkerStart', function(swoole_server $server,  $worker_id) {
    // 定义应用目录
    define('APP_PATH', __DIR__ . '/../application/');
    // 加载框架里面的文件
    require __DIR__ . '/../thinkphp/base.php';
});
//监听用户请求
//ThinkPHP Request对象是从PHP系统超全局数组 $_SERVER/$_GET/$_POST/$_SESSION 中获取访问信息,所以需要对这些数组进行初始化
//因为进程会常驻在内存中,所以在一次请求结束后相关的信息不会被销毁,因此需要在赋值手动清空
$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;
        }
    }

    $_COOKIE = [];
    if(isset($request->cookie)) {
        foreach($request->cookie as $k => $v) {
            $_COOKIE[$k] = $v;
        }
    }
    //开启ob
    ob_start();
    // 执行应用并响应
    try {
        thinkContainer::get('app', [APP_PATH])
            ->run()
            ->send();
    }catch (Exception $e) {
        // todo
    }
    //从ob中读取数据返回给客户端
    $res = ob_get_contents();
    ob_end_clean();
    $response->end($res);
});

$http->start();
因为进程会常驻在内存中,所以在一次请求结束后相关的信息不会被销毁,导致请求路径发生变化时程序仍定位到前一次请求的方法,
原因:是因为TP框架在Request类中对pathinfo进行判断,如果已存在则不再从$_SERVER中读取
解决方案:在/thinkphp/library/think/Request.php  pathinfo方法和path方法中修改判断条件,使得每次请求都重新加载pathinfo

在请求时使用 域名:端口/模块/控制器/方法?参数  的方法访问时无法定位模块
域名:端口/?s=模块/控制器/方法?参数  使用这种方法可以解决

很赞哦! (0)

文章评论

    高端网站建设