swoole真的是程序员进阶的好扩展,毕竟PHP都是单线程编程,无外乎就是学一下CURD和框架,最多再研究深入一下框架编写和设计模式等。看到swoole真的是各种扩展内容和更多的延伸,就比如socket服务器,协程,异步任务等功能。(Swoole 还可以广泛应用于互联网、移动通信、云计算、 网络游戏、物联网(IOT)、车联网、智能家居等领域)这些功能可以使PHP面向的方向更多了,所以学习过程中,以实战为例,通过实战也同时学习整个swoole运行模式和开发流程。
下面将会以答题小程序开发做为一个实例!并且会将swoole的需要用到的知识和概念写上来。
概念
- TCP/IP:一种数据传输协议
- 进程:正在运行linux中的程序
- SOCKET服务:就是开启监听进程,通过TCP协议传输数据
- 协程:使用完全同步的代码来实现异步 IO,可以简单的理解为一个线程。不清楚看下面的概念5,6解释
- 同步IO:以前我们写的都是同步IO,执行完一端代码就执行下一段代码。就比如连接数据库,连接过程可能需要耗时,那么下面的代码不需要阻塞等待。等连接好了之后,才会执行下面的代码。
- 异步IO:琐事东西、耗时的扔到一边处理,不要影响主流程。
- 异步任务 (Task):耗时的东西,给外包做。task实际上也是一个跟随服务开启一并开启的一个进程。与worker进程是两码事。
- 连接池:连接池是创建和管理一个连接的缓冲池的技术,这些连接准备好被任何需要它们的线程使用。就是有很多已被创建的链接对象在这里面,swoole提供了三种,redis,mysql,pdo,实在在不懂的看一下下面附录
- 上下文:获取当前协程的上下文对象(主要解决的是协程共用一个连接的问题),实在在不懂的看一下下面附录
附录
连接池代码
class RedisPool
{
/**
* @var \Swoole\Coroutine\Channel
*/
protected $pool;
/**
* RedisPool constructor.
* @param int $size 连接池的尺寸
*/
function __construct($size = 100)
{
$this->pool = new Swoole\Coroutine\Channel($size);
for ($i = 0; $i < $size; $i++)
{
$redis = new Swoole\Coroutine\Redis();
$res = $redis->connect('127.0.0.1', 6379);
if ($res == false)
{
throw new RuntimeException("failed to connect redis server.");
}
else
{
$this->put($redis);
}
}
}
function put($redis)
{
$this->pool->push($redis);
}
function get()
{
return $this->pool->pop();
}
}
上下文代码
<?php
use Swoole\Coroutine;
class Context
{
protected static $pool = [];
static function get($key)
{
$cid = Coroutine::getuid();
if ($cid < 0)
{
return null;
}
if(isset(self::$pool[$cid][$key])){
return self::$pool[$cid][$key];
}
return null;
}
static function put($key, $item)
{
$cid = Coroutine::getuid();
if ($cid > 0)
{
self::$pool[$cid][$key] = $item;
}
}
static function delete($key = null)
{
$cid = Coroutine::getuid();
if ($cid > 0)
{
if($key){
unset(self::$pool[$cid][$key]);
}else{
unset(self::$pool[$cid]);
}
}
}
}