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中通过正则表达式下载内容中的远程图片的函数代码
Jan 10 PHP
解决php使用异步调用获取数据时出现(错误c00ce56e导致此项操作无法完成)
Jul 03 PHP
ThinkPHP基于PHPExcel导入Excel文件的方法
Oct 15 PHP
php源码分析之DZX1.5随机数函数random用法
Jun 17 PHP
php实现微信公众号主动推送消息
Dec 31 PHP
PHP简单获取多个checkbox值的方法
Jun 13 PHP
PHP实现微信JS-SDK接口选择相册及拍照并上传的方法
Dec 05 PHP
php读取和保存base64编码的图片内容
Apr 22 PHP
基于 Swoole 的微信扫码登录功能实现代码
Jan 15 PHP
php 使用mpdf实现指定字段配置字体样式的方法
Jul 29 PHP
php 多继承的几种常见实现方法示例
Nov 18 PHP
关于Yii2框架跑脚本时内存泄漏问题的分析与解决
Dec 01 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
比较discuz和ecshop的截取字符串函数php版
2012/09/03 PHP
ECshop 迁移到 PHP7版本时遇到的兼容性问题
2016/02/15 PHP
php生成0~1随机小数的方法(必看)
2017/04/05 PHP
php文件上传类的分享
2017/07/06 PHP
PHP面向对象程序设计之对象克隆clone和魔术方法__clone()用法分析
2019/06/12 PHP
php使用json-schema模块实现json校验示例
2019/09/28 PHP
PHP发送邮件确认验证注册功能示例【修改别人邮件类】
2019/11/09 PHP
jquery特效 幻灯片效果示例代码
2013/07/16 Javascript
js捕获鼠标滚轮事件代码
2013/12/16 Javascript
jquery制作搜狐快站页面效果示例分享
2014/02/21 Javascript
JavaScript数据结构和算法之二叉树详解
2015/02/11 Javascript
javascript实现显示和隐藏div方法汇总
2015/08/14 Javascript
springMVC结合AjaxForm上传文件
2016/07/12 Javascript
基于原生JS实现图片裁剪
2016/08/01 Javascript
微信小程序tabBar底部导航中文注解api详解
2017/08/16 Javascript
在React 组件中使用Echarts的示例代码
2017/11/08 Javascript
swiper在vue项目中loop循环轮播失效的解决方法
2018/09/15 Javascript
JavaScript实现预览本地上传图片功能完整示例
2019/03/08 Javascript
深入理解JavaScript 箭头函数
2019/05/30 Javascript
LayUI数据接口返回实体封装的例子
2019/09/12 Javascript
JavaScript写个贪吃蛇小游戏(超详细)
2020/03/17 Javascript
在vue中使用cookie记住用户上次选择的实例(本次例子中为下拉框)
2020/09/11 Javascript
python Spyder界面无法打开的解决方法
2018/04/27 Python
django的登录注册系统的示例代码
2018/05/14 Python
python print输出延时,让其立刻输出的方法
2019/01/07 Python
python多线程下信号处理程序示例
2019/05/31 Python
python web框架 django wsgi原理解析
2019/08/20 Python
pytorch之Resize()函数具体使用详解
2020/02/27 Python
Theflamel意大利:女士奢华服装、鞋子和配件
2020/01/11 全球购物
接口中的方法可以是abstract的吗
2015/07/23 面试题
财务会计毕业生自荐信
2013/11/02 职场文书
美德少年事迹材料500字
2014/08/19 职场文书
检察院对照“四风”认真查找问题落实整改措施
2014/09/26 职场文书
医院办公室主任岗位职责
2015/04/01 职场文书
党组织关系的介绍信模板
2019/06/21 职场文书
2019年大学生暑期社会实践调查报告模板
2019/11/07 职场文书