swoole-wiki
swoole-wiki copied to clipboard
📖Swoole全量Markdown文档, Swoole-Doc, Swoole-Wiki
Swoole中文文档
全量MarkDown版本
简介
PHP的异步、并行、高性能网络通信引擎,使用纯C语言编写,提供了PHP语言的异步多线程服务器,异步TCP/UDP网络客户端,异步MySQL,异步Redis,数据库连接池,AsyncTask,消息队列,毫秒定时器,异步文件读写,异步DNS查询。 Swoole内置了Http/WebSocket服务器端/客户端、Http2.0服务器端/客户端。
Swoole底层内置了异步非阻塞、多线程的网络IO服务器。PHP程序员仅需处理事件回调即可,无需关心底层。与Nginx/Tornado/Node.js等全异步的框架不同,Swoole既支持全异步,也支持同步。
除了异步IO的支持之外,Swoole为PHP多进程的模式设计了多个并发数据结构和IPC通信机制,可以大大简化多进程并发编程的工作。其中包括了并发原子计数器,并发HashTable,Channel,Lock,进程间通信IPC等丰富的功能特性。
Swoole从2.0版本开始支持了内置协程,可以使用完全同步的代码实现异步程序。PHP代码无需额外增加任何关键词,底层自动进行协程调度,实现异步。
Swoole可以广泛应用于互联网、移动通信、企业软件、网络游戏、物联网、车联网、智能家庭等领域。 使用PHP+Swoole作为网络通信框架,可以使企业IT研发团队的效率大大提升,更加专注于开发创新产品。
Swoole是开源免费的自由软件,授权协议是Apache2.0。企业和个人开发者均可免费使用Swoole的代码,并且在Swoole之上所作的修改可用于商业产品,无需开源(注:必须保留原作者的版权声明)。
1.8.7或更高版本已完全兼容PHP7
2.0.12版本开始不再支持PHP5
快速索引
- 入门指引
- Server
- Coroutine
- Runtime
- Timer
- Memory
- Http\Server
- WebSocket\Server
- Redis\Server
- Process
- Process\Pool
- Client
- Event
- 高级
- 其他
全量目录
-
1 入门指引
-
1.1 环境依赖
-
1.2 编译安装
1.2.1编译参数1.2.2常见错误1.2.3Cygwin
-
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.3.12使用协程客户端1.3.13协程:并发 shell_exec1.3.14协程:Go + Chan + Defer1.3.15协程:实现 Go 语言风格的 defer1.3.16协程:实现 sync.WaitGroup 功能
-
1.4 编程须知
1.4.1sleep/usleep的影响1.4.2exit/die函数的影响1.4.3while循环的影响1.4.4stat缓存清理1.4.5mt_rand随机数1.4.6进程隔离
-
1.5 版本更新记录
1.5.14.3.0 [大版本]1.5.34.2.121.5.44.2.111.5.54.2.101.5.64.2.91.5.74.2.81.5.84.2.71.5.94.2.01.5.104.1.01.5.114.0.11.5.124.0.0
-
1.6 向下不兼容改动
-
1.7 新特性使用
1.7.14.3.0 在 Process 中使用协程1.7.24.3.0 延时事件机制改进1.7.32.1.2 进程池模块的使用1.7.41.9.24 调度支持 Stream 模式1.7.51.9.24 异步客户端自动解析域名1.7.61.9.17 支持异步安全重启特性1.7.71.9.14 使用异步客户端超时机制1.7.81.8.0 使用内置Http异步客户端1.7.91.7.16 使用迭代器遍历Server所有连接1.7.101.7.5 在Server中使用swoole_table1.7.111.7.5 swoole_client支持sendfile接口1.7.121.7.4 SSL隧道加密TCP-Server1.7.131.7.4 task进程中使用毫秒定时器1.7.141.7.3 固定包头+包体协议自动分包1.7.151.7.3 onTask直接return取代finish函数1.7.161.7.2 swoole_process多进程模块的使用1.7.171.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.6BiliBili(哔哩哔哩)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.4Connection refused是怎么回事1.15.5Resource temporarily unavailable [11]1.15.6Cannot assign requested address [99]1.15.7swoole与node.js相比有哪些优势1.15.8swoole与golang相比有哪些优势1.15.9pcre.h: No such file or directory1.15.10undefined symbol: __sync_bool_compare_and_swap_41.15.11学习Swoole需要掌握哪些基础知识1.15.12同步阻塞与异步非阻塞适用场景1.15.13PHP7环境下出现zend_mm_heap corrupted1.15.14Swoole 项目起源和名字由来1.15.15'__builtin_saddl_overflow' was not declared in this scope
-
-
2 Server
-
2.1 函数列表
2.1.1Server::__construct2.1.2Server->set2.1.3Server->on2.1.4Server->addListener2.1.5Server->addProcess2.1.6Server->listen2.1.7Server->start2.1.8Server->reload2.1.9Server->stop2.1.10Server->shutdown2.1.11Server->tick2.1.12Server->after2.1.13Server->defer2.1.14Server->clearTimer2.1.15Server->close2.1.16Server->send2.1.17Server->sendfile2.1.18Server->sendto2.1.19Server->sendwait2.1.20Server->sendMessage2.1.21Server->exist2.1.22Server->pause2.1.23Server->resume2.1.24Server->getClientInfo2.1.25Server->getClientList2.1.26Server->bind2.1.27Server->stats2.1.28Server->task2.1.29Server->taskwait2.1.30Server->taskWaitMulti2.1.31Server->taskCo2.1.32Server->finish2.1.33Server->heartbeat2.1.34Server->getLastError2.1.35Server->getSocket2.1.36Server->protect2.1.37Server->confirm
-
2.2 属性列表
2.2.1Server::$setting2.2.2Server::$master_pid2.2.3Server::$manager_pid2.2.4Server::$worker_id2.2.5Server::$worker_pid2.2.6Server::$taskworker2.2.7Server::$connections2.2.8Server::$ports
-
2.3 配置选项
2.3.1reactor_num2.3.2worker_num2.3.3max_request2.3.4max_conn (max_connection)2.3.5task_worker_num2.3.6task_ipc_mode2.3.7task_max_request2.3.8task_tmpdir2.3.9dispatch_mode2.3.10dispatch_func2.3.11message_queue_key2.3.12daemonize2.3.13backlog2.3.14log_file2.3.15log_level2.3.16heartbeat_check_interval2.3.17heartbeat_idle_time2.3.18open_eof_check2.3.19open_eof_split2.3.20package_eof2.3.21open_length_check2.3.22package_length_type2.3.23package_length_func2.3.24package_max_length2.3.25open_cpu_affinity2.3.26cpu_affinity_ignore2.3.27open_tcp_nodelay2.3.28tcp_defer_accept2.3.29ssl_cert_file2.3.30ssl_method2.3.31ssl_ciphers2.3.32user2.3.33group2.3.34chroot2.3.35pid_file2.3.36pipe_buffer_size2.3.37buffer_output_size2.3.38socket_buffer_size2.3.39enable_unsafe_event2.3.40discard_timeout_request2.3.41enable_reuse_port2.3.42enable_delay_receive2.3.43open_http_protocol2.3.44open_http2_protocol2.3.45open_websocket_protocol2.3.46open_mqtt_protocol2.3.47open_websocket_close_frame2.3.48reload_async2.3.49tcp_fastopen2.3.50request_slowlog_file2.3.51enable_coroutine2.3.52max_coroutine2.3.53task_enable_coroutine
-
2.4 监听端口
2.4.1可选参数2.4.2可选回调2.4.3连接迭代器
-
2.5 预定义常量
-
2.6 事件回调函数
2.6.1onStart2.6.2onShutdown2.6.3onWorkerStart2.6.4onWorkerStop2.6.5onWorkerExit2.6.6onConnect2.6.7onReceive2.6.8onPacket2.6.9onClose2.6.10onBufferFull2.6.11onBufferEmpty2.6.12onTask2.6.13onFinish2.6.14onPipeMessage2.6.15onWorkerError2.6.16onManagerStart2.6.17onManagerStop
-
2.7 高级特性
2.7.1改变Worker进程的用户/组2.7.2回调函数中的 reactor_id 和 fd2.7.3Length_Check 和 EOF_Check 的使用2.7.4Worker与Reactor通信模式2.7.5TCP-Keepalive死连接检测2.7.6TCP服务器心跳维持方案2.7.7多端口监听的使用2.7.8捕获Server运行期致命错误2.7.9Server内存管理机制2.7.10Server的两种运行模式介绍2.7.11Server中对象的4层生命周期2.7.12在worker进程内监听一个Server端口2.7.13在php-fpm/apache中使用task功能
-
2.8 常见问题
2.8.1为什么不要send完后立即close2.8.2如何在回调函数中访问外部的变量2.8.3是否可以共用1个redis或mysql连接2.8.4关于onConnect/onReceive/onClose顺序2.8.54种PHP回调函数风格2.8.6不同的Server程序实例间如何通信2.8.7错误信息:ERROR (9006)2.8.8eventLoop has already been created. unable to create swoole_server
-
2.9 压力测试
2.9.1并发10万TCP连接的测试2.9.2PHP7+Swoole/Nginx/Golang性能对比2.9.3全球Web框架权威性能测试 Techempower Web Framework Benchmarks
-
-
3 Coroutine
-
3.1 Coroutine
3.1.1Coroutine::getCid3.1.2Coroutine::create3.1.3Coroutine::yield3.1.4Coroutine::resume3.1.5Coroutine::defer3.1.6Coroutine::fread3.1.7Coroutine::fgets3.1.8Coroutine::fwrite3.1.9Coroutine::sleep3.1.10Coroutine::gethostbyname3.1.11Coroutine::getaddrinfo3.1.12Coroutine::exec3.1.13Coroutine::readFile3.1.14Coroutine::writeFile3.1.15Coroutine::stats3.1.16Coroutine::statvfs3.1.17Coroutine::getBackTrace3.1.18Coroutine::listCoroutines3.1.19Coroutine::set
-
3.2 Coroutine\Channel
3.2.1Coroutine\Channel->__construct3.2.2Coroutine\Channel->push3.2.3Coroutine\Channel->pop3.2.4Coroutine\Channel->stats3.2.5Coroutine\Channel->close3.2.6Coroutine\Channel->length3.2.7Coroutine\Channel->isEmpty3.2.8Coroutine\Channel->isFull3.2.9Coroutine\Channel->$capacity3.2.10Coroutine\Channel->$errCode
-
3.3 Coroutine\Client
3.3.1Coroutine\Client->connect3.3.2Coroutine\Client->send3.3.3Coroutine\Client->recv3.3.4Coroutine\Client->close3.3.5Coroutine\Client->peek
-
3.4 Coroutine\Http\Client
3.4.1属性列表3.4.2Coroutine\Http\Client->get3.4.3Coroutine\Http\Client->post3.4.4Coroutine\Http\Client->upgrade3.4.5Coroutine\Http\Client->push3.4.6Coroutine\Http\Client->recv3.4.7Coroutine\Http\Client->addFile3.4.8Coroutine\Http\Client->addData3.4.9Coroutine\Http\Client->download
-
3.5 Coroutine\Http2\Client
3.5.1Coroutine\Http2\Client->__construct3.5.2Coroutine\Http2\Client->set3.5.3Coroutine\Http2\Client->connect3.5.4Coroutine\Http2\Client->send3.5.5Coroutine\Http2\Client->write3.5.6Coroutine\Http2\Client->recv3.5.7Coroutine\Http2\Client->close
-
3.6 Coroutine\Redis
3.6.1Coroutine\Redis::__construct3.6.2Coroutine\Redis::setOptions3.6.3属性列表3.6.4事务模式3.6.5订阅模式
-
3.7 Coroutine\Socket
3.7.1Coroutine\Socket::__construct3.7.2Coroutine\Socket->bind3.7.3Coroutine\Socket->listen3.7.4Coroutine\Socket->accept3.7.5Coroutine\Socket->connect3.7.6Coroutine\Socket->send3.7.7Coroutine\Socket->recv3.7.8Coroutine\Socket->sendto3.7.9Coroutine\Socket->recvfrom3.7.10Coroutine\Socket->getsockname3.7.11Coroutine\Socket->getpeername3.7.12Coroutine\Socket->close
-
3.8 Coroutine\MySQL
3.8.1属性列表3.8.2Coroutine\MySQL->connect3.8.3Coroutine\MySQL->query3.8.4Coroutine\MySQL->prepare3.8.5Coroutine\MySQL->escape3.8.6Coroutine\MySQL\Statement->execute3.8.7Coroutine\MySQL\Statement->fetch3.8.8Coroutine\MySQL\Statement->fetchAll3.8.9Coroutine\MySQL\Statement->nextResult
-
3.9 Coroutine\PostgreSQL
3.9.1Coroutine\PostgreSQL->connect3.9.2Coroutine\PostgreSQL->query3.9.3Coroutine\PostgreSQL->fetchAll3.9.4Coroutine\PostgreSQL->affectedRows3.9.5Coroutine\PostgreSQL->numRows3.9.6Coroutine\PostgreSQL->fetchObject3.9.7Coroutine\PostgreSQL->fetchAssoc3.9.8Coroutine\PostgreSQL->fetchArray3.9.9Coroutine\PostgreSQL->fetchRow3.9.10Coroutine\PostgreSQL->metaData
-
3.10 Server
-
3.11 并发调用
3.11.1setDefer 机制3.11.2子协程+通道
-
3.12 实现原理
3.12.1协程与线程3.12.2发送数据协程调度3.12.3协程内存开销3.12.44.0 协程实现原理3.12.5协程客户端超时规则3.12.6协程执行流程
-
3.13 常见问题
3.13.1运行中出现 Fatal error: Maximum function nesting level of '1000' reached, aborting!3.13.2为什么只能在回调函数中使用协程客户端3.13.3支持协程的回调方法列表3.13.4错误信息: XXXX client has already been bound to another coroutine3.13.5Swoole4 协程与 PHP 的 Yield/Generator 协程有什么区别3.13.6Swoole4 协程与 Go 协程有哪些区别
-
3.14 编程须知
3.14.1在多个协程间共用同一个协程客户端3.14.2禁止使用协程 API 的场景(2.x 版本)3.14.3使用类静态变量/全局变量保存上下文3.14.4退出协程3.14.5异常处理
-
3.15 扩展组件
3.15.1MongoDB
-
3.16 编程调试
-
-
4 Runtime
-
4.1 文件操作
-
4.2 睡眠函数
-
4.3 开关选项
-
4.4 严格模式
-
-
5 Timer
-
5.1 swoole_timer_tick
-
5.2 swoole_timer_after
-
5.3 swoole_timer_clear
-
-
6 Memory
-
6.1 Lock
6.1.1swoole_lock->__construct6.1.2swoole_lock->lock6.1.3swoole_lock->trylock6.1.4swoole_lock->unlock6.1.5swoole_lock->lock_read6.1.6swoole_lock->trylock_read6.1.7swoole_lock->lockwait
-
6.2 Buffer
6.2.1swoole_buffer->__construct6.2.2swoole_buffer->append6.2.3swoole_buffer->substr6.2.4swoole_buffer->clear6.2.5swoole_buffer->expand6.2.6swoole_buffer->write6.2.7swoole_buffer->read6.2.8swoole_buffer->recycle
-
6.3 Table
6.3.1Table->__construct6.3.2Table->column6.3.3Table->create6.3.4Table->set6.3.5Table->incr6.3.6Table->decr6.3.7Table->get6.3.8Table->exist6.3.9Table->count6.3.10Table->del
-
6.4 Atomic
6.4.1swoole_atomic->__construct6.4.2swoole_atomic->add6.4.3swoole_atomic->sub6.4.4swoole_atomic->get6.4.5swoole_atomic->set6.4.6swoole_atomic->cmpset6.4.7swoole_atomic->wait6.4.8swoole_atomic->wakeup
-
6.5 mmap
6.5.1swoole_mmap::open
-
6.6 Channel
6.6.1Channel->__construct6.6.2Channel->push6.6.3Channel->pop6.6.4Channel->stats
-
6.7 Serialize
6.7.1swoole_serialize::pack6.7.2swoole_serialize::unpack
-
-
7 Http\Server
-
7.1 Http\Server
7.1.1Http\Server->on7.1.2Http\Server->start
-
7.2 Http\Request
7.2.1Http\Request->$header7.2.2Http\Request->$server7.2.3Http\Request->$get7.2.4Http\Request->$post7.2.5Http\Request->$cookie7.2.6Http\Request->$files7.2.7Http\Request->rawContent7.2.8Http\Request->getData
-
7.3 Http\Response
7.3.1Http\Response->header7.3.2Http\Response->cookie7.3.3Http\Response->status7.3.4Http\Response->gzip7.3.5Http\Response->redirect7.3.6Http\Response->write7.3.7Http\Response->sendfile7.3.8Http\Response->end7.3.9Http\Response->detach7.3.10Http\Response::create
-
7.4 配置选项
7.4.1upload_tmp_dir7.4.2http_parse_post7.4.3document_root7.4.4http_compression
-
7.5 常见问题
7.5.1CURL发送POST请求服务器端超时7.5.2使用Chrome访问服务器会产生2次请求7.5.3GET/POST请求的最大尺寸
-
-
8 WebSocket\Server
-
8.1 回调函数
8.1.1onHandShake8.1.2onOpen8.1.3onMessage
-
8.2 函数列表
8.2.1WebSocket\Server->push8.2.2WebSocket\Server->exist8.2.3WebSocket\Server::pack8.2.4WebSocket\Server::unpack8.2.5WebSocket\Server->disconnect8.2.6WebSocket\Server->isEstablished
-
8.3 预定义常量
-
8.4 常见问题
-
8.5 配置选项
-
8.6 WebSocket\Frame
-
-
9 Redis\Server
-
9.1 方法
9.1.1Redis\Server->setHandler9.1.2Redis\Server::format
-
9.2 常量
-
-
10 Process
-
10.1 Process::__construct
-
10.2 Process->start
-
10.3 Process->name
-
10.4 Process->exec
-
10.5 Process->write
-
10.6 Process->read
-
10.7 Process->setTimeout
-
10.8 Process->setBlocking
-
10.9 Process->useQueue
-
10.10 Process->statQueue
-
10.11 Process->freeQueue
-
10.12 Process->push
-
10.13 Process->pop
-
10.14 Process->close
-
10.15 Process->exit
-
10.16 Process::kill
-
10.17 Process::wait
-
10.18 Process::daemon
-
10.19 Process::signal
-
10.20 Process::alarm
-
10.21 Process::setAffinity
-
10.22 Process::exportSocket
-
-
11 Process\Pool
-
11.1 Process\Pool::__construct
-
11.2 Process\Pool->on
-
11.3 Process\Pool->listen
-
11.4 Process\Pool->write
-
11.5 Process\Pool->start
-
11.6 Process\Pool->getProcess
-
-
12 Client
-
12.1 方法列表
12.1.1swoole_client::__construct12.1.2swoole_client->set12.1.3swoole_client->on12.1.4swoole_client->connect12.1.5swoole_client->isConnected12.1.6swoole_client->getSocket12.1.7swoole_client->getSockName12.1.8swoole_client->getPeerName12.1.9swoole_client->getPeerCert12.1.10swoole_client->send12.1.11swoole_client->sendto12.1.12swoole_client->sendfile12.1.13swoole_client->recv12.1.14swoole_client->close12.1.15swoole_client->sleep12.1.16swoole_client->wakeup12.1.17swoole_client->enableSSL
-
12.2 回调函数
12.2.1onConnect12.2.2onError12.2.3onReceive12.2.4onClose12.2.5onBufferFull12.2.6onBufferEmpty
-
12.3 属性列表
12.3.1swoole_client->errCode12.3.2swoole_client->sock12.3.3swoole_client->reuse
-
12.4 并行
12.4.1swoole_client_select12.4.2TCP客户端异步连接12.4.3SWOOLE_KEEP建立TCP长连接
-
12.5 常量
-
12.6 配置选项
12.6.1ssl_verify_peer12.6.2ssl_host_name12.6.3ssl_cafile12.6.4ssl_capath12.6.5package_length_func12.6.6http_proxy_host
-
12.7 常见问题
-
-
13 Event
-
13.1 swoole_event_add
-
13.2 swoole_event_set
-
13.3 swoole_event_isset
-
13.4 swoole_event_write
-
13.5 swoole_event_del
-
13.6 swoole_event_exit
-
13.7 swoole_event_defer
-
13.8 swoole_event_cycle
-
13.9 swoole_event_wait
-
13.10 swoole_event_dispatch
-
13.11 常见问题
13.11.1epoll_wait 偶尔会用很长时间
-
-
15 高级
-
15.1 Swoole的实现
-
15.2 Reactor线程
-
15.3 Manager进程
-
15.4 Worker进程
-
15.5 Reactor、Worker、TaskWorker的关系
-
15.6 Task/Finish特性的用途
-
15.7 在php-fpm或apache中使用swoole
-
15.8 Swoole异步与同步的选择
-
15.9 TCP/UDP压测工具
-
15.10 swoole服务器如何做到无人值守100%可用
-
15.11 MySQL的连接池、异步、断线重连
-
15.12 PHP中哪些函数是同步阻塞的
-
15.13 守护进程程序常用数据结构
15.13.1队列(Queue)15.13.2堆(Heap)15.13.3定长数组(SplFixedArray)
-
15.14 使用jemalloc优化swoole内存分配性能
-
15.15 C开发者如何使用Swoole
-
15.16 C++开发者如何使用Swoole
-
15.17 使用systemd管理swoole服务
-
15.18 网卡中断设置
-
15.19 将Swoole静态编译内嵌到PHP
-
15.20 异步回调程序内存管理
-
15.21 日志等级控制
-
15.22 使用 asan 内存检测
-
15.23 Windows编译
-
15.24 Swoole协程之旅-前篇
-
15.25 Swoole协程之旅-中篇
-
15.26 Swoole协程之旅-后篇
-
15.27 协程CPU密集场景调度实现
-
-
16 其他
-
16.1 函数列表
16.1.1swoole_set_process_name16.1.2swoole_version16.1.3swoole_strerror16.1.4swoole_errno16.1.5swoole_get_local_ip16.1.6swoole_clear_dns_cache16.1.7swoole_get_local_mac16.1.8swoole_cpu_num16.1.9swoole_last_error
-
16.3 Swoole技术会议
-
16.4 工作组(Working Groups)
-
16.5 参与开源项目指引
-
16.6 捐赠Swoole项目
-
16.7 加入Swoole开发组
-
16.8 非协程特性独立扩展 (swoole_async)
-
16.9 附录:Linux信号列表
-
16.10 附录:Linux错误码(errno)列表
-
16.11 附录:Swoole错误码列表
-
16.12 附录:TCP连接的状态
-
16.13 附录:tcpdump抓包工具的使用
-
16.14 附录:strace工具的使用
-
16.15 附录:gdb工具的使用
-
16.16 附录:lsof工具的使用
-
16.17 附录:perf工具的使用
-
16.18 附录:编译PHP扩展的相关工具
-
16.19 备用:已移除的历史特性
16.19.1swoole_server->handler16.19.2task_worker_max16.19.3swoole_server->addtimer16.19.4swoole_server->deltimer16.19.5onTimer16.19.6swoole_timer_add16.19.7swoole_timer_del16.19.8swoole_get_mysqli_sock16.19.9swoole_mysql_query16.19.10onMasterConnect16.19.11onMasterClose16.19.12Nginx/Golang/Swoole/Node.js的性能对比16.19.13Coroutine::call_user_func16.19.14Coroutine::call_user_func_array16.19.15Coroutine\Channel::select16.19.16task_async
-
16.20 历史:版本更新记录(1.x)
16.20.11.10.316.20.21.10.216.20.31.10.116.20.41.10.016.20.51.9.2316.20.61.9.2216.20.71.9.1916.20.81.9.1816.20.91.9.1716.20.101.9.1616.20.111.9.1516.20.121.9.1416.20.131.9.1216.20.141.9.1116.20.151.9.916.20.161.9.716.20.171.9.616.20.181.9.516.20.191.9.416.20.201.9.316.20.211.9.216.20.221.9.116.20.231.9.016.20.241.8.1316.20.251.8.1216.20.261.8.1116.20.271.8.1016.20.281.8.916.20.291.8.816.20.301.8.716.20.311.8.616.20.321.8.516.20.331.8.416.20.341.8.316.20.351.8.216.20.361.8.116.20.371.8.016.20.381.7.2216.20.391.7.2116.20.401.7.2016.20.411.7.1916.20.421.7.1816.20.431.7.1716.20.441.7.1616.20.451.7.1516.20.461.7.1416.20.471.7.1316.20.481.7.1216.20.491.7.1116.20.501.7.1016.20.511.7.916.20.521.7.816.20.531.7.716.20.541.7.616.20.551.7.516.20.56v1.516.20.57v1.616.20.58v1.7
-
16.21 历史:版本更新记录(2.x)
16.21.12.0.1-Alpha16.21.22.0.516.21.32.0.916.21.41.9.2116.21.52.0.1016.21.62.0.1116.21.72.0.1216.21.82.0.1316.21.92.1.116.21.102.1.216.21.112.2.016.21.123.0.0
-
16.22 历史:版本更新记录(4.x)
16.22.14.0.316.22.24.0.216.22.34.0.416.22.44.1.116.22.54.1.216.22.64.2.116.22.74.2.216.22.84.2.316.22.94.2.416.22.104.2.516.22.114.2.616.22.124.2.716.22.134.2.916.22.144.2.8
-