搜索
首页php教程php手册开源PHP监控扩展:witness简介

1.问题的由来 PHP作为流行的服务器端脚本语言,广泛地用于各种服务器前端及应用的开发。虽然PHP作为脚本语言,天然具有良好的入门简单、容错性强、性能较高(在脚本语言中)的特点,但是,由于其多进程的执行模式,和前端Web系统通常采用多机器并行的运行模

1. 问题的由来

PHP作为流行的服务器端脚本语言,广泛地用于各种服务器前端及应用的开发。虽然PHP作为脚本语言,天然具有良好的入门简单、容错性强、性能较高(在脚本语言中)的特点,但是,由于其多进程的执行模式,和前端Web系统通常采用多机器并行的运行模式,导致在线上出现的某些和特定用户相关的问题时,很难收集全面的信息。

  1. 多进程+多机器+用户请求随机分发,导致不知道某个用户的请求会在哪台机器的哪个进程执行;
  2. 如果在所有机器和进程都加入调试语句,会导致大量的无关日志输出,或可能影响无关的用户;
  3. 由于同一用户的两个请求是被随机分散的,导致难以获取具体某个用户出错时的点击流;
  4. 在大型系统中,由于组件多,关联复杂,不容易直接定位问题源头出自哪个模块以增加输出信息;
  5. 通过输出日志等方式,往往需要多次尝试后才能逐步逼近问题的源头,对提高查错速度不利;
  6. 这种即时在线上增加调试或者写日志的代码,可能引入意外的bug,带来额外风险。

另外,作为一种轻便的快速开发脚本,加上现在流行的敏捷等快速开发模式,不管它们吹嘘得如何天花乱坠,对于测试的完备性、代码的健壮性,其实质效果是大大降低的。所以,在上线后发现问题再快速打补丁或者快速迭代,是业内一种常见的模式。而在这个环节中,快速定位问题是打补丁或者后续迭代的前提。

于是,针对这种情况,我们开发了witness系统(witness--证人,它的证词可以帮助我们还原“犯罪”现场)。该系统能让我们在处理上述问题时,更简便,更有效率,更全面的得到所有相关数据,从而加快分析问题和处理问题的过程。

witness系统的主要特点如下:

  1. 非嵌入式监控,无需修改运行的PHP代码
  2. 可以通过cookie监控特定的请求
  3. 轻量级,灵活度高
  4. 高性能

项目已开源:https://github.com/ucweb/witness

2. 系统架构

PHP分析调试系统主要分为三部分:witness扩展、数据传输,数据展示。

总体架构如下图:

witness_framework

2.1. witness扩展

witness扩展主要的功能是嵌入PHP引擎底层,监控和收集一切可用的信息,并通过数据传输系统,反馈到后端,以便于分析处理这些数据。

witness扩展目前可以有两种监控模式,如下表:

方式

功能

备注

trace

记录从开始到结束期间,所有函数调用的次序,以及这些调用参数、返回值等。同时也会记录当前一些关键的环境参数和请求参数。

适用于监控整个逻辑处理流程

dump

记录当前的调用栈的静态信息,包括每层函数执行的当前行号、每层调用的参数、局部变量,全局变量、静态变量等

适用于监控当前某个点的整体状态

简单的对这两种模式做个对比:trace模式就好比拍视频,dump模式就相当于拍照片--视频能展现连续变化,而照片则会保留更多细节,清晰度也更高。

2.2. 数据传输

主要功能有三点:

  1. 收集本地各进程的witness扩展传出的信息,并整理成独立的数据文件;
  2. 收集位于各台机器上的数据文件,汇总到MQ中;
  3. 从MQ上获取相关的数据导入到后端的展示系统中。

2.3. 数据展示

由于witness后端的数据采用SQLite存储文件,所以它并不适合直接阅读和分析(可以通过SQLite的cli接口可以直接阅读这些db文件,但是很不直观)。因此,一般情况下都建议使用脚本,将其中信息提取加工后,进行可视化展示。

