分享
  1. 首页
  2. 文章

Swoole 2.1 正式版发布,协程+通道带来全新的 PHP 编程模式

韩天峰 · · 3496 次点击 · · 开始浏览
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

PHP的异步、并行、高性能网络通信引擎 Swoole 已发布 2.1.0 版本。新版本提供了全新的短名 API,完整支持了协程(Coroutine)+通道(Channel)特性,为 PHP 语言带来了全新的编程模式。Swoole 2.1API借鉴至Go语言,在此向Go语言开发组致敬。

Coroutine

go(function () {
 co::sleep(0.5);
 echo "hello";
});
go("test");
go([$object, "method"]);

Channel

$chan = new chan(128);
$chan->push(1234);
$chan->push(1234.56);
$chan->push("hello world");
$chan->push(["hello world"]);
$chan->push(new stdclass);
$chan->push(fopen("test.txt", "r+"));
while($chan->pop());

Go语言的chan不同,由于PHP是动态语言,所以可以向通道内投递任意类型的变量。

Channel Select

$c1 = new chan(3);
$c2 = new chan(2);
$c3 = new chan(2);
$c4 = new chan(2);
$c3->push(3);
$c3->push(3.1415);
$c4->push(3);
$c4->push(3.1415);
go(function () use ($c1, $c2, $c3, $c4) {
 echo "select\n";
 for ($i = 0; $i < 1; $i++)
 {
 $read_list = [$c1, $c2];
 $write_list = [$c3, $c4];
 // $write_list = null;
 $result = chan::select($read_list, $write_list, 5);
 var_dump($result, $read_list, $write_list);
 foreach($read_list as $ch)
 {
 var_dump($ch->pop());
 }
 foreach($write_list as $ch)
 {
 var_dump($ch->push(666));
 }
 echo "exit\n";
 }
});
go(function () use ($c3, $c4) {
 echo "producer\n";
 co::sleep(1);
 $data = $c3->pop();
 echo "pop[1]\n";
 var_dump($data);
});
go(function () {
 co::sleep(10);
});
go(function () use ($c1, $c2) {
 co::sleep(1);
 $c1->push("resume");
 $c2->push("hello");
});

MySQL Client

go(function () {
 $db = new Co\MySQL();
 $server = array(
 'host' => '127.0.0.1',
 'user' => 'root',
 'password' => 'root',
 'database' => 'test',
 );
 $db->connect($server);
 $result = $db->query('SELECT * FROM userinfo WHERE id = 3');
 var_dump($result);
});

Redis Client

go(function () {
 $redis = new Co\Redis;
 $res = $redis->connect('127.0.0.1', 6379);
 $ret = $redis->set('key', 'value');
 var_dump($redis->get('key'));
});

Http Client

go(function () {
 $http = new Co\Http\Client("www.google.com", 443, true);
 $http->setHeaders(function () {
 
 });
 $ret = $http->get('/');
 var_dump($http->body);
});

Http2 Client

go(function () {
 $http = new Co\Http2\Client("www.google.com", 443, true);
 $req = new co\Http2\Request;
 $req->path = "/index.html";
 $req->headers = [
 'host' => "www.google.com",
 "user-agent" => 'Chrome/49.0.2587.3',
 'accept' => 'text/html,application/xhtml+xml,application/xml',
 'accept-encoding' => 'gzip',
 ];
 $req->cookies = ['name' => 'rango', 'email' => 'rango@swoole.com'];
 $ret = $http->send($req);
 var_dump($http->recv());
});

其他 API

co::sleep(100);
co::fread($fp);
co::fwrite($fp, "hello world");
co::gethostbyname('www.google.com');

服务器端

$server = new Co\Http\Server('127.0.0.1', 9501);
$server->on('Request', function($request, $response) {
 $http = new Co\Http\Client("www.google.com", 443, true);
 $http->setHeaders(function () {
 "X-Power-By" => "Swoole/2.1.0",
 });
 $ret = $http->get('/');
 
 if ($ret) {
 $response->end($http->body);
 }
 else{
 $response->end("recv failed error : {$http->errCode}");
 }
});
$server->start();

Swoole提供了很多Co\ServerCo\WebSocket\ServerCo\Http\ServerCo\Redis\Server4个支持协程的Server类,可以在这些服务器程序中使用协程API


有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

关注微信
3496 次点击
3 回复 | 直到 2018年02月11日 17:22:26
暂无回复
添加一条新回复 (您需要 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传

用户登录

没有账号?注册
(追記) (追記ここまで)

今日阅读排行

    加载中
(追記) (追記ここまで)

一周阅读排行

    加载中

关注我

  • 扫码关注领全套学习资料 关注微信公众号
  • 加入 QQ 群:
    • 192706294(已满)
    • 731990104(已满)
    • 798786647(已满)
    • 729884609(已满)
    • 977810755(已满)
    • 815126783(已满)
    • 812540095(已满)
    • 1006366459(已满)
    • 692541889

  • 关注微信公众号
  • 加入微信群:liuxiaoyan-s,备注入群
  • 也欢迎加入知识星球 Go粉丝们(免费)

给该专栏投稿 写篇新文章

每篇文章有总共有 5 次投稿机会

收入到我管理的专栏 新建专栏