Swoole 2.0 正式版发布,协程特性支持 PHP 7
matyhtf 2017年01月03日

Swoole 2.0 正式版发布,协程特性支持 PHP 7

matyhtf matyhtf 发布于2017年01月03日 收藏 39 评论 98

腾讯云-1小时搭建人工智能应用,让技术更容易入门>>>  

Swoole 2.0正式版发布了。2.0版本最大的更新是增加了对协程(Coroutine)的支持。正式版已同时支持PHP5和PHP7。基于Swoole2.0协程PHP开发者可以已同步的方式编写代码,底层自动进行协程调度,转变为异步IO。解决了传统异步编程嵌套回调的问题。

与Node.js(ES6+)、Python等语言使用yield/generator、async/await的实现方式相比,Swoole协程无需修改代码添加额外的关键词。

与Go语言的goroutine相比,Swoole协程是内置式的,应用层代码无需添加go关键词启动协程,只需要使用封装好的协程客户端即可,使用更简单。另外Swoole协程的IO组件在底层内置了超时机制,不需要使用复杂的select/chan/timer实现客户端超时。

目前Swoole底层内置的协程客户端组件包括:udpclient、tcpclient、httpclient、redisclient、mysqlclient,基本涵盖了开发者常用的几种通信协议。协程组件只能在服务器的onConnect、onRequest、onReceive、onMessage 回调函数中使用。

使用示例:

$server = new Swoole\Http\Server('127.0.0.1', 9501);

/*
    触发on request事件时,SWOOLE会开辟一个协程栈,对协程栈进行初始化
 */
$server->on('Request', function ($request, $response) {
    $tcp_cli = new Swoole\Coroutine\Client(SWOOLE_SOCK_TCP);
    /**
        client在调用connect函数后,SWOOLE会将PHP上下文信息保存到当前栈内
        然后将协程挂起,待确认连接成功后,触发epoll事件,然后协程切换
        恢复PHP上下文信息,返回结果,继续执行PHP代码
     */
    if ($tcp_cli->connect('127.0.0.1', 9906) === false) {
        $response->end("connect server failed.");
        return;
    }
    $tcp_cli->send('test for the coro');
    /*
        client在调用recv函数后,SWOOLE会将PHP上下文信息保存到当前栈内
        然后将协程挂起待后端svr回包,触发epoll事件,然后协程切换
        恢复PHP上下文信息,返回结果,继续执行PHP代码
        如果后端在设定的超时时间内,未能回包,返回false
        client的errCode定为110
     */
    $ret = $tcp_cli->recv(100);
    $tcp_cli->close();
    if ($ret) {
        $response->end(" swoole response is ok");
    } else {
        $response->end(" recv failed error : {$tcp_cli->errCode}");
    }
});

$server->start();

UDP客户端

$udp_cli = new Swoole\Coroutine\Client(SWOOLE_SOCK_UDP);

$ret = $udp_cli->connect('127.0.0.1', 9906);
$udp_cli->send('test for the coro');

$ret = $udp_cli->recv(100);
$udp_cli->close();

if ($ret)
{
    $response->end("swoole response is ok");
}
else
{
    $response->end("recv failed error : {$client->errCode}");
}

MySQL客户端

$swoole_mysql = new Swoole\Coroutine\MySQL();
$swoole_mysql->connect([
    'host' => '127.0.0.1',
    'user' => 'user',
    'password' => 'pass',
    'database' => 'test'
]);
$res = $swoole_mysql->query('select sleep(1)');

Redis客户端

$redis = new Swoole\Coroutine\Redis();
$redis->connect('127.0.0.1', 6379);
$val = $redis->get('key');

Http客户端

$cli = new Swoole\Coroutine\Http\Client('127.0.0.1', 80);
$cli->setHeaders([
    'Host' => "localhost",
    "User-Agent" => 'Chrome/49.0.2587.3',
    'Accept' => 'text/html,application/xhtml+xml,application/xml',
    'Accept-Encoding' => 'gzip',
]);
$cli->set([ 'timeout' => 1]);
$cli->get('/index.php');
echo $cli->body;  
$cli->close();

下载地址:

本站文章除注明转载外,均为本站原创或编译。欢迎任何形式的转载,但请务必注明出处,尊重他人劳动共创开源社区。
转载请注明:文章转载自 开源中国社区 [http://www.oschina.net]
本文标题:Swoole 2.0 正式版发布,协程特性支持 PHP 7
分享
评论(98)
精彩评论
20
swoole顾问·向东发来贺电,Swoole的确很犀利,能在Node/Go下面顽强生长,体现了PHP人的一个追求极致又符合用户需求的拿捏,PHP如果说高端人才在哪儿蛰伏的话,我觉得就在Swoole里面,祝Swoole越来越好, 2.0永远思考在Web需求的最前面,给中小型站长和技术人员一把锋利的小刀,任它各种语言风吹雨打,总被Swoole风流去,这就是Swoole,你值得拥有:),话说太多,不看广告看疗效,这也是一种朴实的工具,非常符合微信用完及走的设计套路,如果说当今唯有套路得人心,那么,Swoole理应该是PHPer的一个最好的冲击物联网的最好工具,没有第二,This is it ,EOF。
11
文档能跟上就完美了
5
有了这个 2.0,用 php 来写 hprose 服务方便多了。
2
“协程组件只能在服务器的onConnect、onRequest、onReceive、onMessage 回调函数中使用” 这句话不知道是什么意思,如果是真的“协程组件只能在服务器的onConnect、onRequest、onReceive、onMessage 回调函数中使用”,对大型项目的开发代码没法管理,不知道我理解的对不对?
1
为什么看了会有一种民族骄傲的感觉。
最新评论
0
很厉害
0
还没有具体测试使用,但我感觉Swoole就是我想要的了
0
拍簧片的好多
0
文档啊 文档
0
看起来还不错\<a href=\"http://www.jstxdm.com\"\>js特效代码\<\/a\>
0

