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

开源PHP监控扩展:witness简介

Jun 06, 2016 pm 08:10 PM
php 오픈 소스 확장하다 감시 장치 소개

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으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
2 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
2 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
2 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

CakePHP 프로젝트 구성 CakePHP 프로젝트 구성 Sep 10, 2024 pm 05:25 PM

이번 장에서는 CakePHP의 환경 변수, 일반 구성, 데이터베이스 구성, 이메일 구성에 대해 알아봅니다.

Ubuntu 및 Debian용 PHP 8.4 설치 및 업그레이드 가이드 Ubuntu 및 Debian용 PHP 8.4 설치 및 업그레이드 가이드 Dec 24, 2024 pm 04:42 PM

PHP 8.4는 상당한 양의 기능 중단 및 제거를 통해 몇 가지 새로운 기능, 보안 개선 및 성능 개선을 제공합니다. 이 가이드에서는 Ubuntu, Debian 또는 해당 파생 제품에서 PHP 8.4를 설치하거나 PHP 8.4로 업그레이드하는 방법을 설명합니다.

CakePHP 날짜 및 시간 CakePHP 날짜 및 시간 Sep 10, 2024 pm 05:27 PM

cakephp4에서 날짜와 시간을 다루기 위해 사용 가능한 FrozenTime 클래스를 활용하겠습니다.

CakePHP 파일 업로드 CakePHP 파일 업로드 Sep 10, 2024 pm 05:27 PM

파일 업로드 작업을 위해 양식 도우미를 사용할 것입니다. 다음은 파일 업로드의 예입니다.

CakePHP 라우팅 CakePHP 라우팅 Sep 10, 2024 pm 05:25 PM

이번 장에서는 라우팅과 관련된 다음과 같은 주제를 학습하겠습니다.

CakePHP 토론 CakePHP 토론 Sep 10, 2024 pm 05:28 PM

CakePHP는 PHP용 오픈 소스 프레임워크입니다. 이는 애플리케이션을 훨씬 쉽게 개발, 배포 및 유지 관리할 수 있도록 하기 위한 것입니다. CakePHP는 강력하고 이해하기 쉬운 MVC와 유사한 아키텍처를 기반으로 합니다. 모델, 뷰 및 컨트롤러 gu

CakePHP 데이터베이스 작업 CakePHP 데이터베이스 작업 Sep 10, 2024 pm 05:25 PM

CakePHP에서 데이터베이스 작업은 매우 쉽습니다. 이번 장에서는 CRUD(생성, 읽기, 업데이트, 삭제) 작업을 이해하겠습니다.

CakePHP 유효성 검사기 만들기 CakePHP 유효성 검사기 만들기 Sep 10, 2024 pm 05:26 PM

컨트롤러에 다음 두 줄을 추가하면 유효성 검사기를 만들 수 있습니다.

See all articles