目前我们附带有基于本地源代码展开的示例脚本,位于:

scripts/genhtml.php

如果现有项目有自己的控制平台,可以根据实际情况,将其根据实际情况和需求,做具体的适配。

3. 使用witness

3.1. 系统依赖

以下是witness扩展的一些依赖和限制,包括目前已经测试通过并上线运行的配置:

项目

依赖

已测试

操作系统

仅支持linux兼容系统,不支持Windows系统

RHEL 5.4

内核

2.6或以上

2.6.18-164.el5

位宽

x86/x86_64/amd64

一般而言不推荐x86,因为可能会遇到内存瓶颈

x86_64

gcc

gcc 4.1.2或以上

gcc version 4.1.2 20080704 

Red Hat 4.1.2-48

PHP

5.3.X或以上(参见注意事项

5.3.4/5.3.8

SQLite

3.3.6或以上

SQLite version 3.3.6

注意:目前,我们并未在PHP的5.4.X5.5.X版本上测试过witness扩展。因为witness扩展直接从Zend引擎获取信息,因此,当PHP内核出现较大的优化和修改时(一般表现为大版本的升级),无法确保兼容性

如有需要在5.4.X或5.5.X版本上使用witness扩展的朋友,请确保经过测试并且一切正常。如果可能的话,无论是否测试通过,都欢迎向我们反馈信息,我们都将第一时间跟进,并及时更新兼容版本情况。

3.2. 安装

witness扩展以基本的PHP扩展安装方式进行:

$ cd witness/witness && phpize && ./configure && make clean && make && make install

安装完成后,需要修改php.ini:

$ echo "extension=witness.so" >> php.ini

最后,用以下命令检查安装是否成功:

$ php -m | grep witness
witness

3.3. 配置witness扩展

witness扩展提供了多项配置以控制其行为,在php.ini中增加或修改以下的项:

[witness]

; 最大监控的调用栈深度,如果超出此深度,会停止监控行为(并报错)
; 此限制的目的是防止代码中出现无限递归,一般情况下不会有那么深的调用
; 如果确实有需要,可以调大此值,会增加少许内存消耗
witness.max_stack = 16384

; 是否记录内置函数的行为(包括PHP的require/include等和各种扩展提供的函数等)
; 一般情况下不建议打开,因为这些数据会很多,而且往往对排除故障没有什么帮助
witness.record_internal = false

; 自动启动监控的cookie项
; 如果在某个请求的cookie中找到此项所配置的名字,则会自动启动监控
; 而该项对应的值中按照格式解析出的token会作为这次请求的标识(具体见后文)
; 如果此项留空,则不启用自动监控功能
witness.auto_start_token = ""

; 结果上传的URL
; 结果以文件的方式,通过HTTP POST上传到服务器中
; 该服务器可能是HTTP文件服务器,也可能是MQ等服务器
; 有效的url配置类似于:http://127.0.0.1:1218/?name=witness_$token$&opt=put
; 特别的,此url中$token$串会被实际的token值替换
; 如果此项留空,则表示不需要进行上传操作
witness.post_url = ""

; 临时文件夹路径
; 如果数据文件根据post_url配置,成功的上传到服务器中,则会删除相关的临时文件
; 如果post_url项为空,临时数据文件会保留在该路径中
witness.temp_path = "/dev/shm"

; 如果开启了上传操作,并且上传失败,是否保留记录数据在临时文件夹
witness.keep_record = false

; 是否开启dump功能
witness.enable_dump = false

; 是否开启assert功能
witness.enable_assert = false

以上各项中红色部分为其默认值,如果不提供该项,则会以该值处理。

3.4. 使用trace模式监控

3.4.1. cookie格式

如上一节所述:

; 自动启动监控的cookie项
; 如果在某个请求的cookie中找到此项所配置的名字,则会自动启动监控
; 而该项对应的值中按照格式解析出的token会作为这次请求的标识(具体见后文)
; 如果此项留空,则不启用自动监控功能
witness.auto_start_token = ""

例如当前的auto_start_token配置信息如下:

witness.auto_start_token = "my_token"

则如果某HTTP请求携带了以下的cookie,会自动启动监控:

my_token=10:my_project

其中的字段及内容如下:

内容

功能

备注

my_token

即为auto_start_token的值。

10

ttl,每一次成功启动监控,会把此ttl值减一后设置给浏览器,当ttl为0时会删除此整条cookie。

可以通过ttl,控制对每个用户的监控次数

my_project

自定义的token名

3.4.2. 启动方式

witness扩展启动trace模式监控的方法有两种:

  1. 根据请求中检查是否带有特定的cookie信息,如是,则启动监控
  2. 调用witness_start接口手动启动监控

witness扩展结束监控的方式也有两种:

  1. 在一次请求处理结束后会自动停止监控
  2. 调用witness_stop接口手动停止监控

trace模式监控手动接口信息如下:

接口

功能

参数/返回值

作用

witness_set_token

设置默认的token

token

新的token默认值,在有需要token而又没提供token的时候以此值覆盖。

如果之前已设有默认值,则以此值覆盖。

witness_start

手动启动监控

token(可选)

此次dump的token

如不提供,则使用set_token设置的默认值

true/false

返回值。如果成功启动,则为true。如果之前已经启动,则无操作,返回成功。

witness_stop

手动停止监控

true/false

返回值。如果当前并无启动监控,则无操作,返回失败。

无论以何种方式,在witness扩展启动监控时,都会带有一个token标识。这个token标识会带入展示系统中,作为区分不同的监控项目的标志。

在系统运行时,除非监控被启动,否则witness扩展都不会进行任何操作,也不会对运行造成任何影响。当监控启动后,witness扩展在后台记录所有的运行状态和信息,不会对前台代码造成任何影响--包括性能和运行速度,实际测试中,开启监控的请求,其运行性能下降不到5%。

3.5. 使用dump操作

如果我们希望使用witness来记录程序执行中某个时刻的所有信息及状态,可以使用dump操作。Dump操作无法自动启动,必须在代码中手动调用witness_dump或者witness_assert接口来启动。

其中:

接口

功能

参数/返回值

作用

witness_dump

无条件启动dump操作

token(可选)

此次dump的token

如不提供,则使用set_token设置的默认值

true/false

返回值。如果成功dump,则true

witness_assert

有条件启动dump操作

expression

布尔值的条件表达式。

如果表达式为false,则启动dump操作

token(可选)

此次dump的token

如不提供,则使用set_token设置的默认值

true/false

返回值。为传入的expression的值。

witness_dump和witness_assert都在配置中提供了单独的开关,当开关关闭(false)时,调用对应的接口不会启动dump操作,也不会报错--witness_assert会按正常方式返回expression的值。这有助于在开发、测试、线上使用同一份代码的前提下,区别线上运行环境和本地测试环境,并减少(删代码或屏蔽代码)带来不必要的麻烦--推荐线上关闭这两个开关,测试环境打开。

dump操作不会对请求的执行产生持续性的性能损耗,仅会在每次启动时产生极轻微的性能干扰(消耗时间小于1ms)。但是,如果同时出现大量的dump操作,可能会导致操作系统的CPU和内存出现资源紧张,故同样不宜滥用。

3.6. 本地展示

项目内带有本地展示脚本,可以把生成的数据文件通过代码,直观的转换为嵌入源码的页面,方便调试。

3.6.1. 生成页面

通过本地展示脚本生成页面的方式如下:

$ php genhtml.php 
Usage: php genhtml [记录文件全路径] [生成的html路径]

生成的html文件的结构大致如下:

$ tree -L 1
.
|– glass.png
|– index.html            //首页
|– src                    //代码页面
|– var                    //变量页面
`– witness.css

注意,运行该脚本的机器中,源码路径及结构必须和收集该信息的机器一致(绝对路径)。

3.6.2. 示例

以下URL就是example目录下的展示脚本转换出来的结果:http://ucweb.github.io/witness_report/

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
YOLOv6又快又准的目标检测框架已经开源了YOLOv6又快又准的目标检测框架已经开源了May 09, 2023 pm 02:52 PM

作者:楚怡、凯衡等近日,美团视觉智能部研发了一款致力于工业应用的目标检测框架YOLOv6,能够同时专注于检测的精度和推理效率。在研发过程中,视觉智能部不断进行了探索和优化,同时吸取借鉴了学术界和工业界的一些前沿进展和科研成果。在目标检测权威数据集COCO上的实验结果显示,YOLOv6在检测精度和速度方面均超越其他同体量的算法,同时支持多种不同平台的部署,极大简化工程部署时的适配工作。特此开源,希望能帮助到更多的同学。1.概述YOLOv6是美团视觉智能部研发的一款目标检测框架,致力于工业应用。

基于开源的 ChatGPT Web UI 项目,快速构建属于自己的 ChatGPT 站点基于开源的 ChatGPT Web UI 项目,快速构建属于自己的 ChatGPT 站点Apr 15, 2023 pm 07:43 PM

作为一个技术博主,了不起比较喜欢各种折腾,之前给大家介绍过ChatGPT​接入微信,钉钉和知识星球(如果没看过的可以翻翻前面的文章),最近再看开源项目的时候,发现了一个ChatGPTWebUI项目。想着刚好之前没有将ChatGPT​接入过WebUI,有了这个开源项目可以拿来使用,真是不错,下面是实操的安装步骤,分享给大家。安装官方在Github​的项目文档上提供了很多中的安装方式,包括手动安装,docker​部署,以及远程部署等方法,了不起在选择部署方式的时候,一开始为了简单想着

MLC LLM:开源AI聊天机器人,支持离线运行,适用于集成显卡电脑和iPhone。MLC LLM:开源AI聊天机器人,支持离线运行,适用于集成显卡电脑和iPhone。May 06, 2023 pm 03:46 PM

5月2日消息,目前大多数AI聊天机器人都需要连接到云端进行处理,即使可以本地运行的也配置要求极高。那么是否有轻量化的、无需联网的聊天机器人呢?一个名为MLCLLM的全新开源项目已在GitHub上线,完全本地运行无需联网,甚至集显老电脑、苹果iPhone手机都能运行。MLCLLM项目介绍称:“MLCLLM是一种通用解决方案,它允许将任何语言模型本地部署在一组不同的硬件后端和本地应用程序上,此外还有一个高效的框架,供每个人进一步优化自己用例的模型性能。一切都在本地运行,无需服务器支持,并通过手机和笔

仅需1% Embedding参数,硬件成本降低十倍,开源方案单GPU训练超大推荐模型仅需1% Embedding参数,硬件成本降低十倍,开源方案单GPU训练超大推荐模型Apr 12, 2023 pm 03:46 PM

深度推荐模型(DLRMs)已经成为深度学习在互联网公司应用的最重要技术场景,如视频推荐、购物搜索、广告推送等流量变现业务,极大改善了用户体验和业务商业价值。但海量的用户和业务数据,频繁地迭代更新需求,以及高昂的训练成本,都对 DLRM 训练提出了严峻挑战。在 DLRM 中,需要先在嵌入表(EmbeddingBags)中进行查表(lookup),再完成下游计算。嵌入表常常贡献 DLRM 中 99% 以上的内存需求,却只贡献 1% 的计算量。借助于 GPU 片上高速内存(High Bandwidth

用图像对齐所有模态,Meta开源多感官AI基础模型,实现大一统用图像对齐所有模态,Meta开源多感官AI基础模型,实现大一统May 11, 2023 pm 07:25 PM

在人类的感官中,一张图片可以将很多体验融合到一起,比如一张海滩图片可以让我们想起海浪的声音、沙子的质地、拂面而来的微风,甚至可以激发创作一首诗的灵感。图像的这种「绑定」(binding)属性通过与自身相关的任何感官体验对齐,为学习视觉特征提供了大量监督来源。理想情况下,对于单个联合嵌入空间,视觉特征应该通过对齐所有感官来学习。然而这需要通过同一组图像来获取所有感官类型和组合的配对数据,显然不可行。最近,很多方法学习与文本、音频等对齐的图像特征。这些方法使用单对模态或者最多几种视觉模态。最终嵌入仅

首个大众可用PyTorch版AlphaFold2复现,哥大开源,star量破千首个大众可用PyTorch版AlphaFold2复现,哥大开源,star量破千Apr 13, 2023 am 09:58 AM

刚刚,哥伦比亚大学系统生物学助理教授 Mohammed AlQuraishi 在推特上宣布,他们从头训练了一个名为 OpenFold 的模型,该模型是 AlphaFold2 的可训练 PyTorch 复现版本。Mohammed AlQuraishi 还表示,这是第一个大众可用的 AlphaFold2 复现。AlphaFold2 可以周期性地以原子精度预测蛋白质结构,在技术上利用多序列对齐和深度学习算法设计,并结合关于蛋白质结构的物理和生物学知识提升了预测效果。它实现了 2/3 蛋白质结构预测的卓

伯克利开源首个泊车场景下的高清数据集和预测模型,支持目标识别、轨迹预测伯克利开源首个泊车场景下的高清数据集和预测模型,支持目标识别、轨迹预测Apr 12, 2023 pm 11:40 PM

在自动驾驶技术不断迭代的当下,车辆的行为和轨迹预测对高效、安全驾驶有着极为重要的意义。动力学模型推演、可达性分析等传统的轨迹预测的方法虽然有着形式明晰、可解释性强的优点,但在复杂的交通环境中,其对于环境和物体交互的建模能力较为有限。因此,近年来大量研究和应用都基于各种深度学习方法(例如 LSTM、CNN、Transformer、GNN 等),各类数据集例如 BDD100K、nuScenes、Stanford Drone、ETH/UCY、INTERACTION、ApolloScape 等也纷纷涌现

Stable Diffusion-XL开启公测,让你摆脱繁琐的长prompt!Stable Diffusion-XL开启公测,让你摆脱繁琐的长prompt!Apr 23, 2023 am 10:16 AM

自从Midjourney发布v5之后,在生成图像的人物真实程度、手指细节等方面都有了显著改善,并且在prompt理解的准确性、审美多样性和语言理解方面也都取得了进步。相比之下,StableDiffusion虽然免费、开源,但每次都要写一大长串的prompt,想生成高质量的图像全靠多次抽卡。最近StabilityAI的官宣,正在研发的StableDiffusionXL开始面向公众测试,目前可以在Clipdrop平台免费试用。试用链接:​https://clipdrop.co/stable-diff

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
2 周前By尊渡假赌尊渡假赌尊渡假赌
仓库:如何复兴队友
4 周前By尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒险:如何获得巨型种子
3 周前By尊渡假赌尊渡假赌尊渡假赌

热工具

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

适用于 Eclipse 的 SAP NetWeaver 服务器适配器

适用于 Eclipse 的 SAP NetWeaver 服务器适配器

将Eclipse与SAP NetWeaver应用服务器集成。

mPDF

mPDF

mPDF是一个PHP库,可以从UTF-8编码的HTML生成PDF文件。原作者Ian Back编写mPDF以从他的网站上“即时”输出PDF文件,并处理不同的语言。与原始脚本如HTML2FPDF相比,它的速度较慢,并且在使用Unicode字体时生成的文件较大,但支持CSS样式等,并进行了大量增强。支持几乎所有语言,包括RTL(阿拉伯语和希伯来语)和CJK(中日韩)。支持嵌套的块级元素(如P、DIV),

Atom编辑器mac版下载

Atom编辑器mac版下载

最流行的的开源编辑器