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

onClose

Swoole虽然是标准的PHP扩展,实际上与普通的扩展不同。普通的扩展只是提供一个库函数。而swoole扩展在运行后会接管PHP的控制权,进入事件循环。当IO事件发生后,swoole会自动回调指定的PHP函数。

Swoole要求使用者必须具备一定的Linux/Unix环境编程基础,《学习Swoole需要掌握哪些基础知识》 本文列出了基础知识清单。

swoole_server

强大的TCP/UDP Server框架,多线程,EventLoop,事件驱动,异步,Worker进程组,Task异步任务,毫秒定时器,SSL/TLS隧道加密。

  • swoole_http_serverswoole_server的子类,内置了Http的支持
  • swoole_websocket_serverswoole_http_server的子类,内置了WebSocket的支持
  • swoole_redis_serverswoole_server的子类,内置了Redis服务器端协议的支持

子类可以调用父类的所有方法和属性

swoole_client

TCP/UDP/UnixSocket客户端,支持IPv4/IPv6,支持SSL/TLS隧道加密,支持SSL双向证书,支持同步并发调用,支持异步事件驱动编程。

swoole_event

EventLoop API,让用户可以直接操作底层的事件循环,将socket,stream,管道等Linux文件加入到事件循环中。

eventloop接口仅可用于socket类型的文件描述符,不能用于磁盘文件读写

swoole_async

异步IO接口,提供了 异步文件系统IO,定时器,异步DNS查询,异步MySQL等API,异步Http客户端,异步Redis客户端。

  • swoole_timer 异步毫秒定时器,可以实现间隔时间或一次性的定时任务
  • swoole_async_read/swoole_async_write 文件系统操作的异步接口

Coroutine

Swoole在2.0开始内置协程(Coroutine)的能力,提供了具备协程能力IO接口(统一在命名空间Swoole\Coroutine*)。

2.0.2或更高版本已支持PHP7

2.0.8或更高版本已默认开启--enable-coroutine,可使用--disable-coroutine关闭协程特性

4.0.1或更高版本去除了--enable-coroutine编译选项, 改为动态配置

enable_coroutine动态配置请见文档

协程可以理解为纯用户态的线程,其通过协作而不是抢占来进行切换。相对于进程或者线程,协程所有的操作都可以在用户态完成,创建和切换的消耗更低。Swoole可以为每一个请求创建对应的协程,根据IO的状态来合理的调度协程,这会带来了以下优势:

开发者可以无感知的用同步的代码编写方式达到异步IO的效果和性能,避免了传统异步回调所带来的离散的代码逻辑和陷入多层回调中导致代码无法维护。

同时由于swoole是在底层封装了协程,所以对比传统的php层协程框架,开发者不需要使用yield关键词来标识一个协程IO操作,所以不再需要对yield的语义进行深入理解以及对每一级的调用都修改为yield,这极大的提高了开发效率。

swoole_process

进程管理模块,可以方便的创建子进程,进程间通信,进程管理。

swoole_buffer

强大的内存区管理工具,像C一样进行指针计算,又无需关心内存的申请和释放,而且不用担心内存越界,底层全部做好了。

swoole_table

基于共享内存和自旋锁实现的超高性能内存表。彻底解决线程,进程间数据共享,加锁同步等问题。

swoole_table的性能可以达到单线程每秒读写100W次


  • lovejocky

    Websocket中,怎么感觉发送close()请求后,服务端要延迟个1秒左右才能响应啊?

  • 张宇

    java多线程链接后,再断开,onClose() 经常响应不全, 比如 60个链接,同时断开,只会收到50多个onClose()回调。 这个是什么原因呢 ?

  • 张宇

    每次基本都能重现这个问题。还有的时候,60个链接同时断开,会收到45个onClose()回调,然后隔10秒左右,又收到10个左右的onClose()回调,最后还会有好几个没有收到回调。 这个问题困扰很久了。谁能帮忙看看。

  • 四季

    对于同一个worker,swoole是严格按照:onConnect, onReceive(可能有多个), onClose 的调用顺序来的吗? 现在我遇到一个问题:程序在调用了onClose并释放资源之后,又开始Receive数据处理时报错了。 下面是日志,真是奇了怪了: INFO - 2017-02-11 14:44:20.4731 - onConnect, worker_pid:28873 INFO - 2017-02-11 14:44:20.4785 - onReceive, worker_pid:28873:data string

    在这里关闭了连接

    INFO - 2017-02-11 14:44:20.4901 - onClose, worker_pid:28873

    这里没有经过onConnect又开始接收数据

    INFO - 2017-02-11 14:44:20.4910 - onReceive, worker_pid:28873:data string

  • Early

    PHP onClose() 在类中怎么调用呢?各位大侠

  • 包赢不输

    在cli下面,执行ctrl+c 不会调用到onclose回调啊,应该怎样执行资源回收呢?

  • The_Unicorn

    onclose能拿到最后一次连接的包吗?能在onclose里进行业务逻辑操作吗?还是智能echo、var_dump

  • 15605188918

    onClose是在断开连接后回调,请问大佬有在断开连接前即将断开连接的时候的回调吗,不然都不知道是谁断开连接了