如果说数组是 PHP 的精髓,数组玩得不6的,根本不能算是会用PHP。那协程对于 Swoole 也是同理,不理解协程去用 Swoole,那就是在瞎用。

首先,Swoole 只能运行在命令行(Cli)模式下,所以我们开发调试都是使用命令行,而不是 php-fpm/apache 等。

在 Swoole 中,我们可以使用`\Swoole\Coroutine::create()`创建协程,或者你也可以使用简写`go()`。

初识 Swoole 协程

go(function(){

    go(function(){

        echo 0, PHP_EOL;

    });

    echo 1, PHP_EOL;

});

go(function(){

    echo 2, PHP_EOL;

});

go(function(){

    echo 3, PHP_EOL;

});

执行结果:

0

1

2

3

Swoole 协程与同步模式比较

我们一直在说 Swoole 协程适合用于 I/O 密集场景,在同样的硬件配置环境下,它会比传统的同步模式承载更多的访问量。

我们熟悉的文件读写、网络通讯请求(MySQL、Redis、Http等)都是属于 I/O 密集型场景。

假设一次 SQL 查询为 100ms,在传统同步模式下,当前进程在这 100ms 的时间里,是不能做其它操作的。如果要执行十次这个 SQL,可能需要耗费 1s 以上。

而如果用协程,虽然不同协程之间也是按顺序执行,但是在前一个等待 100ms 期间,底层会调度 CPU,去执行其它协程的操作。也就是说,可能第一个查询还没返回结果,其它几个查询就已经发送给了 MySQL 并正在执行中了。如果开启十个协程,分别执行这个 SQL,可能只需要耗费 100+ms 即可完成。

测试代码如下:

Swoole\Runtime::enableCoroutine(); // 开启一键协程化

function work()

{

    $pdo = new \PDO('mysql:host=127.0.0.1;dbname=db_test', 'root', 'root');

    $pdo->exec('select SLEEP(0.1)'); // 模拟sql需要执行 100ms 的情况

}

$time = microtime(true);

for($i = 0; $i < 10; ++$i)

{

    work();

}

echo 'time: ', (microtime(true) - $time), 's', PHP_EOL;

$time = microtime(true);

for($i = 0; $i < 10; ++$i)

{

    go('work');

}

swoole_event_wait(); // 等待所有协程执行完

echo 'time: ', (microtime(true) - $time), 's', PHP_EOL;

执行结果:

time: 1.0326268672943s

time: 0.10734605789185s

上面的代码可以假想为,单进程处理 10 个请求所需的时间。每个请求需要执行一次耗费 100ms 的 SQL 语句。

同步模式,耗费 1s 左右的是 fpm。可以看出,在等待 100ms 期间是不能做任何事情的。

协程模型,耗费 0.1s 左右的是 Swoole。在等待 100ms 期间会挂起当前协程,底层调度会让 CPU 去执行其它协程的操作。

以上就是Swoole协程与传统fpm同步模式比较的详细内容

以上内容希望帮助到大家,很多PHPer在进阶的时候总会遇到一些问题和瓶颈,业务代码写多了没有方向感,不知道该从那里入手去提升,对此我整理了一些资料,包括但不限于:分布式架构、高可扩展、高性能、高并发、服务器性能调优、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql优化、shell脚本、Docker、微服务、Nginx等多个知识点高级进阶干货需要的可以免费分享给大家,需要的可以加入我的官方群点击此处

推荐阅读:

八重樱:Swoole协程与Go协程的区别,很详细,很牛逼​

