当前位置: 首页 > 后端技术 > PHP

【雨润日报狂测-007】Swoole协程与传统fpm同步方式的对比

时间:2023-03-29 14:14:21 PHP

如果说数组是PHP的精髓,6级还不会玩数组,那根本不算懂PHP.Swoole的协程也是一样的。如果不了解协程来使用Swoole,那是在盲目使用。首先,Swoole只能运行在命令行(Cli)模式下,所以我们使用命令行进行开发调试,而不是php-fpm/apache等。在Swoole中,我们可以使用\Swoole\Coroutine::create()来创建一个协程,或者你也可以使用简写go()。认识Swoole协程go(function(){go(function(){echo0,PHP_EOL;});echo1,PHP_EOL;});go(function(){echo2,PHP_EOL;});go(function(){echo3,PHP_EOL;});执行结果:0123Swoole协程与同步模式对比我们一直在说Swoole协程适用于I/O密集型场景。在相同的硬件配置环境下,它会比传统的Synchronous模式承载更多的流量。我们熟悉的文件读写和网络通信请求(MySQL、Redis、Http等)都是I/O密集型场景。假设一个SQL查询耗时100ms,在传统的同步模式下,当前进程在这100ms内不能进行其他操作。如果要执行这个SQL10次,可能需要1s以上。但是如果使用协程,虽然不同的协程是顺序执行的,但是底层会在之前的100ms等待时间内,调度CPU去执行其他协程的操作。也就是说,在第一个查询返回结果之前,其他几个查询已经发送到MySQL并正在执行。如果启动十个协程,分别执行这条SQL,可能只需要100+ms就可以完成。测试代码如下:Swoole\Runtime::enableCoroutine();//启用一键协程功能work(){$pdo=new\PDO('mysql:host=127.0.0.1;dbname=db_test','root','root');$pdo->exec('选择睡眠(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.0326268672943stime:0.10734605789185s以上代码可以假设为单个进程处理10个请求所需的时间。每个请求需要执行一条耗时100ms的SQL语句。在同步模式下,fpm大约需要1s。可以看到,等待100ms的时候什么也做不了。对于协程模型,Swoole大约需要0.1s。在100ms的等待时间内,当前协程会被挂起,底层调度会让CPU去执行其他协程操作。