easyswoole - 基于swoole扩展实现的一款高性能php框架

MongoDB

目前,MongoDB 并沒有提供協(xié)程版本的 php 客戶端,只有同步阻塞版本。

EasySwoole 的協(xié)程版客戶端已經(jīng)在排期內(nèi)。

在實(shí)際生產(chǎn)中,直接創(chuàng)建原生的 MongoDB客戶端 來進(jìn)行數(shù)據(jù)交互,也不是不可。

若希望將同步調(diào)用轉(zhuǎn)為協(xié)程調(diào)用,可以用 Easyswoole 提供的 sync-invoker 組件。

MongoDB客戶端 的同步調(diào)用轉(zhuǎn)為協(xié)程調(diào)用具體使用如下:

定義驅(qū)動(dòng)

<?php

namespace App\MongoDb;

use EasySwoole\EasySwoole\Trigger;
use EasySwoole\SyncInvoker\AbstractDriver;
use MongoDB\Client;

class Driver extends AbstractDriver
{
    private $db;

    // 【建議使用】
    // 使用 mongodb/mongodb composer組件包封裝的 MongoDB 客戶端調(diào)用類,作為客戶端調(diào)用驅(qū)動(dòng)
    // 【前提:需要先使用 `composer require mongodb/mongodb` 安裝 mongodb/mongodb composer組件包】
    function getDb(): Client
    {
        if ($this->db == null) {
            // 這里為要連接的 mongodb 的服務(wù)端地址【前提是必須先有服務(wù)端,且安裝 php-mongodb 擴(kuò)展才可使用】
            $mongoUrl = "mongodb://127.0.0.1:27017";
            $this->db = new Client($mongoUrl);
        }
        return $this->db;
    }

    // 僅使用 php-mongodb 擴(kuò)展內(nèi)置類(不使用composer組件包的),作為客戶端調(diào)用驅(qū)動(dòng)
    /*
    function getDb(): \MongoDB\Driver\Manager
    {
        if ($this->db == null) {
            // 這里為要連接的 mongodb 的服務(wù)端地址【前提是必須先有服務(wù)端,且安裝 php-mongodb 擴(kuò)展才可使用】
            $mongoUrl = "mongodb://127.0.0.1:27017";
            $this->db = new \MongoDB\Driver\Manager($mongoUrl);

        }
        return $this->db;
    }
    */

    protected function onException(\Throwable $throwable)
    {
        Trigger::getInstance()->throwable($throwable);
        return null;
    }
}

客戶端調(diào)用類定義

<?php

namespace App\MongoDb;

use EasySwoole\Component\Singleton;
use EasySwoole\SyncInvoker\SyncInvoker;

class MongoClient extends SyncInvoker
{
    use Singleton;
}

注冊 Invoker 服務(wù)

EasySwoole 全局事件mainServerCreate 事件 中進(jìn)行服務(wù)注冊

<?php

namespace EasySwoole\EasySwoole;

use EasySwoole\EasySwoole\AbstractInterface\Event;
use EasySwoole\EasySwoole\Swoole\EventRegister;

class EasySwooleEvent implements Event
{
    public static function initialize()
    {
        // TODO: Implement initialize() method.
        date_default_timezone_set('Asia/Shanghai');
    }

    public static function mainServerCreate(EventRegister $register)
    {
        // 配置 Invoker
        $invokerConfig = \App\MongoDb\MongoClient::getInstance()->getConfig();
        $invokerConfig->setDriver(new \App\MongoDb\Driver()); // 配置 MongoDB 客戶端協(xié)程調(diào)用驅(qū)動(dòng)

        // 以下這些配置都是可選的,可以使用組件默認(rèn)的配置
        /*
        $invokerConfig->setMaxPackageSize(2 * 1024 * 1024); // 設(shè)置最大允許發(fā)送數(shù)據(jù)大小,默認(rèn)為 2M【注意:當(dāng)使用 MongoDB 客戶端查詢大于 2M 的數(shù)據(jù)時(shí),可以修改此參數(shù)】
        $invokerConfig->setTimeout(3.0); // 設(shè)置 MongoDB 客戶端操作超時(shí)時(shí)間,默認(rèn)為 3.0 秒;
        */

        // 注冊 Invoker
        \App\MongoDb\MongoClient::getInstance()->attachServer(ServerManager::getInstance()->getSwooleServer());
    }
}

在框架中使用 MongoDB 客戶端(協(xié)程調(diào)用)

<?php

namespace App\HttpController;

use App\MongoDb\Driver;
use App\MongoDb\MongoClient;
use EasySwoole\Http\AbstractInterface\Controller;
use EasySwoole\Utility\Random;

