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

Async

⛔️重要提示

  • 异步回调模块已过时,目前仅修复 BUG,不再进行维护, 且在 4.3 版本中将所有异步客户端模块 迁移至了 ext-async 扩展中。建议使用协程客户端
  • 异步回调模块仅可用于cli模式,无法在php-fpm中使用

4.3版本开始需要额外安装swoole-async扩展才能使用异步模块
不要直接拉取 master 代码进行编译,请使用和 swoole 版本对应的 ext-asyncrelease 版本

异步 IO

Swoole扩展内置了异步文件读写,异步DNS,异步Http/WebSocket/MySQL/Redis客户端,异步定时器,异步信号等特性。编写纯异步非阻塞IO的程序时,不能使用PHP自带的同步阻塞网络客户端,如curlfile_get_contentsstreamsocketsmysqlredis

  • Swoole\ServerTask进程是同步阻塞的,没有EventLoop,因此无法使用除定时器之外的任何异步API
  • signalfdLinux-2.6.27提供文件句柄方式处理信号特性,优点是可以将信号加入到EventLoop中,Reactor操作不会被信号打断提高了性能。缺点是有些同步阻塞的程序可能会出现问题,无法从阻塞中中断,可以使用swoole_async_set关闭signalfd特性

swoole_async_set

此函数可以设置异步IO相关的选项。

swoole_async_set(array $setting);
  • thread_num 设置异步文件IO线程的数量
  • enable_signalfd 开启和关闭signalfd特性的使用
  • enable_reuse_port 开启端口复用,需要Linux-3.10或更高版本内核,开启后BASE模式下每个工作进程都会监听端口,可避免惊群问题
  • socket_buffer_size 设置SOCKET内存缓存区尺寸
  • socket_dontwait 在内存缓存区已满的情况下禁止底层阻塞等待
  • log_file 设置日志文件路径
  • log_level 设置错误日志等级

  • 飞鸿影

    swoole异步就是为了解决这个问题,当你的程序读取网络或磁盘时。swoole会加入到事件监听中,完全不需要等待,你的代码可以取做别的事情。当网络或磁盘读取完成,返回数据时,再继续向下执行你的代码。这样就可以高效利用机器资源。再高的并发也不是问题。 https://group.swoole.com/question/105709

  • 飞鸿影

    swoole_http_client::get(): async-io must be used in PHP CLI mode

  • 18612200951

    go(): async-io must be used in PHP CLI mode 请问这个问题该怎么解决呢?

  • 帅的不明显

    请问以上两个朋友,我也想是这个问题,你们解决的话,把问题答案再加在下面吧。谢谢

  • 沈唁

    在cli模式下执行啊,命令行那种。。

  • swoole上单

    Uncaught Error: Call to undefined function swoole_async_readfile() 请问这个问题怎么解决

  • 13711778726

    use Swoole\Coroutine as co; $fp = fopen(DIR . "/defer_client.php", "r"); co::create(function () use ($fp) { fseek($fp, 256); $r = co::fread($fp); var_dump($r); });

  • 18329043285

    @逝水无痕 这是你的版本为4.3以上了,函数被移除了