当前位置: 首页 > 编程笔记 >

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

蓬森
2023-03-14
本文向大家介绍PHP程序员学习使用Swoole的理由,包括了PHP程序员学习使用Swoole的理由的使用技巧和注意事项,需要的朋友参考一下

最近两个月一直在研究 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 接口或读写大文件,传统同步阻塞和协程异步的优势就体现了出来。

说到协程,就得先简单说说进程和线程,众所周知进程是很占用资源的,为了处理请求大量创建进程肯定是得不偿失的。而多线程应用就比较多了,在 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通信框架、名字路由与发现、发布监控、日志统计、配置管理等于一体,通过它可以快速用微服务的方式构建自己的稳定可靠的分布式应用,并实现完整有效的服务治理。

 类似资料:
  • 你现在是不是想学 Java,但又很迷茫,不知从何下手,不知道该从哪里学起,不知道需要学些什么?那么看完这篇文章你会有一种豁然开朗的感觉。 学习 Java 的第一步,就是制定自己的 Java 学习路线。对 Java 主要的重点知识归纳如下: 对于学习 JavaSE 的读者,分为 JavaSE 初级中级和高级水平,下面分别介绍达到这些水平我们需要掌握什么。 JavaSE 初级水平要求掌握计算机入门:D

  • 本文向大家介绍每个程序员都需要学习 JavaScript 的7个理由小结,包括了每个程序员都需要学习 JavaScript 的7个理由小结的使用技巧和注意事项,需要的朋友参考一下 最近在和招聘经理交流现在找一个好的程序员有多难的时候,我渐渐意识到了现在编程语言越来越倾重于JavaScript。Web开发人员尤其如此。所以,如果你是一个程序员,那么你应该去学习JavaScript。 需求 我之所以这

  • 从sklearn加载流行数字数据集。数据集模块,并将其分配给可变数字。 分割数字。将数据分为两组,分别命名为X_train和X_test。还有,分割数字。目标分为两组Y_训练和Y_测试。 提示:使用sklearn中的训练测试分割方法。模型选择;将随机_状态设置为30;并进行分层抽样。使用默认参数,从X_序列集和Y_序列标签构建SVM分类器。将模型命名为svm_clf。 在测试数据集上评估模型的准确

  • PHP语言是一个短生命周期的Web编程语言,很多PHPer已经形成了fpm下编程的思维定势。实际上在Swoole出现之后,这种串行化编程的模式早已被打破。使用Swoole完全可以轻易实现更灵活的并发编程。 场景介绍 假设我们要做一个石头剪刀布的Web游戏,3个玩家同时提交竞猜后显示胜者。在传统串行化Web编程中,我们一般思路是这样: 设置 form 表单,用户提交竞猜后保存到 MySQL/Redi

  • 本文向大家介绍C++ 程序员为什么看不起php程序员,包括了C++ 程序员为什么看不起php程序员的使用技巧和注意事项,需要的朋友参考一下 我觉得C++ 虽然速度快,但是编译起来很复杂,要写各种dependency 才不会导致因编译顺序产生的失败。namespace 的乱用和混用让人摸不着头脑。不同的Cpp可以共用一个h,你都找不到申明在哪里。 PHP就好多了。类似java,文件名就是class

  • 本文向大家介绍MySQL的线程池原理学习教程,包括了MySQL的线程池原理学习教程的使用技巧和注意事项,需要的朋友参考一下 线程池是Mysql5.6的一个核心功能,对于服务器应用而言,无论是web应用服务还是DB服务,高并发请求始终是一个绕不开的话题。当有大量请求并发访问时,一定伴随着资源的不断创建和释放,导致资源利用率低,降低了服务质量。线程池是一种通用的技术,通过预先创建一定数量的线程,当有请

  • 问题内容: 我的大部分编程背景是Java,并且我仍在使用Java进行大多数编程。但是,我开始在工作中的一些辅助项目中学习Python,并且希望尽可能独立于Java背景学习它-即,我不想只用Python编程Java。我应该注意些什么? 一个简单的例子- 浏览Python教程时,我发现一个事实:函数(例如列表)的默认可变参数得以保留(每次调用都记住)。这对我作为Java程序员来说是违反直觉的,并且很难

  • 1.简介 Qt Demo 是 Qt 套件之一,它包含了大量的演示和示例程序,基本涵盖了 Qt 编程中的 主要类别,将它与 Qt Assistant 结合使用能够收到很好的效果。 2.运行 Qt Demo 要运行 Qt Demo,在 Windows 下,如果是可依次单击【开始】→【(所有)程序】→【Qt SDK by Nokia v2009.03(OpenSource)】→【Qt Demo】;在 X