升级workerman到4.1.5,webman升级到1.5.5,webman-framework版本1.5.20,其他依赖包全部升级,php镜像切换为quay.io/wandoubaba517/workerman:8.2.20
This commit is contained in:
parent
24a4418ce3
commit
2d4fbae0c6
103
README.md
103
README.md
@ -1,45 +1,88 @@
|
|||||||
# 基于docker的webman-jsonrpc
|
# 基于docker的webman-jsonrpc
|
||||||
|
|
||||||
我们在`php:8.1-cli`基础上安装了运行webman必要的一些扩展和开发中常用的扩展,以及composer,制作成`workerman:8.1`镜像,因此在开发环境中不需要再额外配置php环境,直接写业务代码即可。
|
我们在`php:8.2.20-cli`基础上安装了运行webman必要的一些扩展和开发中常用的扩展,以及composer,制作成`workerman:8.2.20`镜像,因此在开发环境中不需要再额外配置php环境,直接写业务代码即可。
|
||||||
|
|
||||||
|
## 版本
|
||||||
|
|
||||||
|
```txt
|
||||||
|
./php start.php start
|
||||||
|
Workerman[start.php] start in DEBUG mode
|
||||||
|
------------------------------------------- WORKERMAN --------------------------------------------
|
||||||
|
Workerman version:4.1.15 PHP version:8.2.20 Event-Loop:\Workerman\Events\Event
|
||||||
|
-------------------------------------------- WORKERS ---------------------------------------------
|
||||||
|
proto user worker listen processes status
|
||||||
|
tcp root webman http://0.0.0.0:8787 8 [OK]
|
||||||
|
tcp root monitor none 1 [OK]
|
||||||
|
tcp root jsonrpc jsonNL://0.0.0.0:8021 8 [OK]
|
||||||
|
--------------------------------------------------------------------------------------------------
|
||||||
|
Press Ctrl+C to stop. Start success.
|
||||||
|
```
|
||||||
|
|
||||||
## 依赖
|
## 依赖
|
||||||
|
|
||||||
只要系统环境中有docker即可,不需要安装php环境
|
只要系统环境中有docker即可(生产环境需要docker-compose),不需要安装php环境。
|
||||||
|
|
||||||
## 使用方法
|
## 使用方法
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
# composer
|
# composer
|
||||||
./composer install
|
|
||||||
./composer require xxxx
|
./composer require xxxx
|
||||||
# 服务控制
|
# 启动服务
|
||||||
./server start|restart|stop|status|reload|connections|logs
|
./php start.php start
|
||||||
# 自动生成.env.example文件
|
|
||||||
./envexample
|
|
||||||
# 执行其它php命令
|
# 执行其它php命令
|
||||||
./php -m
|
./php -m
|
||||||
./php webman build:bin
|
./php webman build:bin
|
||||||
```
|
```
|
||||||
|
|
||||||
## 一些有用的文件
|
|
||||||
|
|
||||||
| 文件 | 作用 | 用法或说明 |
|
|
||||||
|---|---|---|
|
|
||||||
|composer|调起容器中的`composer`命令的shell脚本|用法与主机中的compose完全一致,`./composer $args...`|
|
|
||||||
|server|服务控制脚本|`./server`可以查看用法|
|
|
||||||
|php|调起容器中的`php`命令的shell脚本|用法与主机中的php一致,但注意执行`./php start.php start`命令时不要加-d参数|
|
|
||||||
|docker-compose.yml|运行容器的编排文件||
|
|
||||||
|php.ini|映射到容器中的php.ini配置文件|容器中已经安装的扩展都有单独的配置文件,这里不会有体现|
|
|
||||||
|
|
||||||
## 服务端口
|
## 服务端口
|
||||||
|
|
||||||
在.env文件中可以定义服务端口,默认情况下docker容器是在host网络下启动的,当然,实际使用中也可以改成端口映射模式。
|
在.env文件中可以定义服务端口,默认情况下docker容器是在host网络下启动的,当然,实际使用中也可以改成端口映射模式。
|
||||||
|
|
||||||
|
## 生产环境使用
|
||||||
|
|
||||||
|
创建一个docker-compose.yml文件:
|
||||||
|
|
||||||
|
```yml
|
||||||
|
services:
|
||||||
|
webman:
|
||||||
|
image: quay.io/wandoubaba517/workerman:8.1.27
|
||||||
|
container_name: webman
|
||||||
|
restart: always
|
||||||
|
volumes:
|
||||||
|
- ./:/app/service
|
||||||
|
working_dir: /app/service
|
||||||
|
stdin_open: true
|
||||||
|
ports:
|
||||||
|
- 8787:8787
|
||||||
|
# 部署生产时启动这一句
|
||||||
|
command: ['php', 'start.php', 'start']
|
||||||
|
healthcheck:
|
||||||
|
test: ["CMD", "curl", "-f", "http://localhost:8787/"]
|
||||||
|
interval: 5s
|
||||||
|
retries: 3
|
||||||
|
start_period: 5s
|
||||||
|
timeout: 10s
|
||||||
|
```
|
||||||
|
|
||||||
|
然后直接执行(前提要有docker-compose插件)
|
||||||
|
|
||||||
|
```sh
|
||||||
|
docker compose up -d
|
||||||
|
```
|
||||||
|
|
||||||
|
## 一些有用的文件
|
||||||
|
|文件|作用|用法或说明|
|
||||||
|
|---|---|---|
|
||||||
|
|composer|调起容器中的composer命令的shell脚本|用法与主机中的compose完全一致,./composer $args...|
|
||||||
|
|php|调起容器中的php命令的shell脚本|用法与主机中的php一致,但注意执行./php start.php start命令时不要加-d参数|
|
||||||
|
|php.ini|映射到容器中的php.ini配置文件|容器中已经安装的扩展都有单独的配置文件,这里不会有体现|
|
||||||
|
|
||||||
## 已安装PHP扩展
|
## 已安装PHP扩展
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
php -m
|
php -m
|
||||||
[PHP Modules]
|
[PHP Modules]
|
||||||
|
bcmath
|
||||||
Core
|
Core
|
||||||
ctype
|
ctype
|
||||||
curl
|
curl
|
||||||
@ -51,11 +94,14 @@ fileinfo
|
|||||||
filter
|
filter
|
||||||
ftp
|
ftp
|
||||||
gd
|
gd
|
||||||
|
gmp
|
||||||
hash
|
hash
|
||||||
iconv
|
iconv
|
||||||
|
imagick
|
||||||
json
|
json
|
||||||
libxml
|
libxml
|
||||||
mbstring
|
mbstring
|
||||||
|
mongodb
|
||||||
mysqli
|
mysqli
|
||||||
mysqlnd
|
mysqlnd
|
||||||
openssl
|
openssl
|
||||||
@ -86,7 +132,30 @@ xmlwriter
|
|||||||
Zend OPcache
|
Zend OPcache
|
||||||
zip
|
zip
|
||||||
zlib
|
zlib
|
||||||
|
zookeeper
|
||||||
|
|
||||||
[Zend Modules]
|
[Zend Modules]
|
||||||
Zend OPcache
|
Zend OPcache
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## 开发说明
|
||||||
|
|
||||||
|
### jsonrpc服务端配置
|
||||||
|
|
||||||
|
主要在`config/process.php`中配置,`.env`文件可以辅助。
|
||||||
|
|
||||||
|
### jsonrpc控制器
|
||||||
|
|
||||||
|
在`app/jsonrpc`目录中参照示例创建控制器文件和方法即可。
|
||||||
|
|
||||||
|
### jsonrpc客户端配置
|
||||||
|
|
||||||
|
主要在`config/jsonrpc.php`中配置,`.env`文件可以辅助。
|
||||||
|
|
||||||
|
### 客户端调用服务端的方法
|
||||||
|
|
||||||
|
```php
|
||||||
|
$res1 = \jsonrpc\Client::service('default', 'Demo')->hello('Json');
|
||||||
|
$res2 = \jsonrpc\Client::service('user', 'User')->login('admin', '123456');
|
||||||
|
$res3 = \jsonrpc\Client::service('default', 'Demo')->text();
|
||||||
|
```
|
||||||
|
16
composer
16
composer
@ -1,3 +1,17 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
docker compose run --rm webman-jsonrpc composer $@
|
read -r -d '' DOCKER_COMMAND <<'EOF'
|
||||||
|
docker run --rm \
|
||||||
|
-v "$(pwd)":/app/service \
|
||||||
|
-w /app/service \
|
||||||
|
quay.io/wandoubaba517/workerman:8.2.20 \
|
||||||
|
composer
|
||||||
|
EOF
|
||||||
|
|
||||||
|
# 检查是否有传递参数,并将它们附加到命令的末尾
|
||||||
|
if [ $# -gt 0 ]; then
|
||||||
|
DOCKER_COMMAND+=" $@"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 执行docker run命令
|
||||||
|
eval "$DOCKER_COMMAND"
|
397
composer.lock
generated
397
composer.lock
generated
File diff suppressed because it is too large
Load Diff
@ -9,7 +9,7 @@ return [
|
|||||||
env('DEFAULT_RPC_SERVER', 'tcp://127.0.0.1:8021'), // rpc服务端的地址和端口
|
env('DEFAULT_RPC_SERVER', 'tcp://127.0.0.1:8021'), // rpc服务端的地址和端口
|
||||||
],
|
],
|
||||||
'user' => [
|
'user' => [
|
||||||
env('USER_RPC_SERVER', 'tcp://127.0.0.1:8022'), // rpc服务端的地址和端口
|
env('USER_RPC_SERVER', 'tcp://127.0.0.1:8021'), // rpc服务端的地址和端口
|
||||||
],
|
],
|
||||||
// 'server2' => [
|
// 'server2' => [
|
||||||
// /// ...
|
// /// ...
|
||||||
|
@ -1,13 +0,0 @@
|
|||||||
version: "3.1"
|
|
||||||
|
|
||||||
services:
|
|
||||||
webman-jsonrpc:
|
|
||||||
image: wandoubaba517/workerman:8.1
|
|
||||||
container_name: webman-jsonrpc
|
|
||||||
network_mode: host
|
|
||||||
restart: always
|
|
||||||
volumes:
|
|
||||||
- ./:/app/service
|
|
||||||
- ./php.ini:/usr/local/etc/php/php.ini
|
|
||||||
working_dir: /app/service
|
|
||||||
stdin_open: true
|
|
25
php
25
php
@ -1,3 +1,26 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
docker compose run --rm webman-jsonrpc php "$@"
|
# 获取脚本所在目录的绝对路径
|
||||||
|
SCRIPT_DIR=$(cd "$(dirname "$0")" && pwd)
|
||||||
|
|
||||||
|
# 切换工作目录到脚本所在目录
|
||||||
|
cd "$SCRIPT_DIR" || exit 1
|
||||||
|
|
||||||
|
# 使用heredoc构建docker run命令
|
||||||
|
read -r -d '' DOCKER_COMMAND <<'EOF'
|
||||||
|
docker run --rm \
|
||||||
|
--network host \
|
||||||
|
-v "$(pwd)":/app/service \
|
||||||
|
-v "$(pwd)/php.ini":/usr/local/etc/php/php.ini \
|
||||||
|
-w /app/service \
|
||||||
|
quay.io/wandoubaba517/workerman:8.2.20 \
|
||||||
|
php
|
||||||
|
EOF
|
||||||
|
|
||||||
|
# 检查是否有传递参数,并将它们附加到命令的末尾
|
||||||
|
if [ $# -gt 0 ]; then
|
||||||
|
DOCKER_COMMAND+=" $@"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 执行docker run命令
|
||||||
|
eval "$DOCKER_COMMAND"
|
47
server
47
server
@ -1,47 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
set -e
|
|
||||||
|
|
||||||
if [ -z "$1" ]; then
|
|
||||||
echo "Usage: $0 [start|stop|logs|restart|status|reload|connections]"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
container_name="webman-jsonrpc"
|
|
||||||
|
|
||||||
if [ "$1" = "stop" ]; then
|
|
||||||
if [ "$(docker inspect -f {{.State.Running}} $container_name 2>/dev/null)" = "true" ]; then
|
|
||||||
docker stop $container_name
|
|
||||||
else
|
|
||||||
echo "Container $container_name is not running."
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
# 判断容器是否存在
|
|
||||||
# if [ ! "$(docker ps -a -q -f name=$container_name)" ]; then
|
|
||||||
# # 调用init脚本
|
|
||||||
# ./init
|
|
||||||
# fi
|
|
||||||
# 判断容器是否在运行
|
|
||||||
if [ ! "$(docker inspect -f {{.State.Running}} $container_name 2>/dev/null)" = "true" ]; then
|
|
||||||
# 启动容器
|
|
||||||
docker start $container_name
|
|
||||||
fi
|
|
||||||
if [ "$1" = "logs" ]; then
|
|
||||||
docker logs -f $container_name
|
|
||||||
elif [ "$1" = "start" ]; then
|
|
||||||
# docker exec -itd $container_name bash -c "php start.php start"
|
|
||||||
:
|
|
||||||
elif [ "$1" = "restart" ]; then
|
|
||||||
docker restart $container_name
|
|
||||||
elif [ "$1" = "status" ]; then
|
|
||||||
docker exec -it $container_name bash -c "php start.php status"
|
|
||||||
elif [ "$1" = "reload" ]; then
|
|
||||||
docker exec -it $container_name bash -c "php start.php reload"
|
|
||||||
elif [ "$1" = "connections" ]; then
|
|
||||||
docker exec -it $container_name bash -c "php start.php connections"
|
|
||||||
else
|
|
||||||
echo "Invalid command"
|
|
||||||
echo "Usage: $0 [start|stop|logs|restart|status|reload|connections]"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
fi
|
|
@ -517,12 +517,12 @@ function cpu_count(): int
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* get GET or POST request parameters, if no parameter name is passed, an array of all values is returned, default values is supported
|
* Get request parameters, if no parameter name is passed, an array of all values is returned, default values is supported
|
||||||
* @param string|null $param param's name
|
* @param string|null $param param's name
|
||||||
* @param string|null $default default value
|
* @param mixed|null $default default value
|
||||||
* @return mixed|null
|
* @return mixed|null
|
||||||
*/
|
*/
|
||||||
function input(string $param = null, string $default = null)
|
function input(string $param = null, $default = null)
|
||||||
{
|
{
|
||||||
return is_null($param) ? request()->all() : request()->input($param, $default);
|
return is_null($param) ? request()->all() : request()->input($param, $default);
|
||||||
}
|
}
|
||||||
|
8
webman
8
webman
@ -27,9 +27,11 @@ if (is_dir($command_path = Util::guessPath(app_path(), '/command', true))) {
|
|||||||
|
|
||||||
foreach (config('plugin', []) as $firm => $projects) {
|
foreach (config('plugin', []) as $firm => $projects) {
|
||||||
if (isset($projects['app'])) {
|
if (isset($projects['app'])) {
|
||||||
if ($command_str = Util::guessPath(base_path() . "/plugin/$firm", 'command')) {
|
foreach (['', '/app'] as $app) {
|
||||||
$command_path = base_path() . "/plugin/$firm/$command_str";
|
if ($command_str = Util::guessPath(base_path() . "/plugin/$firm{$app}", 'command')) {
|
||||||
$cli->installCommands($command_path, "plugin\\$firm\\$command_str");
|
$command_path = base_path() . "/plugin/$firm{$app}/$command_str";
|
||||||
|
$cli->installCommands($command_path, "plugin\\$firm" . str_replace('/', '\\', $app) . "\\$command_str");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
foreach ($projects as $name => $project) {
|
foreach ($projects as $name => $project) {
|
||||||
|
Loading…
Reference in New Issue
Block a user