Swoole协程与传统fpm同步模式比较的更多相关文章

  1. [Sw] Swoole-4.2.9 可以尝试愉快应用 Swoole 协程

    大家知道 Swoole 提供了方便于服务器.网络编程的模式,简化了多进程编程. 这直接让 PHP 的运行很容易变成常驻内存的 Server 程序,执行效率上有了数倍的提升. 但是这一切还没有让人足够兴 ...

  2. Swoole 协程 MySQL 客户端与异步回调 MySQL 客户端的对比

    Swoole 协程 MySql 客户端与 异步回调 MySql 客户端的对比 为什么要对比这两种不同模式的客户端? 异步 MySQL 回调客户端是虽然在 Swoole 1.8.6 版本就已经发布了, ...

  3. swoole| swoole 协程初体验 转

    swoole| swoole 协程初体验   date: 2018-5-30 14:31:38title: swoole| swoole 协程初体验description: 通过协程的执行初窥 swo ...

  4. Swoole 协程与 Go 协程的区别

    Swoole 协程与 Go 协程的区别 进程.线程.协程的概念 进程是什么? 进程就是应用程序的启动实例. 例如:打开一个软件,就是开启了一个进程. 进程拥有代码和打开的文件资源,数据资源,独立的内存 ...

  5. swoole 协程介绍

    协程的执行顺序: 1 2 3 4 5 6 7 8 9 go(function () {     echo "hello go1 \n"; });   echo "hell ...

  6. swoole协程通道channel

    swoole 协程通道 为了协程直接互相通讯传递数据 和go的通道很相似 Co\run(function(){ $chan = new Swoole\Coroutine\Channel(1); Swo ...

  7. Swoole 中使用 TCP 异步服务器、TCP 协程服务器、TCP 同步客户端、TCP 协程客户端

    TCP 异步风格服务器 异步风格服务器通过监听事件的方式来编写程序.当对应的事件发生时底层会主动回调指定的函数. 由于默认开启协程化,在回调函数内部会自动创建协程,遇到 IO 会产生协程调度,异步风格 ...

  8. Zend 官方框架增加 Swoole 协程支持 !

    前言 Zend Framework 是 PHP 的官方框架,随着 Zend-Expressive-Swoole 0.2.2 的发布,率先支持了 Swoole 4 的协程功能,现在可以仅通过一个配置即可 ...

  9. [Swoole入门到进阶] [公开课] Swoole协程-Swoole4.4.4 提供 WaitGroup 功能

    在 Swoole4 中可以使用 channel 实现协程间的通信.依赖管理.协程同步. 简单来说,WaitGroup 就是使用 channel 的机制,让主协程等待所有子协程结束后才退出的功能. Co ...

随机推荐

  1. .NET Core 3.0 使用Nswag生成Api文档和客户端代码

    摘要 在前后端分离.Restful API盛行的年代,完美的接口文档,成了交流的纽带.在项目中引入Swagger (也称为OpenAPI),是种不错的选择,它可以让接口数据可视化.下文将会演示 利用N ...

  2. SpringBoot+Vue+WebSocket 实现在线聊天

    一.前言 本文将基于 SpringBoot + Vue + WebSocket 实现一个简单的在线聊天功能 页面如下: 在线体验地址:http://www.zhengqingya.com:8101 二 ...

  3. Jeewx-Boot 1.1 版本发布,基于SpringBoot的开源微信管家系统

    项目介绍 JeewxBoot是一款基于SpringBoot的开源微信管家系统,采用SpringBoot2.1.3 + Mybatis + Velocity 框架技术.支持微信公众号.微信第三方平台(扫 ...

  4. 修改python3导致终端打不开

    误操作将/usr/bin/python3文件修改,或者删除,导致终端打不开, 解决办法其实很简单,ctrl+alt+f3进入命令窗口,将python2.7的文件拷贝到python中就可以解决了 sud ...

  5. 一招教你如何修复MySQL slave中继日志损坏问题

    [摘要]MySQL的Crash safe slave是指slave crash后,把slave重新拉起来可以继续从Master进行复制,不会出现复制错误也不会出现数据不一致. PS:华为云数据库特惠专 ...

  6. VLAN应用实例

    VLAN 此次内容主要介绍VLAN的Access接口.Trunk接口.Hybird接口的配置实例,以及实际应用. 一.介绍三种接口 1.Access接口 (1)Access接口是交换机上用来连接用户主 ...

  7. Thymeleaf语法

    Thymeleaf 官网:https://www.thymeleaf.org/ 1.入门示例 (1)在controller编写一个请求,放进去一些数据: @RequestMapping("/ ...

  8. JSP + Session Cookie详解

    篇幅较大,对JSP进行了非常详细的讲解,并解释了Session和Cookie的实现原理 ,预计看完需要20分钟左右,慢慢享受吧 JSP概述 掌握了servlet后,就可以利用servlet来开发动态页 ...

  9. iOS设计模式之:建造者模式Builder Pattern,用于改进初始化参数

    转自:http://www.cnblogs.com/wengzilin/p/4365855.html 本文主要讨论一下iOS中的Builder Pattern.与网上很多版本不同,本文不去长篇大论地解 ...

  10. 通过Centreon监控apache、MySQL、Hadoop服务状态

    在上面的章节中,只是简单介绍了Centreon的几个基础监控项,例如添加主机.服务等,这些对于一个监控系统来说是远远不够的,本节将重点介绍对一些扩展服务的监控,也就是对一些常见应用的监控. 一. Na ...