Thinkphp5 集成 Swoole

Swoole简介

Swoole是一个面向生产环境的 PHP 异步网络通信引擎。使 PHP 开发人员可以编写高性能的异步并发 TCP、UDP、Unix Socket、HTTP,WebSocket 服务。

Swoole扩展是按照PHP标准扩展构建的。使用PHPize来生成编译检测脚本,./configure来做编译配置检测,make进行编译,make install进行安装。

Swoole实际上是一个网络通信和异步io的引擎,一个基础库。PHP与外部通信需要借助系统的socket,通常使用的Apache Nginx就是封装了的socket,可以实现并发处理。客户端发送请求到Nginx/apache,再转发到fastcgi端口交给PHP处理;Swoole把系统的socket集成到PHP底层,PHP可以直接通过swoole与客户端交互。也就是说Swoole是个封装了底层socket的网络库,解决异步处理、长连接、并发处理任务等。

Swoole与传统PHP开发的区别

1.PHP的运行模式

PHP有多种运行模式,常见的Fast-CGI,PHP-FPM模式我们归纳为传统的web模式,还有一种模式属于命令行模式:PHP-Cli

2.Swoole开发的程序和传统的PHP程序区别

因为使用swoole拓展的PHP脚本与传统的PHP脚步不同,前者是需要预先在服务端执行的,而后者是每次访问时才会执行。

① 比如你的程序中定义了一个类A,那么在每次有用户访问时,类A都需要提前编译到内存中,1万次访问就要编译1万次。而用swoole拓展则只需要在服务端编译一次,无论多少次访问都不需要再次编译了,只要swoole的进程存在,类A就会一直存在于内存中。

② 比如PHP入门时就必须要掌握的session,对于运用了swoole扩展的PHP程序而言,完全可以用一个变量来替换。

③ 平时写PHP代码,完全不必担心内存使用,全局变量/函数/对象等,可以随便使用,因为PHP脚本执行结束后,内存自然会自行释放掉。但用swoole扩展的PHP程序,则必然要手动注销全局的变量/函数/对象等,这就考验了PHPer的闭包能力等。

ThinkPHP5集成Swoole

think-swoole2.0支持thinkPHP5.0

think-swoole3.0支持thinkPHP6.0

推出的tp6.0,已经适配swoole.并推出think-swoole 3.0,并且认适配了socketio。和2.0版本在使用方法上面有些许不同。

Websocket 继承于Http,进行websocket连接之前需要一次HTTP请求,如果当期地址支持websocket则返回101,然后进行连接。也就是说并不是我的服务支持websocket后,请求每个连接地址都可以进行websocket连接,而是需要预先适配才可以连接,tp提供的组件刚开始不建议使用,等自己写熟悉了后再研究。

01

TP5的运行机制

任何请求都会经过tp5的入口文件,载入框架的配置文件启动进程,然后处理请求。

在这个index.PHP的入口文件中,可以看到,它先定义的APP_PATH这个常量,然后引入的框架的启动文件start.PHP,那我们就去看下start.PHP这个文件做了些什么。

在这里,它先加载了基础文件base.PHP,然后启动框架run,这个时候就开始处理请求了。常规的Nginx,Apache服务器,每次请求来到thinkPHP,会清除静态变量,重新加载配置文件。但是Swoole做的服务器,是常驻进程,在启动服务后,会产生多个进程,来处理请求。我们要让它选择性的加载配置。

02

Swoole来做http服务器

<?PHP
/**
 * Created by PHPStorm.
 * User: 360zhiliangxiaoneng
 * Date: 2019/10/21
 * Time: 15:09
 */

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

$http->set(
    [
        'enable_static_handler' => true,
        'document_root' => "/var/www/thinkPHP_5.0.11/public/static",
        'worker_num' => 5,//产生进程的个数
    ]
);

$http->on('WorkerStart',function (swoole_server $server,$worker_id){
    define('APP_PATH', __DIR__ . '/../application/');
    // 这里 引入 base.PHP  而不引入start.PHP  是因为
    // start.PHP 的话 就会执行thinkPHP 的相应的控制器方法了
    require __DIR__ . '/../thinkPHP/base.PHP';
});


