资讯专栏INFORMATION COLUMN

Swoole完美支持ThinkPHP5

XiNGRZ / 1848人阅读

摘要:这里创建的对象可以在进程生命周期内使用目的加载框架中的内容定义应用目录加载基础文件把接收的信息转换为可识别的对于超全局数组不会释放函数输出打印

Swoole完美支持ThinkPHP5 1、首先要开启http的server

可以在thinkphp的目录下创建一个server目录,里面创建一个HTTPServer的php

2、需要在WorkerStart回调事件做两件事

定义应用目录:define("APP_PATH", __DIR__ . "/../application/");

加载基础文件:require __DIR__ . "/../thinkphp/base.php";

3、因为swoole接收get、post参数等和thinkphp中接收不一样,所以需要转换为thinkphp可识别,转换get参数示例如下:
注意点: swoole对于超全局数组:$_SERVER$_GET$_POSTdefine定义的常量等不会释放,所以需要先清空一次
// 先清空
$_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支持thinkphp的http_server示例:
// 面向过程写法

$http = new swoole_http_server("0.0.0.0", 9501);

$http->set([
    // 开启静态资源请求
    "enable_static_handler" => true,
    "document_root" => "/opt/app/live/public/static",
    "worker_num" => 5,
]);

/**
 * WorkerStart事件在Worker进程/Task进程启动时发生。这里创建的对象可以在进程生命周期内使用
 * 目的:加载thinkphp框架中的内容
 */
$http->on("WorkerStart", function (swoole_server $server, $worker_id) {
    // 定义应用目录
    define("APP_PATH", __DIR__ . "/../application/");
    // 加载基础文件
    require __DIR__ . "/../thinkphp/base.php";
});

$http->on("request", function ($request, $response) {

    // 把swoole接收的信息转换为thinkphp可识别的
    $_SERVER = [];
    if (isset($request->server)) {
        foreach ($request->server as $key => $value) {
            $_SERVER[strtoupper($key)] = $value;
        }
    }

    if (isset($request->header)) {
        foreach ($request->header as $key => $value) {
            $_SERVER[strtoupper($key)] = $value;
        }
    }

    // swoole对于超全局数组:$_SERVER、$_GET、$_POST、define不会释放
    $_GET = [];
    if (isset($request->get)) {
        foreach ($request->get as $key => $value) {
            $_GET[$key] = $value;
        }
    }

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

    // ob函数输出打印
    ob_start();
    try {
        thinkContainer::get("app", [APP_PATH]) ->run() ->send();
        $res = ob_get_contents();
        ob_end_clean();
    } catch (Exception $e) {
        // todo
    }

    $response->end($res);
});

$http->start();

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/30809.html

相关文章

  • Swoole完美支持ThinkPHP5

    摘要:这里创建的对象可以在进程生命周期内使用目的加载框架中的内容定义应用目录加载基础文件把接收的信息转换为可识别的对于超全局数组不会释放函数输出打印 Swoole完美支持ThinkPHP5 1、首先要开启http的server 可以在thinkphp的目录下创建一个server目录,里面创建一个HTTPServer的php 2、需要在WorkerStart回调事件做两件事 定义应用目录:d...

    RancherLabs 评论0 收藏0
  • 《当 Swoole 遇上 ThinkPHP5》:Hello,World!

    摘要:安装框架安装如果已经安装了可以跳过本步骤,但是请确定通过命令来确保已经使用了最新版本的使用以下命令可以直接通过官网下载并自动安装到目录下如果以上安装过程极慢的话,可以尝试用以下方式通过国内镜像来安装。 《当 Swoole 遇上 ThinkPHP5》:Hello,World! 本文假设你已经有了 Linux 操作系统的 PHP 环境,强烈推荐使用 Vagrant 来搭建开发环境 安装 ...

    xzavier 评论0 收藏0
  • thinkphp5+swoole实现异步邮件群发(SMTP方式)

    摘要:图中其他两个文件和是邮件发送类的核心文件,为了简化调用,抽取了出来,详细的用法和参数设置,可以参考的使用说明注意点在此步骤中,我们需要注意几点是你设置的邮件发送的账号是否已经开启并且找对对应的安全协议和端口号。 1、环境说明 阿里云centos7thinkphp5.0.11swoole2.0.8 2、tp实现邮件发送 在项目下建立如下的文件目录:showImg(https://segm...

    tuniutech 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<