引用来自“半仙w”的评论

“协程组件只能在服务器的onConnect、onRequest、onReceive、onMessage 回调函数中使用” 这句话不知道是什么意思,如果是真的“协程组件只能在服务器的onConnect、onRequest、onReceive、onMessage 回调函数中使用”,对大型项目的开发代码没法管理,不知道我理解的对不对?
协程要保存堆栈,那么协程的 yield 发起就必须在一个闭包中,也就是一个函数,方法,或者匿名函数之类的,所以必须在上面提到的那些回调函数中。但是协程本身实现不需要写回调。
1
为什么看了会有一种民族骄傲的感觉。
0
然而文档实在是不知道该说什么好(手动微笑 :) )
0
666
0
NB
0
Look this ripoffreport from ripoffreport.com Don Tigert Don Tigert Don Tigert Don Tigert Don Tigert Don Tigert sala rodd sala rodd sala rodd sala rodd sala rodd sala rodd sala rodd sala rodd park ward park ward park ward park ward park ward park ward park ward Look this ripoffreport from ripoffreport.com Don Tigert Don Tigert Don Tigert Don Tigert Don Tigert Don Tigert sala rodd sala rodd sala rodd sala rodd sala rodd sala rodd sala rodd sala rodd park ward park ward park ward park ward park ward park ward park ward Look this ripoffreport from ripoffreport.com Don Tigert Don Tigert Don Tigert Don Tigert Don Tigert Don Tigert sala rodd sala rodd sala rodd sala rodd sala rodd sala rodd sala rodd sala rodd park ward park ward park ward park ward park ward park ward park ward
Don Tigert http://www.ripoffreport.com/r/don-tigert/longview-texas-75604/don-tigert-baccarat-personal-training-seminar-promised-to-teach-a-winning-method-delivere-649060
0

引用来自“LiangJ_OSC”的评论

NB
@LiangJ_OSC
0
NB
0
6666666
0
加油,祝swoole和php越来越好
0

引用来自“青衫柏箴”的评论

很多PHP的扩展和三方包都不能直接在swoole下使用。swoole只有自己来造各种扩展和客户端。学习swoole跟学习一门新语言也没什么区别了。
对于新发行的数据库比如ArangoDB可能就需要自己从tcp层封装一个异步的连接库,是这样吗?
1

引用来自“青衫柏箴”的评论

很多PHP的扩展和三方包都不能直接在swoole下使用。swoole只有自己来造各种扩展和客户端。学习swoole跟学习一门新语言也没什么区别了。

引用来自“半桶水_桶哥”的评论

可以用呀,完全兼容所以的php扩展和代码库,当然不排除某些扩展本身有bug.

引用来自“青衫柏箴”的评论

异步程序要求代码中不得包含任何同步阻塞操作
异步与同步代码不能混用,一旦应用程序使用了任何同步阻塞的代码,程序即退化为同步模式。
以上两条直接导致很多为传统模式开发的三方库不能使用了。我理解就是比如很多服务的php sdk 你要在swoole里使用还要用swoole的异步tcp或者http客户端去改写。
不像node.js 天生就是支持异步的。所以我宁愿学习一门其他语言。
还有,你说的node.js天生异步,理解上也是有些偏差的,同步阻塞可不仅仅只包括i/o的。
0

引用来自“青衫柏箴”的评论

很多PHP的扩展和三方包都不能直接在swoole下使用。swoole只有自己来造各种扩展和客户端。学习swoole跟学习一门新语言也没什么区别了。

引用来自“半桶水_桶哥”的评论

可以用呀,完全兼容所以的php扩展和代码库,当然不排除某些扩展本身有bug.

引用来自“青衫柏箴”的评论

异步程序要求代码中不得包含任何同步阻塞操作
异步与同步代码不能混用,一旦应用程序使用了任何同步阻塞的代码,程序即退化为同步模式。
以上两条直接导致很多为传统模式开发的三方库不能使用了。我理解就是比如很多服务的php sdk 你要在swoole里使用还要用swoole的异步tcp或者http客户端去改写。
不像node.js 天生就是支持异步的。所以我宁愿学习一门其他语言。
你指的是这个,io相关的确实需要用swoole提供的异步版本,所以才有协程版出来。
但这些都是一次性的工作。
大部分的扩展或者库都是业务逻辑相关的。
1

引用来自“青衫柏箴”的评论

很多PHP的扩展和三方包都不能直接在swoole下使用。swoole只有自己来造各种扩展和客户端。学习swoole跟学习一门新语言也没什么区别了。

引用来自“半桶水_桶哥”的评论

可以用呀,完全兼容所以的php扩展和代码库,当然不排除某些扩展本身有bug.
异步程序要求代码中不得包含任何同步阻塞操作
异步与同步代码不能混用,一旦应用程序使用了任何同步阻塞的代码,程序即退化为同步模式。
以上两条直接导致很多为传统模式开发的三方库不能使用了。我理解就是比如很多服务的php sdk 你要在swoole里使用还要用swoole的异步tcp或者http客户端去改写。
不像node.js 天生就是支持异步的。所以我宁愿学习一门其他语言。
0
支持, 但是, 怎么在评论中没看到@eechen :smile:
顶部