# swoole项目起源和名字由来
项目起源
----
Swoole 项目最初的想法是来自于之前所做的一个企业软件项目。当时大概是2010年底,公司产品有一个需求是用户可以任意生成一个 email 地址,然后其他用户可以向这个email发邮件,后台能实时将邮件内容解析成数据,并主动通知用户。当时项目使用PHP开发的,在实现这个需求时遇到了难题,PHP只能依赖其他的STMP服务器,通过pop3协议定时查收新邮件来完成,这样就不是实时的。如果要实现的实时系统必须自己写一个TCP Socket Server实现SMTP协议接收数据。当时PHP在这个领域几乎是空白,没有一套成熟的网络通信框架。为了实现需求,我从socket学起到TCP/IP、IO复用、libevent、多进程,最后终于实现了这套程序。做完这个项目后我就想把这套程序开源出来,希望能帮助其他PHPer解决在这个领域的难题。如果能有这样一个框架,那么PHP就能从单纯地做一个Web网站延伸到更大的空间。
性能问题
---
还有一个重要的原因是PHP程序的性能问题,我最早是学Java出身的,工作后才转行成为一名PHP程序员。在使用PHP开发程序的过程中,我一直在思考的问题 PHP 和 Java 比最大的优势是什么?简单高效, PHP 在请求完成之后会释放所有资源和内存,无须担心内存泄漏。代码的质量无论高低一样运行的很流畅。但同时这也是 PHP 致命的缺点。一旦请求数量上升,并发很高的时候,快速创建资源,又马上释放,使得 PHP 程序运行效率急剧下降。另外一旦项目的功能的越来越复杂,代码增多后,对于 PHP 也会是灾难。这也是 PHP 的框架为什么没有被 PHP 程序员广泛接受,而 Java 不存在这个问题。再好的框架也会被这种低效的方式拖累,导致系统变慢。所以想到了使用 PHP 来开发 PHP 的应用服务器,让 PHP 的代码加载到内存后,拥有更长的生命周期,这样建立的数据库连接和其他大的对象,不被释放。每次请求只需要处理很少的代码,而这些代码只在第一次运行时,被 PHP 解析器编译,驻留内存。另外,之前 PHP 不能实现的,对象持久化、数据库连接池,缓存连接池都可以实现。系统的运行效率会大大提高。
经过一段时间研究,目前已经初步得到实现。使用 PHP 本身编写出 HTTP 服务器,以独立服务器方式运行,单个程序页面 ( 有对象生成,数据库连接、 smarty 模板操作 ) 的执行时间由原来的 0.0x 秒,下降到 0.00x 秒。使用 Apache AB 并发 100 测试。比传统 LAMP 方式, Request per Second 高出至少 10 倍。在我的测试机上 (Ubuntu10.04 Inter Core E5300 + 2G 内存 ) , Apache 只跑到 83RPS 。 Swoole Server 可以跑到 1150 多 RPS。
这个项目就是Swoole的雏形。这个版本一直持续维护了2年多,在这个过程中逐步有了一些经验积累,对这套技术方案的存在问题有了更深入的理解,比如性能差、限制较多无法直接调用操作系统接口、内存管理效率低下。
入职腾讯
----
2011年底我入职腾讯,负责朋友网的PHP平台开发工作。惊奇地发现朋友网的同事不光这样想了,他们直接做到了。朋友网团队已经在生产环境中使用了这套方案。朋友网有三架马车,第一个是PWS,这是一个纯PHP编写的WebServer,朋友网线上有600多台服务器运行在PWS上,完全没有使用Apache、PHP-FPM之类的程序。第二个是SAPS,这是使用纯PHP开发的一个分布式队列,当时大概由150台服务器的集群在跑,很多图片裁剪、头像处理、消息同时、数据同步等逻辑全部使用了SAPS做逻辑异步化。第三个是PSF,这是一个PHP实现的Server框架,朋友网很多逻辑层的服务器都是基于PSF实现的。大概有300台左右的集群在运行PSF服务器程序。在朋友网的这段时间,我学到了很多Linux底层、网络通信的知识,积累了很多大型集群高并发环境的网络通信跟踪、调试经验,为开发Swoole打下了一个很好的基础。
开发Swoole
----
在这期间也学习了解到了Node.js、Golang这些优秀的技术方案,得到了更多灵感。在2012年的时候就有了新的想法,决定使用C语言重新实现一个性能更强、功能更强大的版本。这就是现在的Swoole扩展。
现在Swoole已经被很多PHP技术团队用于实际项目的开发工作,国内国外都有。国内知名的有百度订单中心、百度地图、腾讯QQ公众号和企业QQ、战旗直播、360、当当网、穷游等。另外还有很多物联网、硬件、游戏项目也在使用Swoole 。另外基于Swoole的开源框架也越来越多,比如TSF、Blink、swPromise 等等,在Github上也能找到很多Swoole相关的项目和代码。
名字由来
----
Swoole这个名字不是一个英文单词,是由我创造的一个音近字。我最早想到的名字是叫做`sword-server`,寓意是为广大PHPer创造一把锋利的剑,后来联想到google也是凭空创造出来的,所以我就给它命名为`swoole`。
- 第一章 入门指引
- 1.1 环境依赖
- 1.2 编译安装
- 1.2.1 编译参数
- 1.2.2 常见错误
- 1.3 快速起步
- 1.3.1 创建TCP服务器
- 1.3.2 创建UDP服务器
- 1.3.3 创建Web服务器
- 1.3.4 创建WebSocket服务器
- 1.3.5 设置定时器
- 1.3.6 执行异步任务
- 1.3.7 创建同步TCP客户端
- 1.3.8 创建异步TCP客户端
- 1.3.9 网络通信协议设计
- 1.3.10 使用异步客户端
- 1.3.11 多进程共享数据
- 1.4 编程须知
- 1.4.1 sleep/usleep的影响
- 1.4.2 exit/die函数的影响
- 1.4.3 while循环的影响
- 1.4.4 stat缓存清理
- 1.4.5 mt_rand随机数
- 1.5 版本更新记录
- 1.5.1 4.2.2
- 1.5.2 4.2.1
- 1.5.3 4.2.0
- 1.5.4 4.1.2
- 1.5.5 4.1.1
- 1.5.6 4.1.0
- 1.5.7 4.0.4
- 1.5.8 4.0.3
- 1.5.9 4.0.2
- 1.5.10 4.0.1
- 1.5.11 4.0.0
- 1.6 向下不兼容改动
- 1.7 新特性使用
- 1.7.1 2.1.2 进程池模块的使用
- 1.7.2 1.9.24 调度支持 Stream 模式
- 1.7.3 1.9.24 异步客户端自动解析域名
- 1.7.4 1.9.17 支持异步安全重启特性
- 1.7.5 1.9.14 使用异步客户端超时机制
- 1.7.6 1.8.0 使用内置Http异步客户端
- 1.7.7 1.7.16 使用迭代器遍历Server所有连接
- 1.7.8 1.7.5 在Server中使用swoole_table
- 1.7.9 1.7.5 swoole_client支持sendfile接口
- 1.7.10 1.7.4 SSL隧道加密TCP-Server
- 1.7.11 1.7.4 task进程中使用毫秒定时器
- 1.7.12 1.7.3 固定包头+包体协议自动分包
- 1.7.13 1.7.3 onTask直接return取代finish函数
- 1.7.14 1.7.2 swoole_process多进程模块的使用
- 1.7.15 1.7.2 task进程使用消息队列
- 1.8 项目路线图
- 1.9 php.ini选项
- 1.10 内核参数调整
- 1.12 衍生开源项目
- 1.12.1 框架
- 1.12.2 工具
- 1.12.3 分布式
- 1.12.4 通信协议
- 1.13 用户与案例
- 1.13.1 物联网项目
- 1.13.2 网络游戏
- 1.13.3 腾讯(Tencent)
- 1.13.4 百度(Baidu.com)
- 1.13.5 阅文集团
- 1.13.6 BiliBili(哔哩哔哩)
- 1.13.7 车轮互联(chelun.com)
- 1.13.8 (捞月狗) 游戏社区
- 1.14 提交错误报告
- 1.15 常见问题
- 1.15.1 升级swoole版本的常见问题
- 1.15.2 生成可分发的二进制swoole版本
- 1.15.3 在phpinfo中有在php -m中没有
- 1.15.4 Connection refused是怎么回事
- 1.15.5 Resource temporarily unavailable [11]
- 1.15.6 Cannot assign requested address [99]
- 1.15.7 swoole与node.js相比有哪些优势
- 1.15.8 swoole与golang相比有哪些优势
- 1.15.9 pcre.h: No such file or directory
- 1.15.10 my_global.h: No such file or directory
- 1.15.11 undefined symbol: __sync_bool_compare_and_swap_4
- 1.15.12 学习Swoole需要掌握哪些基础知识
- 1.15.13 同步阻塞与异步非阻塞适用场景
- 1.15.14 PHP7环境下出现zend_mm_heap corrupted
- 1.15.15 swoole项目起源和名字由来
- 1.15.16 swFactoryProcess_finish (ERROR 1004): send %d byte failed, because session#%d is closed / swFactoryProcess_finish (ERROR 1005): connection[fd=%d] does not exists
- 第二章 Server
- 2.1 函数列表
- 2.1.1 swoole_server::__construct
- 2.1.2 swoole_server->set
- 2.1.3 swoole_server->on
- 2.1.4 swoole_server->addListener
- 2.1.5 swoole_server->addProcess
- 2.1.6 swoole_server->listen
- 2.1.7 swoole_server->start
- 2.1.8 swoole_server->reload
- 2.1.9 swoole_server->stop
- 2.1.10 swoole_server->shutdown
- 2.1.11 swoole_server->tick
- 2.1.12 swoole_server->after
- 2.1.13 swoole_server->defer
- 2.1.14 swoole_server->clearTimer
- 2.1.15 swoole_server->close
- 2.1.16 swoole_server->send
- 2.1.17 swoole_server->sendfile
- 2.1.18 swoole_server->sendto
- 2.1.19 swoole_server->sendwait
- 2.1.20 swoole_server->sendMessage
- 2.1.21 swoole_server->exist
- 2.1.22 swoole_server->pause
- 2.1.23 swoole_server->resume
- 2.1.24 swoole_server->getClientInfo
- 2.1.25 swoole_server->getClientList
- 2.1.26 swoole_server->bind
- 2.1.27 swoole_server->stats
- 2.1.28 swoole_server->task
- 2.1.29 swoole_server->taskwait
- 2.1.30 swoole_server->taskWaitMulti
- 2.1.31 swoole_server->taskCo
- 2.1.32 swoole_server->finish
- 2.1.33 swoole_server->heartbeat
- 2.1.34 swoole_server->getLastError
- 2.1.35 swoole_server->getSocket
- 2.1.36 swoole_server->protect
- 2.1.37 swoole_server->confirm
- 2.2 属性列表
- 2.2.1 swoole_server::$setting
- 2.2.2 swoole_server::$master_pid
- 2.2.3 swoole_server::$manager_pid
- 2.2.4 swoole_server::$worker_id
- 2.2.5 swoole_server::$worker_pid
- 2.2.6 swoole_server::$taskworker
- 2.2.7 swoole_server::$connections
- 2.2.8 swoole_server::$ports
- 2.3 配置选项
- 2.3.1 reactor_num
- 2.3.2 worker_num
- 2.3.3 max_request
- 2.3.4 max_conn (max_connection)
- 2.3.5 task_worker_num
- 2.3.6 task_ipc_mode
- 2.3.7 task_max_request
- 2.3.8 task_tmpdir
- 2.3.9 dispatch_mode
- 2.3.10 dispatch_func
- 2.3.11 message_queue_key
- 2.3.12 daemonize
- 2.3.13 backlog
- 2.3.14 log_file
- 2.3.15 log_level
- 2.3.16 heartbeat_check_interval
- 2.3.17 heartbeat_idle_time
- 2.3.18 open_eof_check
- 2.3.19 open_eof_split
- 2.3.20 package_eof
- 2.3.21 open_length_check
- 2.3.22 package_length_type
- 2.3.23 package_length_func
- 2.3.24 package_max_length
- 2.3.25 open_cpu_affinity
- 2.3.26 cpu_affinity_ignore
- 2.3.27 open_tcp_nodelay
- 2.3.28 tcp_defer_accept
- 2.3.29 ssl_cert_file
- 2.3.30 ssl_method
- 2.3.31 ssl_ciphers
- 2.3.32 user
- 2.3.33 group
- 2.3.34 chroot
- 2.3.35 pid_file
- 2.3.36 pipe_buffer_size
- 2.3.37 buffer_output_size
- 2.3.38 socket_buffer_size
- 2.3.39 enable_unsafe_event
- 2.3.40 discard_timeout_request
- 2.3.41 enable_reuse_port
- 2.3.42 enable_delay_receive
- 2.3.43 open_http_protocol
- 2.3.44 open_http2_protocol
- 2.3.45 open_websocket_protocol
- 2.3.46 open_mqtt_protocol
- 2.3.47 open_websocket_close_frame
- 2.3.48 reload_async
- 2.3.49 tcp_fastopen
- 2.3.50 request_slowlog_file
- 2.3.51 enable_coroutine
- 2.3.52 max_coroutine
- 2.4 监听端口
- 2.4.1 可选参数
- 2.4.2 可选回调
- 2.4.3 连接迭代器
- 2.5 预定义常量
- 2.6 事件回调函数
- 2.6.1 onStart
- 2.6.2 onShutdown
- 2.6.3 onWorkerStart
- 2.6.4 onWorkerStop
- 2.6.5 onWorkerExit
- 2.6.6 onConnect
- 2.6.7 onReceive
- 2.6.8 onPacket
- 2.6.9 onClose
- 2.6.10 onBufferFull
- 2.6.11 onBufferEmpty
- 2.6.12 onTask
- 2.6.13 onFinish
- 2.6.14 onPipeMessage
- 2.6.15 onWorkerError
- 2.6.16 onManagerStart
- 2.6.17 onManagerStop
- 2.7 高级特性
- 2.7.1 改变Worker进程的用户/组
- 2.7.2 回调函数中的 reactor_id 和 fd
- 2.7.3 Length_Check 和 EOF_Check 的使用
- 2.7.4 Worker与Reactor通信模式
- 2.7.5 TCP-Keepalive死连接检测
- 2.7.6 TCP服务器心跳维持方案
- 2.7.7 多端口监听的使用
- 2.7.8 捕获Server运行期致命错误
- 2.7.9 swoole_server的两种运行模式介绍
- 2.7.10 swoole_server中对象的4层生命周期
- 2.7.11 在worker进程内监听一个Server端口
- 2.7.12 在php-fpm/apache中使用task功能
- 2.8 常见问题
- 2.8.1 为什么不要send完后立即close
- 2.8.2 如何在回调函数中访问外部的变量
- 2.8.3 swoole_server中内存管理机制
- 2.8.4 是否可以共用1个redis或mysql连接
- 2.8.5 关于onConnect/onReceive/onClose顺序
- 2.8.6 4种PHP回调函数风格
- 2.8.7 不同的Server程序实例间如何通信
- 2.8.8 错误信息:ERROR (9006)
- 2.8.9 eventLoop has already been created. unable to create swoole_server
- 2.9 压力测试
- 2.9.1 并发10万TCP连接的测试
- 2.9.2 PHP7+Swoole/Nginx/Golang性能对比
- 2.9.3 全球Web框架权威性能测试 Techempower Web Framework Benchmarks
- 第三章 Client
- 3.1 方法列表
- 3.1.1 swoole_client::__construct
- 3.1.2 swoole_client->set
- 3.1.3 swoole_client->on
- 3.1.4 swoole_client->connect
- 3.1.5 swoole_client->isConnected
- 3.1.6 swoole_client->getSocket
- 3.1.7 swoole_client->getSockName
- 3.1.8 swoole_client->getPeerName
- 3.1.9 swoole_client->getPeerCert
- 3.1.10 swoole_client->send
- 3.1.11 swoole_client->sendto
- 3.1.12 swoole_client->sendfile
- 3.1.13 swoole_client->recv
- 3.1.14 swoole_client->close
- 3.1.15 swoole_client->sleep
- 3.1.16 swoole_client->wakeup
- 3.1.17 swoole_client->enableSSL
- 3.2 回调函数
- 3.2.1 onConnect
- 3.2.2 onError
- 3.3.3 onReceive
- 3.3.4 onClose
- 3.3.5 onBufferFull
- 3.3.6 onBufferEmpty
- 3.3 属性列表
- 3.3.1 swoole_client->errCode
- 3.3.2 swoole_client->sock
- 3.3.3 swoole_client->reuse
- 3.4 并行
- 3.4.1 swoole_client_select
- 3.4.2 TCP客户端异步连接
- 3.4.3 SWOOLE_KEEP建立TCP长连接
- 3.5 常量
- 3.6 配置选项
- 3.6.1 ssl_verify_peer
- 3.6.2 ssl_host_name
- 3.6.3 ssl_cafile
- 3.6.4 ssl_capath
- 3.6.5 package_length_func
- 3.7 常见问题
- 第四章 Coroutine
- 4.1 Coroutine
- 4.1.1 Coroutine::getuid
- 4.1.2 Coroutine::create
- 4.1.3 Coroutine::resume
- 4.1.4 Coroutine::suspend
- 4.1.5 Coroutine::fread
- 4.1.6 Coroutine::fgets
- 4.1.7 Coroutine::fwrite
- 4.1.8 Coroutine::sleep
- 4.1.9 Coroutine::gethostbyname
- 4.1.10 Coroutine::getaddrinfo
- 4.1.11 Coroutine::exec
- 4.1.12 Coroutine::readFile
- 4.1.13 Coroutine::writeFile
- 4.1.14 Coroutine::stats
- 4.1.15 Coroutine::getBackTrace
- 4.1.16 Coroutine::listCoroutines
- 4.2 Coroutine\Channel
- 4.2.1 Coroutine\Channel->__construct
- 4.2.2 Coroutine\Channel->push
- 4.2.3 Coroutine\Channel->pop
- 4.2.4 Coroutine\Channel->stats
- 4.2.5 Coroutine\Channel->close
- 4.2.6 Coroutine\Channel->length
- 4.2.7 Coroutine\Channel->isEmpty
- 4.2.8 Coroutine\Channel->isFull
- 4.2.9 Coroutine\Channel->$capacity
- 4.2.10 Coroutine\Channel->$errCode
- 4.3 Coroutine\Client
- 4.3.1 Coroutine\Client->connect
- 4.3.2 Coroutine\Client->send
- 4.3.3 Coroutine\Client->recv
- 4.3.4 Coroutine\Client->close
- 4.3.5 Coroutine\Client->peek
- 4.4 Coroutine\Http\Client
- 4.4.1 属性列表
- 4.4.2 Coroutine\Http\Client->get
- 4.4.3 Coroutine\Http\Client->post
- 4.4.4 Coroutine\Http\Client->upgrade
- 4.4.5 Coroutine\Http\Client->push
- 4.4.6 Coroutine\Http\Client->recv
- 4.4.7 Coroutine\Http\Client->addFile
- 4.4.8 Coroutine\Http\Client->addData
- 4.4.9 Coroutine\Http\Client->download
- 4.5 Coroutine\Http2\Client
- 4.5.1 Coroutine\Http2\Client->__construct
- 4.5.2 Coroutine\Http2\Client->set
- 4.5.3 Coroutine\Http2\Client->connect
- 4.5.4 Coroutine\Http2\Client->send
- 4.5.5 Coroutine\Http2\Client->write
- 4.5.6 Coroutine\Http2\Client->recv
- 4.5.7 Coroutine\Http2\Client->close
- 4.6 Coroutine\Redis
- 4.6.1 方法列表
- 4.6.2 属性列表
- 4.7 Coroutine\Socket
- 4.7.1 Coroutine\Socket::__construct
- 4.7.2 Coroutine\Socket->bind
- 4.7.3 Coroutine\Socket->listen
- 4.7.4 Coroutine\Socket->accept
- 4.7.5 Coroutine\Socket->connect
- 4.7.6 Coroutine\Socket->send
- 4.7.7 Coroutine\Socket->recv
- 4.7.8 Coroutine\Socket->sendto
- 4.7.9 Coroutine\Socket->recvfrom
- 4.7.10 Coroutine\Socket->getsockname
- 4.7.11 Coroutine\Socket->getpeername
- 4.7.12 Coroutine\Socket->close
- 4.8 Coroutine\MySQL
- 4.8.1 属性列表
- 4.8.2 Coroutine\MySQL->connect
- 4.8.3 Coroutine\MySQL->query
- 4.8.4 Coroutine\MySQL->prepare
- 4.8.5 Coroutine\MySQL\Statement->execute
- 4.8.6 Coroutine\MySQL\Statement->fetch
- 4.8.7 Coroutine\MySQL\Statement->fetchAll
- 4.8.8 Coroutine\MySQL\Statement->nextResult
- 4.8.9 Coroutine\MySQL->execFile
- 4.9 Coroutine\PostgreSQL
- 4.9.1 Coroutine\PostgreSQL->connect
- 4.9.2 Coroutine\PostgreSQL->query
- 4.9.3 Coroutine\PostgreSQL->fetchAll
- 4.9.4 Coroutine\PostgreSQL->affectedRows
- 4.9.5 Coroutine\PostgreSQL->numRows
- 4.9.6 Coroutine\PostgreSQL->fetchObject
- 4.9.7 Coroutine\PostgreSQL->fetchAssoc
- 4.9.8 Coroutine\PostgreSQL->fetchArray
- 4.9.9 Coroutine\PostgreSQL->fetchRow
- 4.9.10 Coroutine\PostgreSQL->metaData
- 4.10 Runtime::enableCoroutine
- 4.10.1 文件操作
- 4.10.2 睡眠函数
- 4.10.3 开关选项
- 4.11 Server
- 4.12 并发调用
- 4.12.1 Defer 机制
- 4.12.2 子协程+通道
- 4.13 实现原理
- 4.13.1 协程与线程
- 4.13.2 发送数据协程调度
- 4.13.3 协程内存开销
- 4.13.4 4.0 协程实现原理
- 4.14 常见问题
- 4.14.1 运行中出现 Fatal error: Maximum function nesting level of '1000' reached, aborting!
- 4.14.2 为什么只能在回调函数中使用协程客户端
- 4.14.3 支持协程的回调方法列表
- 4.14.4 错误信息: XXXX client has already been bound to another coroutine
- 4.14.5 Swoole4 协程与 PHP 的 Yield/Generator 协程有什么区别
- 4.15 编程须知
- 4.15.1 在多个协程间共用同一个协程客户端
- 4.15.2 禁止使用协程 API 的场景 (Swoole4以下版本)
- 4.15.3 使用类静态变量/全局变量保存上下文
- 4.16 退出协程
- 4.17 扩展组件
- 4.17.1 MongoDB
- 第五章 Async
- 5.1 异步文件系统IO
- 5.1.1 swoole_async_readfile
- 5.1.2 swoole_async_writefile
- 5.1.3 swoole_async_read
- 5.1.4 swoole_async_write
- 5.1.5 swoole_async_dns_lookup
- 5.1.6 swoole_async::exec
- 5.2 EventLoop
- 5.2.1 swoole_event_add
- 5.2.2 swoole_event_set
- 5.2.3 swoole_event_isset
- 5.2.4 swoole_event_write
- 5.2.5 swoole_event_del
- 5.2.6 swoole_event_exit
- 5.2.7 swoole_event_defer
- 5.2.8 swoole_event_cycle
- 5.2.9 swoole_event_wait
- 5.2.10 swoole_event_dispatch
- 5.3 异步毫秒定时器
- 5.3.1 swoole_timer_tick
- 5.3.2 swoole_timer_after
- 5.3.3 swoole_timer_clear
- 5.4 异步MySQL客户端
- 5.4.1 swoole_mysql->__construct
- 5.4.2 swoole_mysql->on
- 5.4.3 swoole_mysql->connect
- 5.4.4 swoole_mysql->escape
- 5.4.5 swoole_mysql->query
- 5.4.6 swoole_mysql->begin
- 5.4.7 swoole_mysql->commit
- 5.4.8 swoole_mysql->rollback
- 5.4.9 swoole_mysql->close
- 5.5 异步Redis客户端
- 5.5.1 swoole_redis->__construct
- 5.5.2 swoole_redis->on
- 5.5.3 swoole_redis->connect
- 5.5.4 swoole_redis->__call
- 5.5.5 swoole_redis->close
- 5.6 异步Http/WebSocket客户端
- 5.6.1 swoole_http_client->__construct
- 5.6.2 swoole_http_client->set
- 5.6.3 swoole_http_client->setMethod
- 5.6.4 swoole_http_client->setHeaders
- 5.6.5 swoole_http_client->setCookies
- 5.6.6 swoole_http_client->setData
- 5.6.7 swoole_http_client->addFile
- 5.6.8 swoole_http_client->get
- 5.6.9 swoole_http_client->post
- 5.6.10 swoole_http_client->upgrade
- 5.6.11 swoole_http_client->push
- 5.6.12 swoole_http_client->execute
- 5.6.13 swoole_http_client->download
- 5.6.14 swoole_http_client->close
- 5.7 异步Http2.0客户端
- 5.7.1 swoole_http2_client->__construct
- 5.7.2 swoole_http2_client->get
- 5.7.3 swoole_http2_client->post
- 5.7.4 swoole_http2_client->setHeaders
- 5.7.5 swoole_http2_client->setCookies
- 第六章 Memory
- 6.1 Lock
- 6.1.1 swoole_lock->__construct
- 6.1.2 swoole_lock->lock
- 6.1.3 swoole_lock->trylock
- 6.1.4 swoole_lock->unlock
- 6.1.5 swoole_lock->lock_read
- 6.1.6 swoole_lock->trylock_read
- 6.1.7 swoole_lock->lockwait
- 6.2 Buffer
- 6.2.1 swoole_buffer->__construct
- 6.2.2 swoole_buffer->append
- 6.2.3 swoole_buffer->substr
- 6.2.4 swoole_buffer->clear
- 6.2.5 swoole_buffer->expand
- 6.2.6 swoole_buffer->write
- 6.2.7 swoole_buffer->read
- 6.2.8 swoole_buffer->recycle
- 6.3 Table
- 6.3.1 swoole_table->__construct
- 6.3.2 swoole_table->column
- 6.3.3 swoole_table->create
- 6.3.4 swoole_table->set
- 6.3.5 swoole_table->incr
- 6.3.6 swoole_table->decr
- 6.3.7 swoole_table->get
- 6.3.8 swoole_table->exist
- 6.3.9 swoole_table->del
- 6.3.10 常量列表
- 6.3.11 swoole_table->count
- 6.4 Atomic
- 6.4.1 swoole_atomic->__construct
- 6.4.2 swoole_atomic->add
- 6.4.3 swoole_atomic->sub
- 6.4.4 swoole_atomic->get
- 6.4.5 swoole_atomic->set
- 6.4.6 swoole_atomic->cmpset
- 6.4.7 swoole_atomic->wait
- 6.4.8 swoole_atomic->wakeup
- 6.5 mmap
- 6.5.1 swoole_mmap::open
- 6.6 Channel
- 6.6.1 Channel->__construct
- 6.6.2 Channel->push
- 6.6.3 Channel->pop
- 6.6.4 Channel->stats
- 6.7 Serialize
- 6.7.1 swoole_serialize::pack
- 6.7.2 swoole_serialize::unpack
- 第七章 Process
- 7.1 swoole_process::__construct
- 7.2 swoole_process->start
- 7.3 swoole_process->name
- 7.4 swoole_process->exec
- 7.5 swoole_process->write
- 7.6 swoole_process->read
- 7.7 swoole_process->setTimeout
- 7.8 swoole_process->setBlocking
- 7.9 swoole_process->useQueue
- 7.10 swoole_process->statQueue
- 7.11 swoole_process->freeQueue
- 7.12 swoole_process->push
- 7.13 swoole_process->pop
- 7.14 swoole_process->close
- 7.15 swoole_process->exit
- 7.16 swoole_process::kill
- 7.17 swoole_process::wait
- 7.18 swoole_process::daemon
- 7.19 swoole_process::signal
- 7.20 swoole_process::alarm
- 7.21 swoole_process::setAffinity
- 第八章 HttpServer
- 8.1 swoole_http_server
- 8.1.1 swoole_http_server->on
- 8.1.2 swoole_http_server->start
- 8.2 swoole_http_request
- 8.2.1 swoole_http_request->$header
- 8.2.2 swoole_http_request->$server
- 8.2.3 swoole_http_request->$get
- 8.2.4 swoole_http_request->$post
- 8.2.5 swoole_http_request->$cookie
- 8.2.6 swoole_http_request->$files
- 8.2.7 swoole_http_request->rawContent
- 8.2.8 swoole_http_request->getData
- 8.3 swoole_http_response
- 8.3.1 swoole_http_response->header
- 8.3.2 swoole_http_response->cookie
- 8.3.3 swoole_http_response->status
- 8.3.4 swoole_http_response->gzip
- 8.3.5 swoole_http_response->redirect
- 8.3.6 swoole_http_response->write
- 8.3.7 swoole_http_response->sendfile
- 8.3.8 swoole_http_response->end
- 8.3.9 swoole_http_response->detach
- 8.3.10 swoole_http_response::create
- 8.4 配置选项
- 8.4.1 upload_tmp_dir
- 8.4.2 http_parse_post
- 8.4.3 document_root
- 8.4.4 http_compression
- 8.5 常见问题
- 8.5.1 CURL发送POST请求服务器端超时
- 8.5.2 使用Chrome访问服务器会产生2次请求
- 8.5.3 GET/POST请求的最大尺寸
- 第九章 WebSocket
- 9.1 回调函数
- 9.1.1 onHandShake
- 9.1.2 onOpen
- 9.1.3 onMessage
- 9.2 函数列表
- 9.2.1 swoole_websocket_server->push
- 9.2.2 swoole_websocket_server->exist
- 9.2.3 swoole_websocket_server::pack
- 9.2.4 swoole_websocket_server::unpack
- 9.2.5 swoole_websocket_server->disconnect
- 9.3 预定义常量
- 9.4 常见问题
- 9.5 配置选项
- 9.6 swoole_websocket_frame
- 第十章 Process\Pool
- 10.1 Process\Pool::__construct
- 10.2 Process\Pool->on
- 10.3 Process\Pool->listen
- 10.4 Process\Pool->write
- 10.5 Process\Pool->start
- 10.6 Process\Pool->getProcess
- 第十一章 Redis\Server
- 11.1 方法
- 11.1.1 setHandler
- 11.1.2 format
- 11.2 常量
- 第十二章 高级
- 12.1 Swoole的实现
- 12.2 Reactor线程
- 12.3 Manager进程
- 12.4 Worker进程
- 12.5 Reactor、Worker、TaskWorker的关系
- 12.6 Task/Finish特性的用途
- 12.7 在php-fpm或apache中使用swoole
- 12.8 Swoole异步与同步的选择
- 12.9 TCP/UDP压测工具
- 12.10 swoole服务器如何做到无人值守100%可用
- 12.11 MySQL的连接池、异步、断线重连
- 12.12 PHP中哪些函数是同步阻塞的
- 12.13 守护进程程序常用数据结构
- 12.13.1 队列(Queue)
- 12.13.2 堆(Heap)
- 12.13.3 定长数组(SplFixedArray)
- 12.14 使用jemalloc优化swoole内存分配性能
- 12.15 C开发者如何使用Swoole
- 12.16 C++开发者如何使用Swoole
- 12.17 使用systemd管理swoole服务
- 12.18 网卡中断设置
- 12.19 将Swoole静态编译内嵌到PHP
- 12.20 异步回调程序内存管理
- 12.21 日志等级控制
- 12.22 使用 asan 内存检测
- 12.23 Windows编译
- 第十三章 其他
- 13.1 函数列表
- 13.1.1 swoole_set_process_name
- 13.1.2 swoole_version
- 13.1.3 swoole_strerror
- 13.1.4 swoole_errno
- 13.1.5 swoole_get_local_ip
- 13.1.6 swoole_clear_dns_cache
- 13.1.7 swoole_get_local_mac
- 13.1.8 swoole_cpu_num
- 13.3 Swoole技术会议
- 13.4 捐赠Swoole项目
- 13.5 加入Swoole开发组
- 13.6 附录:Linux信号列表
- 13.7 附录:Linux错误信息(errno)列表
- 13.8 附录:TCP连接的状态
- 13.9 附录:tcpdump抓包工具的使用
- 13.10 附录:strace工具的使用
- 13.11 附录:gdb工具的使用
- 13.12 附录:lsof工具的使用
- 13.13 附录:perf工具的使用
- 13.14 附录:编译PHP扩展的相关工具
- 13.15 备用:已移除的历史特性
- 13.15.1 swoole_server->handler
- 13.15.2 task_worker_max
- 13.15.3 swoole_server->addtimer
- 13.15.4 swoole_server->deltimer
- 13.15.5 onTimer
- 13.15.6 swoole_timer_add
- 13.15.7 swoole_timer_del
- 13.15.8 swoole_get_mysqli_sock
- 13.15.9 swoole_mysql_query
- 13.15.10 onMasterConnect
- 13.15.11 onMasterClose
- 13.15.12 Nginx/Golang/Swoole/Node.js的性能对比
- 13.15.13 Coroutine::call_user_func
- 13.15.14 Coroutine::call_user_func_array
- 13.15.15 Coroutine\Channel::select
- 13.16 历史:版本更新记录(1.x)
- 13.16.1 1.10.3
- 13.16.2 1.10.2
- 13.16.3 1.10.1
- 13.16.4 1.10.0
- 13.16.5 1.9.23
- 13.16.6 1.9.22
- 13.16.7 1.9.19
- 13.16.8 1.9.18
- 13.16.9 1.9.17
- 13.16.10 1.9.16
- 13.16.11 1.9.15
- 13.16.12 1.9.14
- 13.16.13 1.9.12
- 13.16.14 1.9.11
- 13.16.15 1.9.9
- 13.16.16 1.9.7
- 13.16.17 1.9.6
- 13.16.18 1.9.5
- 13.16.19 1.9.4
- 13.16.20 1.9.3
- 13.16.21 1.9.2
- 13.16.22 1.9.1
- 13.16.23 1.9.0
- 13.16.24 1.8.13
- 13.16.25 1.8.12
- 13.16.26 1.8.11
- 13.16.27 1.8.10
- 13.16.28 1.8.9
- 13.16.29 1.8.8
- 13.16.30 1.8.7
- 13.16.31 1.8.6
- 13.16.32 1.8.5
- 13.16.33 1.8.4
- 13.16.34 1.8.3
- 13.16.35 1.8.2
- 13.16.36 1.8.1
- 13.16.37 1.8.0
- 13.16.38 1.7.22
- 13.16.39 1.7.21
- 13.16.40 1.7.20
- 13.16.41 1.7.19
- 13.16.42 1.7.18
- 13.16.43 1.7.17
- 13.16.44 1.7.16
- 13.16.45 1.7.15
- 13.16.46 1.7.14
- 13.16.47 1.7.13
- 13.16.48 1.7.12
- 13.16.49 1.7.11
- 13.16.50 1.7.10
- 13.16.51 1.7.9
- 13.16.52 1.7.8
- 13.16.53 1.7.7
- 13.16.54 1.7.6
- 13.16.55 1.7.5
- 13.16.56 v1.5
- 13.16.57 v1.6
- 13.16.58 v1.7
- 13.17 历史:版本更新记录(2.x)
- 13.17.1 2.0.1-Alpha
- 13.17.2 2.0.5
- 13.17.3 2.0.9
- 13.17.4 1.9.21
- 13.17.5 2.0.10
- 13.17.6 2.0.11
- 13.17.7 2.0.12
- 13.17.8 2.0.13
- 13.17.9 2.1.1
- 13.17.10 2.1.2
- 13.17.11 2.2.0
- 13.17.12 3.0.0
- 13.20 参与开源项目指引