$http->on('request', function($request, $response) use($http) {
    $_SERVER=[];

    if(isset($request->header)){
        foreach ($request->header as $k=>$v){
            $_SERVER[strtoupper($k)] = $v;
        }
    }
    if(isset($request->server)){
        foreach ($request->server 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;
        }
    }
   // print_r($_SERVER);

    //开启缓存
    ob_start();
    try{
        // 执行应用并响应
        //think\Container::get('app', [APP_PATH])->run()->send();
        think\App::run()->send();
    }catch (\Exception $e){

    }
    $res = ob_get_contents();
    ob_end_clean();
    $response->header('Content-Type', 'text/html;charset=utf-8', false);
    $response->end($res);
    //$http->close();
});
$http->start();

  1. $http->onWorkerStart:启动进程的时候,加载thinkPHP的框架文件,base.PHP,但是这个时候,不能run,等待请求来了再去run。

  2. KaTeX parse error: Expected 'EOF', got '&' at position 6: http-&̲gt;onrequest:当收…_SERVER,$_GET等信息,可以适配tp5。

  3. 最后开始run,这个时候需要把run得到的信息加载到缓存,然后再通过send()返回给客户端。

03

Swoole适配thinkPHP5

因为swoole是常驻进程,前一个请求的 P O S T , _POST, POST_GET请求不会销毁,原因这个进程并没有kill,这个时候,需要在接收请求的时候,将 G E T , _GET, GET,_POST置空。swoole路由机制,总会从缓存中获取有没有这个请求,如果有,就不加载新的,所以,swoole常驻内存,会发现一直请求第一个url。除非重启swoole服务器。

在ThinkPHP框架里面,修改Request文件,将两个方法(pathinfo,path)里面的$this->path这个为空的判断去掉,让每次请求都去解析这个url。

更多技术文章

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


学习编程是顺着互联网的发展潮流,是一件好事。新手如何学习编程?其实不难,不过在学习编程之前你得先了解你的目的是什么?这个很重要,因为目的决定你的发展方向、决定你的发展速度。
IT行业是什么工作做什么?IT行业的工作有:产品策划类、页面设计类、前端与移动、开发与测试、营销推广类、数据运营类、运营维护类、游戏相关类等,根据不同的分类下面有细分了不同的岗位。
女生学Java好就业吗?女生适合学Java编程吗?目前有不少女生学习Java开发,但要结合自身的情况,先了解自己适不适合去学习Java,不要盲目的选择不适合自己的Java培训班进行学习。只要肯下功夫钻研,多看、多想、多练
Can’t connect to local MySQL server through socket \'/var/lib/mysql/mysql.sock问题 1.进入mysql路径
oracle基本命令 一、登录操作 1.管理员登录 # 管理员登录 sqlplus / as sysdba 2.普通用户登录
一、背景 因为项目中需要通北京网络,所以需要连vpn,但是服务器有时候会断掉,所以写个shell脚本每五分钟去判断是否连接,于是就有下面的shell脚本。
BETWEEN 操作符选取介于两个值之间的数据范围内的值。这些值可以是数值、文本或者日期。
假如你已经使用过苹果开发者中心上架app,你肯定知道在苹果开发者中心的web界面,无法直接提交ipa文件,而是需要使用第三方工具,将ipa文件上传到构建版本,开...
下面的 SQL 语句指定了两个别名,一个是 name 列的别名,一个是 country 列的别名。**提示:**如果列名称包含空格,要求使用双引号或方括号:
在使用H5混合开发的app打包后,需要将ipa文件上传到appstore进行发布,就需要去苹果开发者中心进行发布。​
+----+--------------+---------------------------+-------+---------+
数组的声明并不是声明一个个单独的变量,比如 number0、number1、...、number99,而是声明一个数组变量,比如 numbers,然后使用 nu...
第一步:到appuploader官网下载辅助工具和iCloud驱动,使用前面创建的AppID登录。
如需删除表中的列,请使用下面的语法(请注意,某些数据库系统不允许这种在数据库表中删除列的方式):
前不久在制作win11pe,制作了一版,1.26GB,太大了,不满意,想再裁剪下,发现这次dism mount正常,commit或discard巨慢,以前都很快...
赛门铁克各个版本概览:https://knowledge.broadcom.com/external/article?legacyId=tech163829
实测Python 3.6.6用pip 21.3.1,再高就报错了,Python 3.10.7用pip 22.3.1是可以的
Broadcom Corporation (博通公司,股票代号AVGO)是全球领先的有线和无线通信半导体公司。其产品实现向家庭、 办公室和移动环境以及在这些环境...
发现个问题,server2016上安装了c4d这些版本,低版本的正常显示窗格,但红色圈出的高版本c4d打开后不显示窗格,
TAT:https://cloud.tencent.com/document/product/1340