diff --git a/docs/.vuepress/config.js b/docs/.vuepress/config.js index c600a8f..511d232 100644 --- a/docs/.vuepress/config.js +++ b/docs/.vuepress/config.js @@ -57,6 +57,7 @@ module.exports = { '/php/': [ '../', '', + 'monolog-mongo', 'docker-phpfpm74', 'docker81', 'nginx', @@ -88,7 +89,8 @@ module.exports = { collapsable: false, // 可选的, 默认值是 true, sidebarDepth: 1, // 可选的, 默认值是 1 children: [ - `/php/docker-phpfpm74.md`, + `/php/monolog-mongo`, + `/php/docker-phpfpm74`, '/php/docker81', '/php/nginx', '/php/openresty', diff --git a/docs/php/docker81.md b/docs/php/docker81.md index 10555fa..b0f28f0 100644 --- a/docs/php/docker81.md +++ b/docs/php/docker81.md @@ -1,4 +1,4 @@ -# 制作PHP8.1版的workerman镜像 +# 制作PHP8.1版的workerman环境镜像 ## 拉基础镜像 @@ -89,6 +89,12 @@ mv /usr/local/etc/php/conf.d/docker-php-ext-sockets.ini /usr/local/etc/php/conf. # pgsql和pdo_pgsql apt install -y lsb-release libpq-dev docker-php-ext-install -j$(nproc) pgsql pdo_pgsql +# mongodb +pecl install mongodb +docker-php-ext-enable mongodb +# gmp(一个开源的数学运算库,一些加密组件需要这个扩展) +apt-get install libgmp-dev +docker-php-ext-install -j$(nproc) gmp ``` ### 安装composer @@ -140,4 +146,12 @@ docker exec <容器ID> php start.php start ### 发布镜像 -可以参照阿里云的容器镜像服务中的文档,把本地镜像发布到公网上,便于在其他主机中使用。 +可以把镜像发布到hub.docker.com上,也可以参照阿里云的容器镜像服务中的文档,把本地镜像发布到阿里云上,以便于在其他主机中使用。 + +## 推荐 + +本文作者已将制作好的环境镜像发布到hub.docker.com上,地址 + +```sh +docker pull wandoubaba517/workerman:8.1 +``` diff --git a/docs/php/monolog-mongo.md b/docs/php/monolog-mongo.md new file mode 100644 index 0000000..d81e5e0 --- /dev/null +++ b/docs/php/monolog-mongo.md @@ -0,0 +1,165 @@ +# PHP实现把日志保存到mongodb中 + +`monolog`可以说是PHP中应用最为广泛的日志组件,使用它可以方便的实现多种日志记录需求,本文主要利用`monolog`的`MongoDBHandler`类,将日志保存至`mongodb`中。 + +## 环境 + +本文使用`webman`框架,用法基本与`laravel`大同小异。 + +## 准备工作 + +### 需要为php安装mongodb扩展 + +```sh +pecl install mongodb +``` + +> 也可以使用已经做好环境的docker镜像:`docker pull wandoubaba517/workerman:8.1` + +### monolog版本要在3.0以上 + +先创建一个全新的`webman`项目: + +```sh +composer create-project workerman/webman +cd webman +``` + +`webman`中默认已经内置了`monolog`,不过我们要确保`monolog`的版本要在3.0以上: + +```sh +compose require monolog/monolog:^3.0 +``` + +### 用docker快速启动一下mongodb服务 + +```sh +mkdir -p log/db +touch mongod.conf +``` + +`mongod.conf`文件中的内容类似下面的样子: + +```yml +storage: + dbPath: /data/db +net: + port: 27017 + bindIp: 0.0.0.0 +``` + +`docker-compose.yml`文件中添加`log`服务,类似下面的样子(把root和password换成你自己想要设置的): + +```yml +version: "3.1" + +services: + log: + image: mongo:7.0 + container_name: mongodb-log + restart: always + environment: + MONGO_INITDB_ROOT_USERNAME: root + MONGO_INITDB_ROOT_PASSWORD: password + MONGO_INITDB_DATABASE: log + volumes: + - ./log/db:/data/db + - ./log/mongod.conf:/etc/mongod.conf + network_mode: host + command: ['mongod', '--config', '/etc/mongod.conf'] +``` + +执行`docker compose up -d`就可以启动mongodb服务了。 + +### 引入`mongodb/laravel-mongodb`组件 + +```sh +composer require mongodb/laravel-mongodb +``` + +## 实现代码 + +### `config/database.php`文件中配置mongodb连接 + +```php +return [ + 'default' => 'pgsql', + 'connections' => [ + 'pgsql' => [ + /// ... + ], + 'mongo' => [ + 'driver' => 'mongodb', + 'host' => '127.0.0.1', + 'port' => 27017, + 'database' => 'log', + 'username' => 'root', + 'password' => 'password', + 'options' => [ + 'appname' => 'homestead' + ], + ], + /// ... + ] +]; +``` + +### `config/log.php`文件中配置日志通道 + +```php +return [ + 'mongo' => [ + 'handlers' => [ + [ + 'class' => Monolog\Handler\MongoDBHandler::class, + 'constructor' => [ + new Mongodb\Client('mongodb://root:password@localhost:27017'), + 'log', // 数据库名 + 'default', // 集合名(相当于表名) + Monolog\Level::Debug, // 最低日志等级(默认就是Debug) + ], + ], + ], + ], + /// ... +]; +``` + +### 业务代码中应用 + +以`app/controller/IndexController.php`中的`log`方法为例: + +```php +info(__CLASS__ . DIRECTORY_SEPARATOR . __FUNCTION__, $request->all()); + $logs = Db::connection('mongo')->collection('default')->get(); + return json($logs); + } +} +``` + +### 运行测试 + +启动服务,然后用浏览器或者接口调试工具访问`http://IP:port/index/log`,控制器方法会先记录一条日志,然后再把整所有已经保存的日志全部都输出回来。 + +## 与文本日志对比 + +主要优势:方便查询(文本日志文件的最小粒度是一天一个文件,当日志量具大时,在几百M或者几个G甚至更大的一个文本文件中定位某行记录,简直就是灾难)。 + +主要劣势:需要自行处理过期记录(文本日志可以自动删除过期的文件)。 + +## 推荐 + +本文作者建好了一个开箱即用的webman+mongodb代码仓库: