升级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
|
||||
|
||||
我们在`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();
|
||||
```
|
||||
|
16
composer
16
composer
@ -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
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服务端的地址和端口
|
||||
],
|
||||
'user' => [
|
||||
env('USER_RPC_SERVER', 'tcp://127.0.0.1:8022'), // rpc服务端的地址和端口
|
||||
env('USER_RPC_SERVER', 'tcp://127.0.0.1:8021'), // rpc服务端的地址和端口
|
||||
],
|
||||
// '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
|
||||
|
||||
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 $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
8
webman
@ -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) {
|
||||
|
Loading…
Reference in New Issue
Block a user