发布于 2016-08-03 03:26:29 | 194 次阅读 | 评论: 0 | 来源: 网友投递

这里有新鲜出炉的Swoole扩展官方文档,程序狗速度看过来!

Swoole Framework PHP Web开发框架

Swoole是一个php扩展也是一种PHP高级Web开发框架,框架不是为了提升网站的性能,是为了提升网站的开发效率。最少的性能损耗,换取最大的开发效率。利用Swoole框架,开发一个复杂的Web功能,可以在很短的时间内完成!


Swoole-2.0 提供了PHP原生协程调度器,PHP代码可以按照同步方式编写,底层引擎使用异步IO,调度器会在IO完成后自动切换PHP函数调用栈。

内置协程不依赖PHP的Yield/Generator语法,实现了真正的同步代码,异步IO。Swoole-2.0兼容Swoole-1.0所有现存特性,同时支持同步阻塞、异步非阻塞回调、协程 3 种 IO 模型。

协程可以理解为用户态线程,通过协作而不是抢占来进行切换。相对于操作系统进程或者线程,协程所有的操作都可以在用户态完成,创建和切换的消耗更低。Swoole可以为每一个请求创建对应的协程,根据IO的状态来合理地调度协程。

Swoole-2.0内置协程的优势:

  1. 开发者可以使用最传统的PHP同步编码方式即可实现异步IO。过去使用Node.js和Swoole1.0编写异步程序时必须使用嵌套回调,开发效率低,逻辑复杂之后开发维护都很困难。现在使用Swoole-2.0内置协程可以轻松编写异步程序,彻底告别Callback Hell。

  2. 由于Swoole-2.0是在底层封装了协程,所以对比其他的PHP协程框架,如TSFZan,开发者不需要额外使用yield关键词来标识一个协程IO切换操作,所以不再需要对yield的语义进行深入理解以及对每一级的调用都修改为yield,这极大的提高了开发效率。

  3. Swoole-2.0除了支持常见的如TCP、UDP、HTTP、Redis、MySQL协程客户端之外,还支持并发Client,可以同时并发执行多个不同类型的协程客户端调用,时间为Max(耗时最长Client的时间)。而Go语言需要使用非常复杂的goroutine+chan+select才能实现。Swoole-2.0的并发调用使用更加简单。

主要特性:

  • 底层内置协程,同步的代码,异步的IO

  • TCP/UDP/UnixSocket协程客户端SwooleCoroutineClient

  • Http/WebSocket协程客户端SwooleCoroutineHttpClient

  • Redis协程客户端SwooleCoroutineRedis

  • MySQL协程客户端SwooleCoroutineMySQL

  • 并发Client

  • 支持异步超时

  • 默认开启命名空间

要求:

  • 需要PHP5.5或更高版本

  • 暂时不支持PHP7

  • 服务器端基于SwooleServer或者SwooleHttpServer进行开发,目前仅支持在onRequet、onReceive、onConnect回调中使用协程

安装方式:

Swoole-2.0需要通过添加--enable-coroutine编译参数启用协程能力,示例如下:

phpize
./configure --with-php-config={path-to-php-config}  --enable-coroutine
make
make install

添加编译参数,swoole server将切换到协程模式

使用示例:

TCP协程客户端

$client = new SwooleCoroutineClient(SWOOLE_SOCK_TCP);
$client->connect('127.0.0.1', 9501,0.5)
//调用connect将触发协程切换
$client->send("hello worldn");
echo $client->recv();
//调用recv将再次触发协程切换
$client->close();

Http协程客户端

$cli = new SwooleCoroutineHttpClient('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();

Redis协程客户端

$redis = new SwooleCoroutineRedis();
$redis->connect('127.0.0.1', 6379);
$val = $redis->get('key');

MySQL协程客户端

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

并发调用

$tcpclient = new SwooleCoroutineClient(SWOOLE_SOCK_TCP);
$tcpclient->connect('127.0.0.1', 9501,0.5)
$tcpclient->send("hello worldn");

$redis = new SwooleCoroutineRedis();
$redis->connect('127.0.0.1', 6379);
$redis->setDefer();
$redis->get('key');

$mysql = new SwooleCoroutineMySQL();
$mysql->connect(['host' => '127.0.0.1',
    'user' => 'user',
    'password' => 'pass',
    'database' => 'test',
]);
$mysql->setDefer();
$mysql->query('select sleep(1)');

$httpclient = new SwooleCoroutineHttpClient('0.0.0.0', 9599);
$httpclient->setHeaders(['Host' => "api.mp.qq.com"]);
$httpclient->set([ 'timeout' => 1]);
$httpclient->setDefer();
$httpclient->get('/');

$tcp_res  = $tcpclient->recv();
$redis_res = $redis->recv();
$mysql_res = $mysql->recv();
$http_res  = $httpclient->recv();

通常,如果一个业务请求中需要做一次redis请求和一次mysql请求,那么网络IO会是这样:

redis发包->redis收包->mysql发包->mysql收包

以上流程网络IO的时间就等于 redis网络IO时间 + mysql网络IO时间。

而对于协程版本的Client,网络IO可以是这样:

redis发包->mysql发包->redis收包->mysql收包

以上流程网络IO的时间就接近于 MAX(redis网络IO时间, mysql网络IO时间)。

现在支持并发请求的Client有:

  • SwooleCoroutineClient

  • SwooleCoroutineRedis

  • SwooleCoroutineMySQL

  • SwooleCoroutineHttpClient

除了SwooleCoroutineClient,其他Client都实现了defer特性,用于声明延迟收包。

注意事项

  1. 全局变量:协程使得原有的异步逻辑同步化,但是在协程的切换是隐式发生的,所以在协程切换的前后不能保证全局变量以及static变量的一致性。

  2. 请勿在下列场景中调用协程客户端:

    • 析构函数__destruct()

    • 魔术方法__call()

  3. 当前版本为Alpha预览版本,不建议在生产环境上使用

使用新版本


 



历史版本 :
Swoole 1.10.0 发布,增加多项新特性
Swoole 1.9.22 发布,增加 Async::exec 功能
SwooleDistributed 框架 2.5 发布,全面支持 Docker
Swoole 1.9.19 发布,BUG 修复版本
Swoole 1.9.17 发布,增加静态文件处理器
Swoole 1.9.15 发布,增加静态编译支持
Swoole 1.9.11 发布,心跳检测支持时间轮算法
Swoole 1.9.9 发布,BUG 修复版本
Swoole 1.9.7 发布,增加 Http2.0 异步客户端
Swoole 1.9.6 发布,增加高性能序列化模块
Swoole 2.0 正式版发布,协程特性支持 PHP 7
Swoole 1.9.1 发布,Bug 修复版本
最新网友评论  共有(0)条评论 发布评论 返回顶部

Copyright © 2007-2017 PHPERZ.COM All Rights Reserved   冀ICP备14009818号  版权声明  广告服务