PHP程序员学习使用Swoole的理由


Posted in PHP onJune 24, 2018

最近两个月一直在研究 Swoole,研究成果即将在6.21正式开源发布,这段时间没有来水文章,趁着今天放假来水水吧。
借助这篇文章,我希望能够把 Swoole 安利给更多人。虽然 Swoole 可能目前定位是一些高级 phper 的玩具,让中低级望而生畏,可能对一些应用场景也一脸懵逼,但其实没这么难的。

在 Swoole 官网的自我介绍是“面向生产环境的 PHP 异步网络通信引擎”,首先 Swoole 它是一个网络应用的开发工具,它支持 Http、TCP、UDP、WebSocket。

Swoole 和我们传统的 PHP 开发差别是有的,需要理解的概念也是有的。使用目前一些基于 Swoole 的框架开发的话,从开发习惯上和传统的TP、LV 框架相差不多。

那为什么要使用 Swoole?

宇润认为有以下几点:

常驻内存,避免重复加载带来的性能损耗,提升海量性能

协程异步,提高对 I/O 密集型场景并发处理能力(如:微信开发、支付、登录等)

方便地开发 Http、WebSocket、TCP、UDP 等应用,可以与硬件通信

PHP 高性能微服务架构成为现实

常驻内存

目前传统 PHP框架,在处理每个请求之前,都要做一遍加载框架文件、配置的操作。这可能已经成为性能问题的一大原因,而使用 Swoole 则没有这个问题,一次加载多次使用。

协程

如下图所示,这是同一个线程处理并发请求的场景,比如你某个接口中需要调用其它 api 接口或读写大文件,传统同步阻塞和协程异步的优势就体现了出来。

PHP程序员学习使用Swoole的理由

说到协程,就得先简单说说进程和线程,众所周知进程是很占用资源的,为了处理请求大量创建进程肯定是得不偿失的。而多线程应用就比较多了,在 CPU 层面有几个核心就会执行几个任务,线程一旦创建的多了,就会有线程调度的损耗。

协程是在单线程基础上实现的,它可以最大限度利用 CPU 资源,而不会在等待 I/O 时白白浪费。当然,协程数越多占用的内存也就越多,不过这个是可以接受的,相比进程和线程,占用的资源是相对较少的。

使用协程时,遇到读写文件、请求接口等场景,会自动挂起协程,把 CPU 让给其它协程执行任务,这样可以提升单线程的 CPU 资源利用率,减少浪费,从而提高性能。

协程代码示例:

<?php
use Swoole\Coroutine as co;
 
// 协程
$time = microtime(true);
// 创建10个协程
for($i = 0; $i < 10; ++$i)
{
 // 创建协程
 go(function() use($i){
  co::sleep(1.0); // 模拟请求接口、读写文件等I/O
  echo $i, PHP_EOL;
 });
}
swoole_event_wait();
echo 'co time:', microtime(true) - $time, ' s', PHP_EOL;
 
// 同步
$time = microtime(true);
// 创建10个协程
for($i = 0; $i < 10; ++$i)
{
 sleep(1); // 模拟请求接口、读写文件等I/O
 echo $i, PHP_EOL;
}
echo 'sync time:', microtime(true) - $time, ' s', PHP_EOL;

运行结果:

0
9
8
7
6
5
4
3
2
1
co time:1.0087130069733 s
0
1
2
3
4
5
6
7
8
9
sync time:10.010055065155 s

从上面结果可以看出,协程方式执行并不是顺序的,性能更高,在sleep时会把当前线程的任务执行权交给其他协程。

创建 Http 服务

其实也没想象中的难,看代码:

$http = new swoole_http_server("127.0.0.1", 9501);
$http->on('request', function ($request, $response) {
 $response->end("<h1>Hello Swoole. #".rand(1000, 9999)."</h1>");
});
$http->start();

微服务

Tars是腾讯从2008年到今天一直在使用的后台逻辑层的统一应用框架TAF(Total Application Framework),目前支持C++,Java,PHP,Nodejs语言。该框架为用户提供了涉及到开发、运维、以及测试的一整套解决方案,帮助一个产品或者服务快速开发、部署、测试、上线。 它集可扩展协议编解码、高性能RPC通信框架、名字路由与发现、发布监控、日志统计、配置管理等于一体,通过它可以快速用微服务的方式构建自己的稳定可靠的分布式应用,并实现完整有效的服务治理。

