× 警告!旧版文档已经暂停维护,请查看新版文档。点击前往新版文档

使用协程客户端

在最新的4.x版本中,协程取代了异步回调,作为我们推荐使用的编程方式。

协程解决了异步回调编程困难的问题。使用协程可以以传统同步编程的方法编写代码,底层自动切换为异步IO,既保证了编程的简单性,又可借助异步IO,提升系统的并发能力。

请使用4.2.5或更高版本

协程实例

$http = new Swoole\Http\Server("0.0.0.0", 9501);

$http->on('request', function ($request, $response) {
    $db = new Swoole\Coroutine\MySQL();
    $db->connect([
        'host' => '127.0.0.1',
        'port' => 3306,
        'user' => 'user',
        'password' => 'pass',
        'database' => 'test',
    ]);
    $data = $db->query('select * from test_table');
    $response->end(json_encode($data));
});

$http->start();

上面的代码编写与同步阻塞模式的程序完全一致的。但是底层自动进行了协程切换处理,变为异步IO。因此:

  • 服务器可以应对大量并发,每个请求都会创建一个新的协程,执行对应的代码
  • 某些请求处理较慢时,只会引起这一个请求被挂起,不影响其他请求的处理

其他协程组件

Swoole4扩展提供了丰富的协程组件,如RedisTCP/UDP/Unix客户端、Http/WebSocket/Http2客户端,使用这些组件可以很方便地实现高性能的并发编程。

使用协程时请认真阅读 协程编程须知,避免发生错误。

适用场景

协程非常适合编写

  • 高并发服务,如秒杀系统、高性能API接口、RPC服务器,使用协程模式,服务的容错率会大大增加,某些接口出现故障时,不会导致整个服务崩溃
  • 爬虫,可实现非常巨大的并发能力,即使是非常慢速的网络环境,也可以高效地利用带宽
  • 即时通信服务,如IM聊天、游戏服务器、物联网、消息服务器等等,可以确保消息通信完全无阻塞,每个消息包均可即时地被处理

  • 笨尛孩

    多次并发访问会经常报错:[2019-01-30 16:13:02 *56268.2] NOTICE swFactoryProcess_finish (ERROR 1005): connection[fd=7] does not exists.

  • oส้้้้้้้้้้o

    "底层自动切换位异步IO", 有个错别字

  • Jukie

    这不和web服务器一样吗

  • rtsg

    说的 并非服务器 而是客户端协程