1.9版本增加了多项新特性,修复了多个已知问题。1.9版本是100%向下兼容1.8的,用户可无缝升级。
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();
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);
swoole-1.9新增了一个新的内存数据结构Channel,类似于Go的chan,底层基于共享内存+Mutex互斥锁实现,可实现用户态的高性能内存队列。
$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);
}
swoole-1.9增加了一个新的模块,提供了对操作系统mmap的封装。使用mmap 可以很方便地将一个磁盘文件映射为内存,读写性能更高。
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
无效的问题WebSocket
客户端websocket_mask
无效的问题MySQL
客户端在记录条数过多时偶然崩溃的问题taskWaitMulti
在进程返回超过8K时接收超时的问题atmoic
的add
和sub
返回值存在的数据同步问题