如果说数组是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密集型场景。在硬件配置环境下,会比传统的同步方式承载更多的流量。点击进入,免费领取优质PHP学习资料。适合大学生,初学者,想转行,想提升自己的可以加入。我们熟悉的文件读写和网络通信请求(MySQL、Redis、Http等)都是I/O密集型场景。假设一个SQL查询耗时100ms,在传统的同步模式下,当前进程在这100ms内不能进行其他操作。如果要执行这个SQL10次,可能需要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``(``'selectSLEEP(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;`Executionresult:`time:1.0326268672943s``time:0.10734605789185s`以上代码可以想象成单个进程处理10个请求所需要的时间。每个请求需要执行一条耗时100ms的SQL语句。在同步模式下,fpm大约需要1s。可以看到,等待100ms的时候什么也做不了。对于协程模型,Swoole大约需要0.1s。在100ms的等待时间内,当前协程会被挂起,底层调度会让CPU去执行其他协程操作。以上就是Swoole协程与传统fpm同步方式对比的细节
