php極簡框架 one 1.6.7發佈,新增分佈式併發模型Actor

One - 極簡 . 高性能 . 鬆耦合 . 分佈式 . 可運行於多種環境(cli,apache/php-fpm,swoole)php

碼雲: https://gitee.com/vicself/one
github: https://github.com/lizhichao/onegit

適用場景github

  • 常規web/app後端服務器
  • 遊戲/im即時通信服務器
  • tcp/udp物聯網服務器
  • 綜合性項目,各類混合協議通信

修復問題

使用文件(file)緩存時,不設置過時時間緩存失敗問題。web

新增

  • 新增模型方法flushTableInfo,主動刷新數據表結構緩存。
  • 分佈式併發模型Actor

Actor 是什麼?

是一種與共享內存對應的併發模型,具備資源獨佔性。能夠理解爲一個對象,它有屬性和方法。apache

主要方法

  1. Actor::init() 建立Actor
  2. Actor::drop($actor_id) 刪除Actor
  3. Actor::call($actor_id, $method, $args) Actor通信

適合場景

每一個對象都在變化,對象之間有通信的場景。後端

例1 遊戲:

每一個角色就是一個actor實例:
屬性:生命值,攻擊力
方法:生命值加/減緩存

class UserActor extends Actor
{
    // 生命值
    private $life_value = 10;

    // 攻擊力
    private $power_value = 5;

    // 長鏈接fd
    public $fd;

    // 返回本身的actor id
    public function getActorId()
    {
        return $this->actor_id;
    }

    // 改變生命值 並 通知客戶端
    public function changeLifeValue($n)
    {
        $this->life_value += $n;
        $this->noticeClient();
    }

    // 攻擊某個 Actor =>  減小Actor的生命值
    // 被攻擊Actor能夠其餘進程或者其餘機器上
    public function fire($actor_id)
    {
        $this->call($actor_id,'changeLifeValue',[$this->power_value]);
    }

    // 通知客戶端當前的生命值
    public function noticeClient()
    {
        self::$server->push($this->fd,$this->life_value);
    }
}

// 實例化一個角色
$user1 = UserActor::init();

// 獲取這個角色的actor_id
$actor_id = $user1->getActorId();

// 角色死亡 銷燬 actor
UserActor::drop($actor_id);

Vs 共享內存方式

每一個用戶的屬性須要儲存在一個公共的地方,每次存取都很麻煩。若是改變用戶的屬性值還須要考慮併發問題。若是屬性更多編寫起來將很是複雜。
例如:用戶a,b,c。 都分佈在不一樣的機器上。a和b同時打到了c;服務器

相關文章
相關標籤/搜索