swoole实战-概念篇-连载1

6 篇文章 0 订阅
5 篇文章 0 订阅

swoole真的是程序员进阶的好扩展,毕竟PHP都是单线程编程,无外乎就是学一下CURD和框架,最多再研究深入一下框架编写和设计模式等。看到swoole真的是各种扩展内容和更多的延伸,就比如socket服务器,协程,异步任务等功能。(Swoole 还可以广泛应用于互联网、移动通信、云计算、 网络游戏、物联网(IOT)、车联网、智能家居等领域)这些功能可以使PHP面向的方向更多了,所以学习过程中,以实战为例,通过实战也同时学习整个swoole运行模式和开发流程。

下面将会以答题小程序开发做为一个实例!并且会将swoole的需要用到的知识和概念写上来。

概念

  1. TCP/IP:一种数据传输协议
  2. 进程:正在运行linux中的程序
  3. SOCKET服务:就是开启监听进程,通过TCP协议传输数据
  4. 协程:使用完全同步的代码来实现异步 IO,可以简单的理解为一个线程。不清楚看下面的概念5,6解释
  5. 同步IO:以前我们写的都是同步IO,执行完一端代码就执行下一段代码。就比如连接数据库,连接过程可能需要耗时,那么下面的代码不需要阻塞等待。等连接好了之后,才会执行下面的代码。
  6. 异步IO:琐事东西、耗时的扔到一边处理,不要影响主流程。
  7. 异步任务 (Task):耗时的东西,给外包做。task实际上也是一个跟随服务开启一并开启的一个进程。与worker进程是两码事。
  8. 连接池:连接池是创建和管理一个连接的缓冲池的技术,这些连接准备好被任何需要它们的线程使用。就是有很多已被创建的链接对象在这里面,swoole提供了三种,redis,mysql,pdo,实在在不懂的看一下下面附录
  9. 上下文:获取当前协程的上下文对象(主要解决的是协程共用一个连接的问题),实在在不懂的看一下下面附录

附录

连接池代码

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]);
            }
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值