Swoole协程与传统fpm同步模式比较-php教程

资源魔 41 0
假如说数组是 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同步模式比拟的具体内容,更多请存眷资源魔其它相干文章!

标签: php开发教程 php开发资料 php开发自学 Swoole FPM

抱歉,评论功能暂时关闭!