Swoole 1.9 正式版发布,增加多项新特性
matyhtf 2016年11月22日

Swoole 1.9 正式版发布,增加多项新特性

matyhtf matyhtf 发布于2016年11月22日 收藏 17

玩转软件开发云,集华为近30年研发精华开发神器!>>>  

Swoole 1.9 正式版发布了。

PHP的异步、并行、高性能网络通信引擎Swoole 已发布 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,类似于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 可以很方便地将一个磁盘文件映射为内存,读写性能更高。

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返回值存在的数据同步问题

下载地址:

本站文章除注明转载外,均为本站原创或编译。欢迎任何形式的转载,但请务必注明出处,尊重他人劳动共创开源社区。
转载请注明:文章转载自 开源中国社区 [http://www.oschina.net]
本文标题:Swoole 1.9 正式版发布,增加多项新特性
分享
评论(20)
精彩评论
3
很实用的特性,大家可以升级了。
1
大神编译成功之后为啥总有这种报错?见最后两行

silen@Silen-MacBook-Pro ~/Downloads/swoole-src-1.9.0-stable$ php --ri swoole

swoole

swoole support => enabled
Version => 1.9.0
Author => tianfeng.han[email: mikan.tenny@gmail.com]
kqueue => enabled
rwlock => enabled
async redis client => enabled
async http/websocket client => enabled
sockets => enabled
openssl => enabled
http2 => enabled
ringbuffer => enabled
pcre => enabled
zlib => enabled
jemalloc => enabled
hugepage => enabled

Directive => Local Value => Master Value
swoole.aio_thread_num => 2 => 2
swoole.display_errors => On => On
swoole.use_namespace => Off => Off
swoole.message_queue_key => 0 => 0
swoole.unixsock_buffer_size => 8388608 => 8388608
Magick: abort due to signal 11 (SIGSEGV) "Segmentation Fault"...
Abort trap: 6
最新评论
0

引用来自“晨雨零稀”的评论

文档太挫,高高在上的样子。

引用来自“digmeup”的评论

s b,不是开源了吗,有种你去丰富文档啊

引用来自“晨雨零稀”的评论

@digmeup 我只是陈述事实,没有其他意思,请不要随便开喷。
已删除带有人身攻击的评论。
0
文档太挫,高高在上的样子。
0
盖楼+1
0
还没有兼容PHP7吗?
0

引用来自“matyhtf”的评论

./configure --with-php-config=/usr/local/bin/php-config --enable-sockets --enable-ringbuffer --enable-async-redis --enable-openssl --enable-http2 --enable-thread --enable-hugepage --enable-swoole --with-swoole

有些编译选项尚处于试验阶段,正常使用请勿开启,根据需要设置编译选项。
:ok_hand::+1:
0
./configure --with-php-config=/usr/local/bin/php-config --enable-sockets --enable-ringbuffer --enable-async-redis --enable-openssl --enable-http2 --enable-thread --enable-hugepage --enable-swoole --with-swoole

有些编译选项尚处于试验阶段,正常使用请勿开启,根据需要设置编译选项。
0

引用来自“lengspring”的评论

大神编译成功之后为啥总有这种报错?见最后两行

silen@Silen-MacBook-Pro ~/Downloads/swoole-src-1.9.0-stable$ php --ri swoole

swoole

swoole support => enabled
Version => 1.9.0
Author => tianfeng.han[email: mikan.tenny@gmail.com]
kqueue => enabled
rwlock => enabled
async redis client => enabled
async http/websocket client => enabled
sockets => enabled
openssl => enabled
http2 => enabled
ringbuffer => enabled
pcre => enabled
zlib => enabled
jemalloc => enabled
hugepage => enabled

Directive => Local Value => Master Value
swoole.aio_thread_num => 2 => 2
swoole.display_errors => On => On
swoole.use_namespace => Off => Off
swoole.message_queue_key => 0 => 0
swoole.unixsock_buffer_size => 8388608 => 8388608
Magick: abort due to signal 11 (SIGSEGV) "Segmentation Fault"...
Abort trap: 6

引用来自“oreak”的评论

内存太小了吧
经测试jemalloc的问题,关闭后重新编译就OK了,我使用的版本是jemalloc v4.2.1_1
./configure --with-php-config=/usr/local/bin/php-config --enable-sockets --enable-ringbuffer --enable-async-redis --enable-openssl --enable-http2 --enable-thread --enable-hugepage --enable-swoole --with-swoole

silen@Silen-MacBook-Pro ~/Downloads/swoole-src-1.9.0-stable$ php --ri swoole

swoole

swoole support => enabled
Version => 1.9.0
Author => tianfeng.han[email: mikan.tenny@gmail.com]
kqueue => enabled
rwlock => enabled
async redis client => enabled
async http/websocket client => enabled
sockets => enabled
openssl => enabled
http2 => enabled
ringbuffer => enabled
pcre => enabled
zlib => enabled
hugepage => enabled

Directive => Local Value => Master Value
swoole.aio_thread_num => 2 => 2
swoole.display_errors => On => On
swoole.use_namespace => Off => Off
swoole.message_queue_key => 0 => 0
swoole.unixsock_buffer_size => 8388608 => 8388608
0

引用来自“lengspring”的评论

大神编译成功之后为啥总有这种报错?见最后两行

silen@Silen-MacBook-Pro ~/Downloads/swoole-src-1.9.0-stable$ php --ri swoole

swoole

swoole support => enabled
Version => 1.9.0
Author => tianfeng.han[email: mikan.tenny@gmail.com]
kqueue => enabled
rwlock => enabled
async redis client => enabled
async http/websocket client => enabled
sockets => enabled
openssl => enabled
http2 => enabled
ringbuffer => enabled
pcre => enabled
zlib => enabled
jemalloc => enabled
hugepage => enabled

Directive => Local Value => Master Value
swoole.aio_thread_num => 2 => 2
swoole.display_errors => On => On
swoole.use_namespace => Off => Off
swoole.message_queue_key => 0 => 0
swoole.unixsock_buffer_size => 8388608 => 8388608
Magick: abort due to signal 11 (SIGSEGV) "Segmentation Fault"...
Abort trap: 6

引用来自“oreak”的评论

内存太小了吧
macOS 10.12.1 (16B2555) 8G内存
0

引用来自“lengspring”的评论

大神编译成功之后为啥总有这种报错?见最后两行

silen@Silen-MacBook-Pro ~/Downloads/swoole-src-1.9.0-stable$ php --ri swoole

swoole

swoole support => enabled
Version => 1.9.0
Author => tianfeng.han[email: mikan.tenny@gmail.com]
kqueue => enabled
rwlock => enabled
async redis client => enabled
async http/websocket client => enabled
sockets => enabled
openssl => enabled
http2 => enabled
ringbuffer => enabled
pcre => enabled
zlib => enabled
jemalloc => enabled
hugepage => enabled

Directive => Local Value => Master Value
swoole.aio_thread_num => 2 => 2
swoole.display_errors => On => On
swoole.use_namespace => Off => Off
swoole.message_queue_key => 0 => 0
swoole.unixsock_buffer_size => 8388608 => 8388608
Magick: abort due to signal 11 (SIGSEGV) "Segmentation Fault"...
Abort trap: 6
内存太小了吧
0
pipe, Channel, onBufferFull 这些东西不都是 Workerman 的么。。。
1
大神编译成功之后为啥总有这种报错?见最后两行

silen@Silen-MacBook-Pro ~/Downloads/swoole-src-1.9.0-stable$ php --ri swoole

swoole

swoole support => enabled
Version => 1.9.0
Author => tianfeng.han[email: mikan.tenny@gmail.com]
kqueue => enabled
rwlock => enabled
async redis client => enabled
async http/websocket client => enabled
sockets => enabled
openssl => enabled
http2 => enabled
ringbuffer => enabled
pcre => enabled
zlib => enabled
jemalloc => enabled
hugepage => enabled

Directive => Local Value => Master Value
swoole.aio_thread_num => 2 => 2
swoole.display_errors => On => On
swoole.use_namespace => Off => Off
swoole.message_queue_key => 0 => 0
swoole.unixsock_buffer_size => 8388608 => 8388608
Magick: abort due to signal 11 (SIGSEGV) "Segmentation Fault"...
Abort trap: 6
0
Swoole:PHP界取代Node的壮志雄心
我提供的 #PHPDroid# 打包了PHP7+Swoole,方便广大PHP程序员在Android上使用.
0
:thumbsup:强大,更新特性多!
0
6666又出新版本了,马上升级测试
3
很实用的特性,大家可以升级了。
0
火钳刘明
0
一定火,留名
0
+1s
0
:+1:
0
好叼

相关资讯

最新资讯
热门资讯
顶部