當前位置:
首頁 > 最新 > Swoole 2.1 正式版:協程+通道帶來全新的 PHP 編程模式

Swoole 2.1 正式版:協程+通道帶來全新的 PHP 編程模式

PHP 的非同步、並行、高性能網路通信引擎 Swoole 已發布 2.1.0 版本。新版本提供了全新的短名 API,完整支持了協程(Coroutine)+通道(Channel)特性,為 PHP 語言帶來了全新的編程模式。Swoole 2.1 的 API 借鑒至 Go 語言,在此向 Go 語言開發組致敬。

項目詳情:https://www.oschina.net/p/swoole-server

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
"; for ($i = 0; $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
";

}

});

go(function () use ($c3, $c4) { echo "producer
";

co::sleep(1);

$data = $c3->pop(); echo "pop[1]
";

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 CoMySQL();

$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 CoRedis;

$res = $redis->connect("127.0.0.1", 6379);

$ret = $redis->set("key", "value");

var_dump($redis->get("key"));

});

Http Client

Http2 Client

go(function () {

$http = new CoHttp2Client("www.google.com", 443, true);

$req = new coHttp2Request;

$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

伺服器端

$server = new CoHttpServer("127.0.0.1", 9501);

$server->on("Request", function($request, $response) {

$http = new CoHttpClient("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提供了很多CoServer、CoWebSocketServer、CoHttpServer、CoRedisServer共4個支持協程的Server類,可以在這些伺服器程序中使用協程API。


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 開源中國 的精彩文章:

寫給我的 2017—為什麼我要堅持寫技術博客?

TAG:開源中國 |