2023-07-05 11:08:51 3008次浏览 3条回答 0 悬赏 10 金钱

新入坑 Yii2,虽然会点儿 PHP,但是之前没接触过 Yii 框架,网上也找了些答案,都没有准确的解决。
1、怎么将请求参数及返回数据一并记录成 JSON 日志,这一步已经勉强实现,但是我感觉记录的时间是返回时间,而不是请求时间,我想知道怎么记录请求时间,我的实现是在 Response::EVENT_BEFORE_SEND 事件中去记录。
2、Yii2 怎么接入 opentelemetry,最好是能记录带参数的。
3、缓存设置为 Redis,怎么手动指定 key,我现在使用的笨办法 \Yii::$app->redis->set

最佳答案

  • PHP学院的中学生 发布于 2023-07-07 09:46 举报

    对于你的问题,我可以给出一些指导:

    记录请求时间:你可以在请求开始时获取当前时间,并将其保存在一个变量中。然后,在Response::EVENT_BEFORE_SEND事件中获取当前时间,并计算与请求开始时间的时间差。这样你就可以记录请求的开始时间和返回时间了。以下是一个简单的示例代码:

    use yii\web\Response;
    
    // 在请求开始时记录请求开始时间
    $requestStartTime = microtime(true);
    
    // 注册 Response::EVENT_BEFORE_SEND 事件
    \Yii::$app->response->on(Response::EVENT_BEFORE_SEND, function () use ($requestStartTime) {
        // 获取当前时间并计算与请求开始时间的时间差
        $requestEndTime = microtime(true);
        $requestTime = $requestEndTime - $requestStartTime;
    
        // 将请求时间记录到日志中
        \Yii::info('Request time: ' . $requestTime . ' seconds', 'application');
    });
    
    
    

    接入 opentelemetry:要在 Yii2 中接入 opentelemetry,你可以使用 OpenTelemetry PHP SDK。你需要安装相关依赖,然后按照 OpenTelemetry 的文档配置和初始化 SDK。下面是一个简单的示例:

    use OpenTelemetry\Contrib\Zipkin\Exporter;
    use OpenTelemetry\Sdk\Trace;
    
    // 配置 Zipkin Exporter
    $exporter = new Exporter([
        'endpoint_url' => 'http://your-zipkin-collector-endpoint',
        'service_name' => 'your-service-name',
    ]);
    
    // 初始化 Trace SDK
    $tracer = Trace::getTracerProvider()->getTracer('your-service-name');
    $span = $tracer->startAndActivateSpan('your-span-name');
    
    // 在需要追踪的地方添加自定义属性或事件
    $span->setAttribute('your-attribute-key', 'your-attribute-value');
    $span->addEvent('your-event-name', ['your-event-attribute-key' => 'your-event-attribute-value']);
    
    // 结束追踪
    $span->end();
    
    // 清理和导出追踪数据
    \OpenTelemetry\Sdk\Trace\TracerProvider::shutdown();
    $exporter->export();
    
    

    你需要根据你所使用的具体追踪系统(如 Zipkin)来配置和初始化对应的 Exporter。

    手动指定 Redis 缓存键名:使用 Yii2 的 Redis 缓存组件,你可以手动指定键名来进行缓存操作。以下是一个简单的示例:

    $key = 'your-custom-key';
    $value = 'your-value';
    
    \Yii::$app->redis->set($key, $value);
    
    
    1 条回复
    回复于 2023-07-26 10:41 回复

    1、第一个时间我的理解是有问题的,因为下面是注册事件,事件注册好了之后,后续的请求是不会再到那个时间,即: $requestStartTime = microtime(true); 这里的。
    2、我想知道如何全局劫持,而不需要每个方法都要去控制记录。
    3、你这样写只是使用的redis的set,我提问的时候就是这样写的,我指的是cache这种方式如何实现。

    , 觉得很赞
  • 回答于 2023-07-05 15:27 举报
    1. 在接口的构造函数,或者是父类里面,记录收到请求的时间;
    2. 官方手册找demo:https://opentelemetry.io/docs/
    3. 去看 Yii2 的手册,https://www.yiichina.com/doc/guide/2.0/caching-data ,里面有 $cache->set($key, $data),看看怎么引入 Redis 成为 $cache 对象。
    觉得很赞
  • 回答于 2023-08-30 14:54 举报

    欢迎使用店滴 cms(ddiot)

    在这里插入图片描述

    店滴云,让经营场所,更智能。围绕茶室、酒店、健身房、公寓、出租房等经营性场所进行物联网改造。同时支持多种物联网通信协议,开放智能门锁,智能开关,智能手环的sdk供开发者使用。

    官方地址

    店滴云官网
    官方开源库
    cms源码

    开发者参与

    qq群

    :823429313,点击可直接加入:开发者交流群

    微信公众号

    在这里插入图片描述

    特性

    • 使用稳定的 YII 框架,优化处理开发过程,开发体验如 tp 一样顺滑。
    • 支持多层权限管控,路由权限,数据权限,菜单权限,集团权限,商户权限,扩展功能权限随意搭配调度
    • 基于 swoole 协程化,定时任务调度,im 聊天环境支持,系统接口支持协程,应对高并发
    • 开源百度 ai 接口对接,完成人脸库维护,人脸库创建,人脸库在线识别,人脸会员建立
    • 多模块可安装,便于迅速扩展业务,支持横向纵向双向扩展业务需求
    • 后台支持多种开发模式,php 混合开发,element-ui 的 vue 开发模式,纯 html 的传统开发都支持
    • 表单多样,除 yii 自身的表单组件,系统还对表单做了丰富,支持一句话配置万能表单
    • gii代码自动生成,包括扩展模块,数据库模型,检索模型,控制器和接口都可以自动生成
    • element-ui+uniapp+店滴cms,中后台,多端兼容,数据处理全部支持且开源

    环境准备:

    php>=7.3
    redis
    git 工具下载:https://git-scm.com/downloads
    composer https://www.phpcomposer.com/
    composer建议使用阿里镜像 https://developer.aliyun.com/composer
    

    第一步:git 下载代码

    git clone https://toscode.gitee.com/wayfirer/ddicms.git
    
    

    第二步:更新 composer 扩展

    cd 你的文件路径
    composer update
    
    

    第三步:建立数据库并完成配置

    cd common\config
    
    vim common\config\main-local.php
    
    
    <?php
    
    /**
     * @Author: Wang Chunsheng 2192138785@qq.com
     * @Date:   2020-03-12 20:12:31
     * @Last Modified by:   Wang chunsheng  email:2192138785@qq.com
     * @Last Modified time: 2021-04-09 18:25:50
     */
    
    return [
        'components' => [
            'db' => [
                'class' => 'yii\db\Connection',
                'dsn' => 'mysql:host=localhost;dbname=netos',
                'username' => 'root',
                'password' => 'root',
                'charset' => 'utf8',
                'attributes'  => [
                    PDO::ATTR_STRINGIFY_FETCHES => false,
                    PDO::ATTR_EMULATE_PREPARES  => false,
                ],
            ],
            'mailer' => [
                'class' => 'yii\swiftmailer\Mailer',
                'viewPath' => '@common/mail',
                // send all mails to a file by default. You have to set
                // 'useFileTransport' to false and configure a transport
                // for the mailer to send real emails.
                'useFileTransport' => true,
            ],
        ],
        'language' => 'zh-CN',
    
    ];
    
    
    make distclean
    
    phpize && \
    ./configure  --with-php-config=/www/server/php/74/bin/php-config  \
    --enable-openssl \
    --with-openssl-dir  \
    --enable-swoole-curl  \
    --enable-http2 && \
    make && sudo make install
    
    
    
    
    

    Nginx 部署配置

    首先解析网站到 frontend\web,然后配置 nginx 如下:

    server {
            listen        80;
            server_name  www.ai.com;
            root   "*/firetech/frontend";
            add_header Access-Control-Allow-Origin *;
            add_header Access-Control-Allow-Headers X-Requested-With,Authorization,Content-Type,access-token,bloc-id,store-id;
            add_header Access-Control-Allow-Methods GET,POST,OPTIONS,DELETE,PUT;
    
            location /api {
                index index.php index.html;
                if (!-e $request_filename)
                {
                    rewrite ^/api/(.*)$ /api/index.php last;
                }
                if (!-f $request_filename){
                    set $rule_0 1$rule_0;
                }
            }
    
            location /admin {
                index index.php index.html;
                if (!-e $request_filename)
                {
                    rewrite ^/admin/(.*)$ /admin/index.php last;
                }
            }
    
            location / {
                proxy_http_version 1.1;
                proxy_set_header Connection "keep-alive";
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header SERVER_NAME $server_name;
                if (!-e $request_filename) {
                    proxy_pass http://127.0.0.1:9501;
                }
            }
    }
    
    
    

    特别鸣谢

    感谢以下的项目,排名不分先后

您需要登录后才可以回答。登录 | 立即注册
Spider
实习生

Spider 广东深圳

注册时间:2023-07-05
最后登录:2023-08-01
在线时长:0小时25分
  • 粉丝1
  • 金钱10
  • 威望0
  • 积分10

热门问题