PHP 相关文章推荐
php MsSql server时遇到的中文编码问题
Jun 11 PHP
php 将excel导入mysql
Nov 09 PHP
浅析Dos下运行php.exe,出现没有找到php_mbstring.dll 错误的解决方法
Jun 29 PHP
5种PHP创建数组的实例代码分享
Jan 17 PHP
PHP图片裁剪函数(保持图像不变形)
May 04 PHP
PHP生成迅雷、快车、旋风等软件的下载链接代码实例
May 12 PHP
PHP之正则表达式捕获组与非捕获组(详解)
Jul 29 PHP
php过滤所有的空白字符(空格、全角空格、换行等)
Oct 27 PHP
YII Framework框架教程之国际化实现方法
Mar 14 PHP
php中使用GD库做验证码
Mar 31 PHP
PHP实现登录搜狐广告获取广告联盟数据的方法【附demo源码】
Oct 14 PHP
关于Anemometer图形化显示MySQL慢日志的工具搭建及使用的详细介绍
Jul 13 PHP
PHP实现的装箱算法示例
Jun 23 #PHP
PHP基于curl模拟post提交json数据示例
Jun 22 #PHP
PHP获取日期对应星期、一周日期、星期开始与结束日期的方法
Jun 22 #PHP
PHP实现将base64编码字符串转换成图片示例
Jun 22 #PHP
PHP实现正则匹配所有括号中的内容
Jun 22 #PHP
PHP实现 APP端微信支付功能
Jun 22 #PHP
thinkPHP实现基于ajax的评论回复功能
Jun 22 #PHP
You might like
php feof用来识别文件末尾字符的方法
2010/08/01 PHP
PHP面向对象三大特点学习(充分理解抽象、封装、继承、多态)
2012/05/07 PHP
php的ZipArchive类用法实例
2014/10/20 PHP
PHP中使用循环实现的金字塔图形
2014/11/08 PHP
Yii框架弹出窗口组件CJuiDialog用法分析
2017/01/07 PHP
PHP下载远程图片的几种方法总结
2017/04/07 PHP
详解thinkphp5+swoole实现异步邮件群发(SMTP方式)
2017/10/13 PHP
javascript 二进制运算技巧解析
2012/11/27 Javascript
动态加载JS文件的三种方法
2013/11/08 Javascript
js将字符串转成正则表达式的实现方法
2013/11/13 Javascript
JavaScript中伪协议 javascript:使用探讨
2014/07/18 Javascript
javascript省市级联功能实现方法实例详解
2015/10/20 Javascript
node.js express安装及示例网站搭建方法(分享)
2016/08/22 Javascript
微信小程序 wx.request(OBJECT)发起请求详解
2016/10/13 Javascript
javascript self对象使用详解
2016/10/18 Javascript
jQuery将表单序列化成一个Object对象的实例
2016/11/29 Javascript
树结构之JavaScript
2017/01/24 Javascript
微信小程序开发之好友列表字母列表跳转对应位置
2017/09/26 Javascript
vue动态添加路由addRoutes之不能将动态路由存入缓存的解决
2019/02/19 Javascript
基于Echarts图表在div动态切换时不显示的解决方式
2020/07/20 Javascript
Vant+postcss-pxtorem 实现浏览器适配功能
2021/02/05 Javascript
Python中return语句用法实例分析
2015/08/04 Python
Django 实现图片上传和显示过程详解
2019/07/18 Python
简单了解pytest测试框架setup和tearDown
2020/04/14 Python
Web前端绘制0.5像素的几种方法
2017/08/11 HTML / CSS
CSS3 中filter(滤镜)属性使用详解
2020/04/07 HTML / CSS
html+css3实现的登录界面
2020/12/09 HTML / CSS
html5自带表单验证体验优化及提示气泡修改功能
2017/09/12 HTML / CSS
Html5+CSS3+EL表达式问题小结
2020/12/19 HTML / CSS
Janie and Jack美国官网:GAP旗下的高档童装品牌
2019/09/09 全球购物
卫校中专生的自我评价
2014/01/15 职场文书
社区党员公开承诺书
2014/08/30 职场文书
如何利用Python实现n*n螺旋矩阵
2022/01/18 Python
mysql 生成连续日期及变量赋值
2022/03/20 MySQL
「魔导具师妲莉亚永不妥协~从今天开始的自由职人生活~」1、2卷发售宣传CM公开
2022/03/21 日漫
Oracle中DBLink的详细介绍
2022/04/29 Oracle