课程表

Swoole基础

Swoole实例

工具箱
速查手册

Swoole AsyncIO实例

当前位置:免费教程 » 程序设计 » Swoole

swoole1.6.12后增加了异步文件读写,异步DNS等特性。自此建立了完整的异步并行API。

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


Swoole支持3种类型的异步文件读写IO,可以使用swoole_async_set来设置AIO模式。

swoole_async_set

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

  1. swoole_async_set(array $setting);
  • thread_num 设置异步文件IO线程的数量
  • aio_mode 设置异步文件IO的操作模式,目前支持SWOOLE_AIO_BASE(使用类似于Node.js的线程池同步阻塞模拟异步)、SWOOLE_AIO_LINUX(Linux Native AIO) 2种模式
  • enable_signalfd 开启和关闭signalfd特性的使用
  • socket_buffer_size 设置SOCKET内存缓存区尺寸
  • socket_dontwait 在内存缓存区已满的情况下禁止底层阻塞等待

Linux Native AIO的优点是由内核支持是真正的异步文件IO,缺点是只支持DirectIO,无法利用到系统的PageCache

swoole_async模块目前为实验性质,不建议在生产环境使用,请使用PHP的文件读写函数。

Linux原生异步IO

基于Linux Native AIO系统调用,是真正的异步IO,并非阻塞模拟。

优点:

  • 所有操作均在一个线程内完成,不需要开线程池
  • 不依赖线程执行IO,所以并发可以非常大

缺点:

  • 只支持DriectIO,无法利用PageCache,所有对文件读写都会直接操作磁盘

线程池模式异步IO

基于线程池模拟实现,文件读写请求投递到任务队列,然后由AIO线程读写文件,完成后通知主线程。AIO线程本身是同步阻塞的。所以并非真正的异步IO。

优点:

  • 可以利用操作系统PageCache,读写热数据性能非常高,等于读内存

可修改thread_num项设置启用的AIO线程数量

缺点:

  • 并发较差,不支持同时读写大量文件,最大并发受限与AIO的线程数量

简单实例:

  1. $fp = stream_socket_client("tcp://127.0.0.1:80", $code, $msg, 3);
  2. $http_request = "GET /index.html HTTP/1.1\r\n\r\n";
  3. fwrite($fp, $http_request);
  4. Swoole\Event::add($fp, function($fp){
  5. echo fread($fp, 8192);
  6. swoole_event_del($fp);
  7. fclose($fp);
  8. });
  9. Swoole\Timer::after(2000, function() {
  10. echo "2000ms timeout\n";
  11. });
  12. Swoole\Timer::tick(1000, function() {
  13. echo "1000ms interval\n";
  14. });
转载本站内容时,请务必注明来自W3xue,违者必究。
 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号