PHP 的异步并行高性能网络通信引擎 Swoole 已发布 2.1.0 版本新版本提供了全新的短名 API, 完整支持了协程 (Coroutine)+ 通道(Channel) 特性, 为 PHP 语言带来了全新的编程模式 Swoole 2.1 的 API 借鉴至 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\Server 共
4
个支持协程的 Server 类, 可以在这些服务器程序中使用协程 API
来源: https://segmentfault.com/a/1190000013239349