ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
# 1.9.0 [TOC] 1.9版本增加了多项新特性,修复了多个已知问题。1.9版本是100%向下兼容1.8的,用户可无缝升级。 ## 新增RedisServer框架 Swoole-1.9增加了一个兼容`Redis`服务器端协议的Server框架,可基于此框架实现Redis服务器,支持自定义指令。 #### 示例: ~~~ use Swoole\Redis\Server; $server = new Server('127.0.0.1', 9501); $server->setHandler('Set', function($fd, $data) { $server->array($data[0], $data[1]); return Server::format(Server::INT, 1); }); $server->start(); ~~~ ## 客户端增加pipe函数 Swoole-1.9为异步TCP客户端增加了一个`pipe`方法,可以将客户端收到的数据重定向到另外一个文件描述符,可以是服务器的连接fd、stream资源、sockets资源、其他Swoole\\Client、Swoole\\Process的管道。 #### 示例: ~~~ use Swoole\Client; $client = new Client(SWOOLE_TCP | SWOOLE_ASYNC); $client->on("error", function() { echo "connect failed\n"; }); $client->on("close", function() { echo "connect closed\n"; }); $client->on("connect", function($cli) { //将数据重定向到标准输出,服务器向客户端发送的所有数据会打印到屏幕 $cli->pipe(STDOUT); }); $client->connect("127.0.0.1", 9501); ~~~ ## 新增缓存区事件 1.9增加了2个新的事件回调`onBufferFull`和`onBufferEmpty`,以及2个新的配置项`buffer_high_watermark`和`buffer_low_watermark`。 如果写入的数据过多缓存区尺寸超过`buffer_high_watermark`就触发`onBufferFull`事件,当缓存区数据发送完成,水位低于`buffer_low_watermark`的值,会触发`onBufferEmpty`事件。 缓存区事件同时可用于`Server`和`Client`。 #### 示例: ~~~ $client = new Swoole\Client(SWOOLE_SOCK_TCP, SWOOLE_SOCK_ASYNC); //设置事件回调函数 $client->on("connect", function($cli) { $cli->send("hello world\n"); }); $client->on("receive", function($cli, $data) { echo "Received: ".$data."\n"; }); $client->on("error", function($cli) { echo "Connect failed\n"; }); $client->on("close", function($cli) { echo "Connection close\n"; }); $client->on("bufferFull", function($cli) { //暂停数据接收 $cli->pause(); }); $client->on("bufferEmpty", function($cli) { //恢复数据接收 $cli->resume(); }); //发起网络连接 $client->connect('127.0.0.1', 9501, 0.5); ~~~ ## 新增Channel模块 swoole-1.9新增了一个新的内存数据结构[Channel](http://wiki.swoole.com/wiki/page/p-channel.html),类似于Go的chan,底层基于共享内存+Mutex互斥锁实现,可实现用户态的高性能内存队列。 * Channel可用于多进程环境下,底层在读取写入时会自动加锁,应用层不需要担心数据同步问题 * 必须在父进程内创建才可以在子进程内使用 #### 示例: ~~~ $chan = new Swoole\Channel(2 * 1024 * 1024); //2M $chan->push(1234); $chan->push("hello world"); $chan->push(array(1234, 4567)); while($r = $chan->pop()) { var_dump($r); } ~~~ ## 新增mmap模块 swoole-1.9增加了一个新的模块,提供了对操作系统mmap的封装。使用[mmap](http://wiki.swoole.com/wiki/page/p-mmap.html)可以很方便地将一个磁盘文件映射为内存,读写性能更高。 mmap可以减少读写磁盘操作的IO消耗、减少内存拷贝。在实现高性能的磁盘操作程序中,可以使用mmap来提升性能。 #### 示例: ~~~ $file = __DIR__.'/data'; $size = 8192; $fp = swoole\mmap::open($file, 8192); fwrite($fp, "hello world\n"); fwrite($fp, "hello swoole\n"); fflush($fp); fclose($fp); ~~~ ## 其他新增特性 * 增加`swoole_clear_dns_cache`函数,可清除底层的DNS缓存 ## 问题修复 * 修复`Redis`客户端`type`方法无法返回字符串的问题 * 修复`Http\Client`无法重用的问题 * 修复同步客户端长度协议`package_max_length`无效的问题 * 修复低版本gcc下长期运行偶然发生崩溃的问题 * 修复异步`WebSocket`客户端`websocket_mask`无效的问题 * 修复`MySQL`客户端在记录条数过多时偶然崩溃的问题 * 修复Mac平台下task超过8K时创建临时文件失败的导致无法投递任务的问题 * 修复`taskWaitMulti`在进程返回超过8K时接收超时的问题 * 修复`atmoic`的`add`和`sub`返回值存在的数据同步问题