class Index extends Controller
{
    public function index()
    {
        // 使用 mongodb/mongodb composer組件包【建議使用,需要先使用composer安裝】
        $ret = MongoClient::getInstance()->invoke()->callback(function (Driver $driver) {
            $ret = $driver->getDb()->user->list->insertOne([
                'name' => Random::character(8),
                'sex' => 'man',
            ]);
            if (!$ret) {
                $driver->response(false);
            }
            $driver->response($ret->getInsertedId());
        });
        var_dump($ret);

        $ret = MongoClient::getInstance()->invoke()->callback(function (Driver $driver) {
            $ret = [];
            $collections = $driver->getDb()->user->listCollections();
            foreach ($collections as $collection) {
                $ret[] = (array)$collection;
            }
            $driver->response($ret);
        });
        var_dump($ret);
        /**
         * 輸出結(jié)果:
         * object(MongoDB\BSON\ObjectId)#109 (1) {
             ["oid"]=>
             string(24) "600da377004c82305a02fb52"
           }
         * array(1) {
             [0]=>
             array(1) {
               ["MongoDB\Model\CollectionInfoinfo"]=>
               array(5) {
                 ["name"]=>
                 string(4) "list"
                 ["type"]=>
                 string(10) "collection"
                 ["options"]=>
                 array(0) {
                 }
                 ["info"]=>
                 array(2) {
                   ["readOnly"]=>
                   bool(false)
                   ["uuid"]=>
                   object(MongoDB\BSON\Binary)#110 (2) {
                     ["data"]=>
                     string(16) "EasySwoole"
                     ["type"]=>
                     int(4)
                   }
                 }
                 ["idIndex"]=>
                 array(4) {
                   ["v"]=>
                   int(2)
                   ["key"]=>
                   array(1) {
                     ["_id"]=>
                     int(1)
                   }
                   ["name"]=>
                   string(4) "_id_"
                   ["ns"]=>
                   string(9) "user.list"
                 }
               }
             }
           } 
        */

        // 使用 php-mongodb 擴(kuò)展時(shí)(不使用 mongodb/mongodb composer組件包)
        /*
        // 插入數(shù)據(jù)
        $rets = MongoClient::getInstance()->invoke()->callback(function (Driver $driver) {
            $bulk = new \MongoDB\Driver\BulkWrite();

            $bulk->insert([
                'name' => Random::character(8),
                'sex' => 'man',
            ]);

            $bulk->insert(['_id' => 1, 'x' => 1]);
            $bulk->insert(['_id' => 2, 'x' => 2]);

            $bulk->update(['x' => 2], ['$set' => ['x' => 1]], ['multi' => false, 'upsert' => false]);
            $bulk->update(['x' => 3], ['$set' => ['x' => 3]], ['multi' => false, 'upsert' => true]);
            $bulk->update(['_id' => 3], ['$set' => ['x' => 3]], ['multi' => false, 'upsert' => true]);

            $bulk->insert(['_id' => 4, 'x' => 2]);

            $bulk->delete(['x' => 1], ['limit' => 1]);

            $manager = $driver->getDb();
            $writeConcern = new \MongoDB\Driver\WriteConcern(\MongoDB\Driver\WriteConcern::MAJORITY, 100);
            // 查到 user 庫的 list 集合中
            $ret = $manager->executeBulkWrite('user.list', $bulk, $writeConcern);

            printf("Inserted %d document(s)\n", $ret->getInsertedCount()); // 插入條數(shù)
            printf("Matched  %d document(s)\n", $ret->getMatchedCount()); // 匹配條數(shù)
            printf("Updated  %d document(s)\n", $ret->getModifiedCount()); // 修改條數(shù)
            printf("Upserted %d document(s)\n", $ret->getUpsertedCount()); // 修改插入條數(shù)
            printf("Deleted  %d document(s)\n", $ret->getDeletedCount()); // 刪除條數(shù)

            foreach ($ret->getUpsertedIds() as $index => $id) {
                printf('upsertedId[%d]: ', $index);
                var_dump($id);
            }

            if (!$ret) {
                return false;
            }

            return true;
        });

        // 查詢數(shù)據(jù)
        $rets = MongoClient::getInstance()->invoke()->callback(function (Driver $driver) {
            $filter = ['x' => ['$gt' => 1]];
            $options = [
                'projection' => ['_id' => 0],
                'sort' => ['x' => -1],
            ];

// 查詢數(shù)據(jù)
            $query = new \MongoDB\Driver\Query($filter, $options);
            $cursor = $driver->getDb()->executeQuery('user.list', $query);
            foreach ($cursor as $document) {
                print_r($document);
            }
        });
        */

    }
}
主站蜘蛛池模板: 徐州车牌识别_徐州门禁一卡通_徐州人脸识别门禁-江苏琪瑞特智能科技有限公司 | 天津印刷_天津印刷厂_天津印刷公司_天津包装盒厂家_天津包装盒印刷厂_七层共挤膜厂家_彩色印刷_画册印刷_礼品盒定做 _七层共挤膜_食品真空袋-欢迎访问嘉联包装官网! | 色差宝ColorReader「3nh三恩时」专业版色差宝APP | 重庆聚成达汽车有限公司-重庆吸污净化车| 三亚酒吧KTV会所 专业舞台音响灯光 智能影音 会议音响工程 首选海南东演音响公司 | 商标注册_商标转让交易_专利申请_版权登记_ISO认证服务咨询-世标知识产权 | 文轩热能_水冷板散热器热设计热管理系统_铝型材铲齿摩擦焊热管_散热片散热板生产加工厂家 | 途远VR+_成都VR全景制作_成都360全景漫游_成都720全景航拍_成都途远科技有限公司 | 斩天手游网_高质量手机游戏下载中心 | 生活污水处理设备-地埋式污水处理设备厂家-山东梦之洁水处理设备有限公司 | 声测管厂家_注浆管现货_桩基声测管_河北沧州新迈实业有限公司 | 真空热处理-渗碳热处理-氮化热处理-[东莞德亿]专业热处理加工厂家 | 温州网络公司_网站建设_网络营销策划_阿里淘宝店铺服务-温州聚欣网络科技有限公司 | 人工草坪_施工围挡_体育场围网-人工草坪厂家菲斯福 | 烟台废旧物资回收,烟台废品回收,烟台物资回收-烟台金泰再生资源有限公司 | 碳化钨涂层_碳化钨喷涂_碳化钨焊条_碳化钨合金块-北京耐默 | 烟台废旧物资回收,烟台废品回收,烟台物资回收-烟台金泰再生资源有限公司 | 麦秸映像网络技术有限公司,河南省政府采网入驻对接,新乡网站维护建设,小程序开发,APP定制开发,钉钉开发,新乡软件开发等相关网络业务 | 内衬不锈钢复合管,大口径内衬不锈钢复合钢管,双金属复合管,内衬不锈钢复合管厂家-江苏新澎 | 西安男科医院_陕西男性专科医院_陕西老医协生殖医学医院【官网】 | 消防工程公司,消防工程承接公司-亿杰(北京)工程安装有限公司 | 压瓦机|C型钢机|彩钢设备|C/Z互换檩条机-河北玉发压瓦机 | 兰舍硅藻泥 -- 深圳硅藻泥|深圳兰舍硅藻泥|深圳硅藻泥品牌|深圳硅藻泥价格|深圳硅藻泥厂家|深圳硅藻泥施工| | 中科联航(江苏)-信息化监理|信息化咨询|信息系统项目管理|信息系统工程监理公司 | 悬挂式小鼠笼架,植物标本采集箱,昆虫标本盒厂家-北京合力科创科技发展有限公司 | 化妆粉扑厂家【秀兰】一线品牌资格供应商_海绵粉扑批发_气垫粉扑价格_广州秀兰生物科技有限公司 化工招聘网 化工人才网|化工英才网-化工企业招聘首选网站 | 卧式球磨机_干法球磨机_尼龙球磨机-无锡市少宏粉体科技有限公司 卧螺离心机-固液分离机-台州春鼎机械制造有限公司 | 珠海市甜菊科技发展有限公司| 液压扳手-液压扭力扳手-电动扭矩扳手-气动扭力扳手-波霆机械(上海) | 深圳蓝枫印刷_画册印刷_彩页印刷_宣传册印刷_包装盒印刷_彩盒印刷厂_不干胶印刷厂 | 铸造厂_铸造厂家_硅溶胶熔模铸造-盐城市春秋精密机械有限公司 | 美国Riverhawk轴承,Riverhawk十字弹簧轴承,Riverhawk联轴器,Riverhawk液压工具 | 廊坊微信营销,廊坊小程序开发,廊坊APP开发(安卓_苹果ios开发),微信朋友圈广告,百度推广,廊坊网络公司品牌服务商-河北盛秋网络科技有限公司 | 上海况胜_玻璃反应釜厂家_双层玻璃反应釜_实验室玻璃反应釜 | 浙江日新电气有限公司 | 暖气片_铜铝复合暖气片_钢制散热器厂家-德克菲勒暖气片 | 中空吹塑-PETG吹塑加工-吹塑玩具-东莞市鹏美塑胶五金有限公司 | 热泵烘干机_食品烘干机_水果烘干机_蔬菜烘干机_河南蓝天机械制造有限公司 | 恒温干燥箱厂家-烘箱厂家-马弗炉厂家-生化培养箱-上海有丰科学仪器有限公司 | 山东胜王水处理设备有限公司,反渗透设备,纯净水设备,污水处理设备,SWS系列全自动钠离子交换器,纯净水设备报价,活性碳过滤器,多介质过滤器 | 长兴嘉诚炉业有限公司【官网】 |