PHPackages                             myqee/server - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Utility &amp; Helpers](/categories/utility)
4. /
5. myqee/server

ActiveLibrary[Utility &amp; Helpers](/categories/utility)

myqee/server
============

MyQEE Server library

v2.1.3(5y ago)193524461MITPHPPHP &gt;=7.0

Since Aug 31Pushed 5y ago13 watchersCompare

[ Source](https://github.com/myqee/server)[ Packagist](https://packagist.org/packages/myqee/server)[ Docs](http://www.myqee.com)[ RSS](/packages/myqee-server/feed)WikiDiscussions master Synced yesterday

READMEChangelogDependenciesVersions (19)Used By (1)

MyQEE 服务器
=========

[](#myqee-服务器)

[![Supported PHP versions: >7.0](https://camo.githubusercontent.com/24c1a7964338d52e1a6f9917a2db49f031b0514429ea985e8c9f9f156ce3fda1/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f7068702d253345372e302d626c75652e737667)](https://camo.githubusercontent.com/24c1a7964338d52e1a6f9917a2db49f031b0514429ea985e8c9f9f156ce3fda1/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f7068702d253345372e302d626c75652e737667)[![Swoole](https://camo.githubusercontent.com/aa62a3541cfcda3900c324f28924c5927a241c434af8e469d569b885665e005b/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f53776f6f6c652d253345342e322e31322d626c75652e737667)](https://camo.githubusercontent.com/aa62a3541cfcda3900c324f28924c5927a241c434af8e469d569b885665e005b/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f53776f6f6c652d253345342e322e31322d626c75652e737667)[![License](https://camo.githubusercontent.com/78e12fef66dd65f28b12579146b6831bf5276dc1118783c03daa9801fa0c130c/68747470733a2f2f696d672e736869656c64732e696f2f686578706d2f6c2f706c75672e737667)](https://camo.githubusercontent.com/78e12fef66dd65f28b12579146b6831bf5276dc1118783c03daa9801fa0c130c/68747470733a2f2f696d672e736869656c64732e696f2f686578706d2f6c2f706c75672e737667)[![Packagist](https://camo.githubusercontent.com/fd3ebe5aa73b372af032e891e472259f9f8cf4897f6c406b1e4775b05e77561b/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f762f6d797165652f7365727665722e737667)](https://camo.githubusercontent.com/fd3ebe5aa73b372af032e891e472259f9f8cf4897f6c406b1e4775b05e77561b/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f762f6d797165652f7365727665722e737667)

### 介绍

[](#介绍)

MyQEE V2服务器是在Swoole V4协程基础之上开发的全面协程化的服务器组件，独创的协程Shuttle穿梭理念是最大的亮点，即适合web项目也适合长连接服务，更是大型高并发项目的福音。

### Shuttle - 穿梭

[](#shuttle---穿梭)

旨在提高对复杂数据流处理业务的编程体验，降低编程人员对业务处理程序理解难度，利用协程的特点让程序在不同的数据处理序列里不断的穿梭。

想像一下，一个消息队列服务器集群，里有成千上万个“消息队列”，每个队列有一个消费者专门处理数据然后把处理结果返回给生产者，这样的一个消息队列集群应该是比较容易理解的，如下图一样数据在并行被处理，它既是并发的又保证了队列数据处理的顺序。

[![Shuttle](other/shuttle.gif)](other/shuttle.gif)

穿梭理念就是将一个进程想像成一个“消息队列集群”，你将各种function、数据处理等当做一个个的消息队列，创建出各种Shuttle服务，每一个Shuttle就是一个具备一对Input/Output的处理功能的队列，或大或小相互调用，因为是协程化的服务，所以数据处理就在不同的“消息队列”里不断的穿梭执行，所以，Shuttle就是一个非常奇妙的理念，它即可以让你的程序无感知的协程化又可以保证数据和功能处理的逻辑顺序。

### V1和V2的差别

[](#v1和v2的差别)

- V1 基于 Swoole v1.0及v2.0版本，使用传统的同步+异步方式
- V2 基于 Swoole v4 的协程版本，全面协程化

### 协程入门

[](#协程入门)

为什么要用协程？协程的最大好处就是可以自己控制程序出让（暂停）和唤醒（继续执行），而传统同步代码要么不执行要么就要一次性运行到结束，中间不可以穿插别的事情。

举一个形象的例子：各种大小不一的汽车过关卡对所有人员进行安全检查。 每个人相当于一个小程序块，一个汽车相当于一个大程序块，过安检相当于运行程序。

传统的做法：汽车到关卡安检员上车每个人检查完放行检查下一辆，如果一辆车人较多后车等待的时间就长。协程的做法却不是这样，而是汽车到达关卡后安检员检查一个人后就去下一辆车，直到这个车全部安检完毕放行（即执行完毕）。
在安检时可能情况会很多，比如安检某个人时此人说箱子的钥匙放在了另外一个车上（比如mysql数据、另外一个function），那么安检员就让这个人等一下他就继续安检下一个人了（同步代码则要一直等拿来钥匙），待那辆车来了后安检员再叫那个等待的人过来继续给他检查（协程调度）
协程里也可以执行纯同步的代码，就好比检查到一辆车的司机素质不好非要他将一车人都检查完（不用协程），那么安检员就只好一个个的人检查然后放行汽车。

这样看来，协程的“安检员”对人员的检查顺序就是完全“随机”的，可能上一秒还是检查这个车下一秒就检查刚刚才到的车了，这样带来几个好处和一些问题：

- 好处是：安检员不用在那空等了，相同时间检查的人更多了，提高了效率
- 问题是：会额外增加一些时间和资源（需要记录挂起的协程的数据），如果一个人被遗忘了这个车就永久被遗忘在安检处，最终可能会塞满服务器，所以需要注意避免这样的问题。另外就是安检顺序变得完全随机，这个带来的后果也许很麻烦，如果你在完全协程的代码里更新同一个数据最终结果可能变得非常不确定，因为他们是依靠调度执行的，真正的顺序可能和预期不一致。

MyQEE的Shuttle就是用来解决这些问题的，它即可以自动实现程序协程化又可以确保相同操作的顺序一致。

但需要注意的是：

- Swoole的协程不可以像go那样利用多线程实现多核利用，它只能使用当前进程资源，最多使用当前进程所在cpu到达单核100%。
- 非网络IO的协程代码块只可调整执行先后顺序不可能缩短总执行时间，比如你有2个协程块分别是算1+1的，不管谁先执行总时间是不会变短的，但是如果2个协程里1个是1+1运算(用时`$a`)，另外一个是依靠网络请求另外一个服务器实现1+1结果（用时`$b`），这时总时间就是 `max($a, $b)` 了。

### 快速使用

[](#快速使用)

请使用 `composer` 进行安装（无需手动下载MyQEE服务器代码，see  or [http://docs.phpcomposer.com/00-intro.html）](http://docs.phpcomposer.com/00-intro.html%EF%BC%89)

1.新建一个文件夹，并创建 `composer.json` 文件，内容如下：

```
{
    "name": "TestServer",
    "description": "test",
    "config": {
        "bin-dir": "bin",
        "data-dir": "data"
    },
    "autoload": {
        "psr-0": {
            "": "classes/"
        }
    },
    "require": {
        "myqee/server": "~1.0"
    },
    "require-dev": {
        "myqee/server": "dev-master"
    }
}
```

2.创建文件 `classes/WorkerMain.php`，内容如下：

```
