zoukankan      html  css  js  c++  java
  • Swoole 结合TP5创建http服务

    下载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=模块/控制器/方法?参数  使用这种方法可以解决
  • 相关阅读:
    书籍下载点
    总结一下散乱的开发点滴(3) (高手勿入)
    [收藏]Dynamic Controls in ASP.NET
    [收藏] ORACLE中函数
    面试题收集,面试和被面试中煎熬~~
    一句SQL得出表中重复的数据(TMP)
    总结一下散乱的开发点滴(4) (高手勿入)
    一个同步的例子
    关于学习的反思(下)系网开发记(4)
    关于学习的反思(上)系网开发记(2)
  • 原文地址:https://www.cnblogs.com/xiaoliwang/p/9282674.html
Copyright © 2011-2022 走看看