升级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:
wandoubaba 2024-07-19 12:26:19 +08:00
parent 24a4418ce3
commit 2d4fbae0c6
9 changed files with 328 additions and 289 deletions

103
README.md
View File

@ -1,45 +1,88 @@
# 基于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
# composer
./composer install
./composer require xxxx
# 服务控制
./server start|restart|stop|status|reload|connections|logs
# 自动生成.env.example文件
./envexample
# 启动服务
./php start.php start
# 执行其它php命令
./php -m
./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网络下启动的当然实际使用中也可以改成端口映射模式。
## 生产环境使用
创建一个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扩展
```sh
php -m
[PHP Modules]
bcmath
Core
ctype
curl
@ -51,11 +94,14 @@ fileinfo
filter
ftp
gd
gmp
hash
iconv
imagick
json
libxml
mbstring
mongodb
mysqli
mysqlnd
openssl
@ -86,7 +132,30 @@ xmlwriter
Zend OPcache
zip
zlib
zookeeper
[Zend Modules]
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();
```

View File

@ -1,3 +1,17 @@
#!/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

File diff suppressed because it is too large Load Diff

View File

@ -9,7 +9,7 @@ return [
env('DEFAULT_RPC_SERVER', 'tcp://127.0.0.1:8021'), // rpc服务端的地址和端口
],
'user' => [
env('USER_RPC_SERVER', 'tcp://127.0.0.1:8022'), // rpc服务端的地址和端口
env('USER_RPC_SERVER', 'tcp://127.0.0.1:8021'), // rpc服务端的地址和端口
],
// 'server2' => [
// /// ...

View File

@ -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
View File

@ -1,3 +1,26 @@
#!/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
View File

@ -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

View File

@ -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 $default default value
* @param mixed|null $default default value
* @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);
}

8
webman
View File

@ -27,9 +27,11 @@ if (is_dir($command_path = Util::guessPath(app_path(), '/command', true))) {
foreach (config('plugin', []) as $firm => $projects) {
if (isset($projects['app'])) {
if ($command_str = Util::guessPath(base_path() . "/plugin/$firm", 'command')) {
$command_path = base_path() . "/plugin/$firm/$command_str";
$cli->installCommands($command_path, "plugin\\$firm\\$command_str");
foreach (['', '/app'] as $app) {
if ($command_str = Util::guessPath(base_path() . "/plugin/$firm{$app}", 'command')) {
$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) {