首頁 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 Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1664
14
CakePHP 教程
1423
52
Laravel 教程
1318
25
PHP教程
1269
29
C# 教程
1248
24
在PHP API中說明JSON Web令牌(JWT)及其用例。 在PHP API中說明JSON Web令牌(JWT)及其用例。 Apr 05, 2025 am 12:04 AM

JWT是一種基於JSON的開放標準,用於在各方之間安全地傳輸信息,主要用於身份驗證和信息交換。 1.JWT由Header、Payload和Signature三部分組成。 2.JWT的工作原理包括生成JWT、驗證JWT和解析Payload三個步驟。 3.在PHP中使用JWT進行身份驗證時,可以生成和驗證JWT,並在高級用法中包含用戶角色和權限信息。 4.常見錯誤包括簽名驗證失敗、令牌過期和Payload過大,調試技巧包括使用調試工具和日誌記錄。 5.性能優化和最佳實踐包括使用合適的簽名算法、合理設置有效期、

解釋PHP中的晚期靜態綁定(靜態::)。 解釋PHP中的晚期靜態綁定(靜態::)。 Apr 03, 2025 am 12:04 AM

靜態綁定(static::)在PHP中實現晚期靜態綁定(LSB),允許在靜態上下文中引用調用類而非定義類。 1)解析過程在運行時進行,2)在繼承關係中向上查找調用類,3)可能帶來性能開銷。

什麼是PHP魔術方法(__ -construct,__destruct,__call,__get,__ set等)並提供用例? 什麼是PHP魔術方法(__ -construct,__destruct,__call,__get,__ set等)並提供用例? Apr 03, 2025 am 12:03 AM

PHP的魔法方法有哪些? PHP的魔法方法包括:1.\_\_construct,用於初始化對象;2.\_\_destruct,用於清理資源;3.\_\_call,處理不存在的方法調用;4.\_\_get,實現動態屬性訪問;5.\_\_set,實現動態屬性設置。這些方法在特定情況下自動調用,提升代碼的靈活性和效率。

PHP和Python:比較兩種流行的編程語言 PHP和Python:比較兩種流行的編程語言 Apr 14, 2025 am 12:13 AM

PHP和Python各有優勢,選擇依據項目需求。 1.PHP適合web開發,尤其快速開發和維護網站。 2.Python適用於數據科學、機器學習和人工智能,語法簡潔,適合初學者。

PHP行動:現實世界中的示例和應用程序 PHP行動:現實世界中的示例和應用程序 Apr 14, 2025 am 12:19 AM

PHP在電子商務、內容管理系統和API開發中廣泛應用。 1)電子商務:用於購物車功能和支付處理。 2)內容管理系統:用於動態內容生成和用戶管理。 3)API開發:用於RESTfulAPI開發和API安全性。通過性能優化和最佳實踐,PHP應用的效率和可維護性得以提升。

PHP:網絡開發的關鍵語言 PHP:網絡開發的關鍵語言 Apr 13, 2025 am 12:08 AM

PHP是一種廣泛應用於服務器端的腳本語言,特別適合web開發。 1.PHP可以嵌入HTML,處理HTTP請求和響應,支持多種數據庫。 2.PHP用於生成動態網頁內容,處理表單數據,訪問數據庫等,具有強大的社區支持和開源資源。 3.PHP是解釋型語言,執行過程包括詞法分析、語法分析、編譯和執行。 4.PHP可以與MySQL結合用於用戶註冊系統等高級應用。 5.調試PHP時,可使用error_reporting()和var_dump()等函數。 6.優化PHP代碼可通過緩存機制、優化數據庫查詢和使用內置函數。 7

PHP的持久相關性:它還活著嗎? PHP的持久相關性:它還活著嗎? Apr 14, 2025 am 12:12 AM

PHP仍然具有活力,其在現代編程領域中依然佔據重要地位。 1)PHP的簡單易學和強大社區支持使其在Web開發中廣泛應用;2)其靈活性和穩定性使其在處理Web表單、數據庫操作和文件處理等方面表現出色;3)PHP不斷進化和優化,適用於初學者和經驗豐富的開發者。

說明匹配表達式(PHP 8)及其與開關的不同。 說明匹配表達式(PHP 8)及其與開關的不同。 Apr 06, 2025 am 12:03 AM

在PHP8 中,match表達式是一種新的控制結構,用於根據表達式的值返回不同的結果。 1)它類似於switch語句,但返回值而非執行語句塊。 2)match表達式使用嚴格比較(===),提升了安全性。 3)它避免了switch語句中可能的break遺漏問題,增強了代碼的簡潔性和可讀性。

See all articles