Swoole 2.1 is officially released. Synergy+Channel Brings New PHP Programming Mode

  coroutine, golang, php, swoole

Swoole, PHP’s asynchronous, parallel and high-performance network communication engine, has been released.2.1.0Version. The new version provides a brand-new short-name API, fully supports the Coroutine)+ Channel feature, and brings a brand-new programming mode to the PHP language.Swoole 2.1TheAPILearn fromGoLanguage, in this directionGoThe language development team paid tribute.

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

AndGolinguisticchanDifferent, due toPHPIs a dynamic language, so you can post any type of variable into the channel.

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

Other apis

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

Server side

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

SwooleThere are manyCo\ServerCo\WebSocket\ServerCo\Http\ServerCo\Redis\Servergeneral4A support association processServerClass, you can use mediation in these server programsAPI.