Swoole异步与同步的选择

Swoole不仅支持异步,还支持同步。什么情况下使用同步,什么情况下使用异步。这里说明一下。

我们不赞成用异步回调的方式去做功能开发,传统的PHP同步方式实现功能和逻辑是最简单的,也是最佳的方案。像node.js这样到处callback,只是牺牲可维护性和开发效率。

但有些时候很适合用异步,比如FTP、聊天服务器,smtp,代理服务器等等此类以通信和读写磁盘为主,功能和业务逻辑其次的服务器程序。

“PHP的扩展函数API全是同步的”,这个说法并不正确,实际上同步阻塞的地方主要是网络调用,文件读写。例如mysql_query需要与mysql数据库服务器通信,curl需要调用网络,file_get_contents需要读写文件,以及其他fopen/fwrite/fread/fgets/fputs这些都是阻塞的API。除此之外PHP的array/string/mbstring等函数是非阻塞的。

swoole提供了异步的socket客户端,异步的mysql,而且1.6.12还提供了异步文件读写和异步DNS查询的功能。另外还提供了task/finish的API,完全可以解决阻塞IO问题。


  • aalphaa

    "除此之外PHP的array/string/mbstring等函数是非阻塞的。"

    文中这句话怎么理解呢? 我理解非阻塞是,代码执行到这里,不用等结果,继续执行下面代码。 array,string,mbstring这些函数,即便是如(array_map)这样带callable参数的函数,代码执行到这句时,也是必须array_map返回结果,甚至还是callable都执行完,才能继续下面的代码。

    求解惑

  • leunggamciu

    这里的非阻塞指的是不会因为触发IO等待而导致进程被挂起

  • Sin

    ??