172 lines
4.2 KiB
Markdown
172 lines
4.2 KiB
Markdown
# 基于docker的workerman-jsonrpc
|
||
|
||
我们在`php:8.1-cli`基础上安装了运行workerman必要的一些扩展和开发中常用的扩展,以及composer,制作成`workerman:8.1`镜像,因此在开发环境中不需要再额外配置php环境,直接写业务代码即可。
|
||
|
||
## 依赖
|
||
|
||
只要系统环境中有docker即可,不需要安装php环境
|
||
|
||
## 使用方法
|
||
|
||
```sh
|
||
# 启动
|
||
./start
|
||
# composer
|
||
./composer install
|
||
./conposer require xxxx
|
||
```
|
||
|
||
## 一些有用的文件
|
||
|
||
| 文件 | 作用 | 用法或说明 |
|
||
|---|---|---|
|
||
|composer|调起容器中的`composer`命令的shell脚本|`./composer $args...`|
|
||
|start|调起容器中的`php start.php`命令的shell脚本|`./start`或`./start start`|
|
||
|docker-compose-dev.yml|运行容器的编排文件|一般不需要理会这个文件,composer和start脚本都需要依赖这个文件|
|
||
|php.ini|映射到容器中的php.ini配置文件|容器中已经安装的扩展都有单独的配置文件,这里不会有体现|
|
||
|
||
- 一定要保证`composer`脚本、`start`脚本中的`compose_file`文件名与实际的`docker-compose-dev.yml`文件名一致。
|
||
- 一定要保证`composer`脚本、`start`脚本中的`service_name`容器名称与`docker-compose-dev.yml`文件中的`container_name`保持一致。
|
||
|
||
## workerman
|
||
|
||
workerman 是一个高性能的PHP socket服务框架,开发者可以在这个框架下开发各种网络应用,例如Rpc服务、聊天室、游戏等。
|
||
workerman 具有以下特性
|
||
* 多进程
|
||
* 支持TCP/UDP
|
||
* 支持各种应用层协议
|
||
* 使用libevent事件轮询库,支持高并发
|
||
* 支持文件更新检测及自动加载
|
||
* 支持服务平滑重启
|
||
* 支持telnet远程控制及监控
|
||
* 支持异常监控及告警
|
||
* 支持长连接
|
||
* 支持以指定用户运行worker进程
|
||
|
||
所需环境
|
||
========
|
||
|
||
workerman需要PHP版本不低于5.3,只需要安装PHP的Cli即可,无需安装PHP-FPM、nginx、apache
|
||
|
||
workerman不能运行在Window平台
|
||
|
||
安装
|
||
=========
|
||
|
||
1、下载 或者 git clone ```https://github.com/walkor/workerman-JsonRpc```
|
||
|
||
2、运行 ```composer install```
|
||
|
||
|
||
启动停止
|
||
=========
|
||
|
||
启动
|
||
`php start.php start -d`
|
||
|
||
重启启动
|
||
`php start.php restart`
|
||
|
||
平滑重启/重新加载配置
|
||
`php start.php reload`
|
||
|
||
查看服务状态
|
||
`php start.php status`
|
||
|
||
停止
|
||
`php start.php stop`
|
||
|
||
Rpc应用使用方法
|
||
=========
|
||
|
||
### 客户端同步调用:
|
||
|
||
```php
|
||
<?php
|
||
include_once 'yourClientDir/RpcClient.php';
|
||
|
||
$address_array = array(
|
||
'tcp://127.0.0.1:2015',
|
||
'tcp://127.0.0.1:2015'
|
||
);
|
||
// 配置服务端列表
|
||
RpcClient::config($address_array);
|
||
|
||
$uid = 567;
|
||
|
||
// User对应applications/JsonRpc/Services/User.php 中的User类
|
||
$user_client = RpcClient::instance('User');
|
||
|
||
// getInfoByUid对应User类中的getInfoByUid方法
|
||
$ret_sync = $user_client->getInfoByUid($uid);
|
||
|
||
```
|
||
|
||
### 客户端异步调用:
|
||
RpcClient支持异步远程调用
|
||
|
||
```php
|
||
<?php
|
||
include_once 'yourClientDir/RpcClient.php';
|
||
// 服务端列表
|
||
$address_array = array(
|
||
'tcp://127.0.0.1:2015',
|
||
'tcp://127.0.0.1:2015'
|
||
);
|
||
// 配置服务端列表
|
||
RpcClient::config($address_array);
|
||
|
||
$uid = 567;
|
||
$user_client = RpcClient::instance('User');
|
||
|
||
// 异步调用User::getInfoByUid方法
|
||
$user_client->asend_getInfoByUid($uid);
|
||
// 异步调用User::getEmail方法
|
||
$user_client->asend_getEmail($uid);
|
||
|
||
这里是其它的业务代码
|
||
....................
|
||
....................
|
||
|
||
// 需要数据的时候异步接收数据
|
||
$ret_async1 = $user_client->arecv_getEmail($uid);
|
||
$ret_async2 = $user_client->arecv_getInfoByUid($uid);
|
||
|
||
这里是其他业务逻辑
|
||
|
||
```
|
||
|
||
### 服务端:
|
||
服务端每个类提供一组服务,类文件默认放在Applications/JsonRpc/Services目录下。
|
||
客户端实际上是远程调用这些类的静态方法。
|
||
例如:
|
||
```php
|
||
<?php
|
||
RpcClient::instance('User')->getInfoByUid($uid);
|
||
```
|
||
调用的是Applications/JsonRpc/Services/User.php 中 User类的getInfoByUid方法。
|
||
User.php文件类似这样
|
||
```php
|
||
<?php
|
||
class User
|
||
{
|
||
public static function getInfoByUid($uid)
|
||
{
|
||
// ....
|
||
}
|
||
|
||
public static function getEmail($uid)
|
||
{
|
||
// ...
|
||
}
|
||
}
|
||
```
|
||
|
||
如果你想要增加一组服务,可以在这个目录下增加类文件即可。
|
||
|
||
|
||
rpc监控页面
|
||
======
|
||
rpc监控页面地址 http://ip:55757
|
||
|