PHPTrace 设计原理

简单介绍

PHPTrace致力于打造一款实时跟踪PHP函数调用,获取PHP函数调用栈信息以及PHP解释器状态的工具,这个PHP工具应该像系统工具strace/pstack一样强大易用。要设计完成这款工具,需要解决三方面的问题:

外部命令工具如何获取PHP进程内部的相关信息

能够实时开启和关闭,不需要编写代码或者修改配置

单独开启一个PHP进程的trace/stack功能,将线上服务器的影响减至最小

详细分析

1. 如何获取PHP进程内部的相关信息

strace可以通过系统调用ptrace,使被trace的进程每次进入或退出系统调用时暂停, 这样strace通过ptrace(PTRACE_PEEK*)获取此时进程内存的内容,从而获取到系统调用的名称、参数、返回值、调用时间等内容。

由于PHP是一种动态脚本语言,并不是传统的C调用模型,PHP程序的运行依赖于一个PHP的解释器。通过ptrace系统调用获取的是解释器本身的状况,控制系统调用的执行与暂停,而不是PHP脚本的运行情况,因此不能控制一个PHP函数的执行或暂停。

为了解决如何从PHP虚拟机中获取调用信息的难题,我们决定引入PHP扩展,由扩展hook PHP解释器,PHP解释器在每次执行一个PHP函数或扩展函数时,调用zend_execute_*等系列函数,通过 hook zend_execute_*系列函数,这样解释器在调用PHP函数或扩展函数时,先进入我们的PHPTrace的hook函数,PHPTrace获取到调用信息后,调用PHP解释器真正的执行函数,并在PHP真正执行函数退出后, 获取调用结果:返回值,调用耗时。

2. 实时开启和关闭

为了定位线上正在运行中的PHP出现的问题,开启trace或stack的功能不能依赖于修改配置文件和写PHP代码,应该能够想strace和pstack那样给一个进程的ID,实时开启或者关闭。

我们形成了外部命令行工具跟PHP扩展共同协作的设计,由命令通知扩展开始trace,扩展收到通知后才开始真正的抓取PHP调用信息,抓取的信息不断写到共享内存,命令行工具不断读取共享内存,从而实现PHPTrace随时随地实时输出trace结果的目的。

3. 单独开启一个PHP进程的trace/stack功能

开启一个进程的trace/stack功能,必然会降低该进程执行PHP脚本的性能,strace也是如此。但是其它没有开启该功能的进程应该不受影响。

在外部命令工具通知扩展执行trace之前, 扩展并不会抓取任何信息,仅仅判断trace开关的状态,然后调用了原PHP虚拟机的zend_execute_*函数, 基本不会增加开销。

总体设计

PHPTrace从设计上分为三大部分: 扩展、通信共享内存部分以及命令行工具。如下图所示:

扩展用于收集PHP解释器中的相关信息

通信共享内存部分负责在命令行工具和扩展之间传递控制信息和数据信息

命令行工具用于开启某一个进程的trace或stack功能,并输出相关信息

最后

因为解决了以上三个问题,PHPTrace可以帮助排查线上线下的各种PHP问题。

Xdebug虽有trace功能, 但其输出的结果却不能实时开启并打印出来;另外Xdebug挂钩了很多opcode,导致在不启用trace功能时,仍然有大量性能消耗。因此无法达到线上随时trace问题的要求。

本节主要偏重PHPTrace的设计原理,后续会给出每一部分的详细实现,敬请期待!

php trace 图形,PHP Trace 设计原理相关推荐

  1. php trace 函数,PHP Trace 实现原理

    phptrace 实现原理 总体介绍 PHPTrace致力于打造一款实时跟踪PHP函数调用,获取PHP函数调用栈信息以及PHP解释器状态的工具,这个PHP工具应该像系统工具strace/pstack一 ...

  2. 【闲聊杂谈】深入理解Spring Security设计原理

    1.什么是Spring Security 顾名思义,Security的意思是安全,本质上就是一个很纯粹的权限管理框架,提供认证和授权两大核心功能.在目前主流的Spring生态中的项目,说到安全框架,基 ...

  3. 移动端界面中的版式设计原理

    "我总觉得页面不太好看但是我又说不出来","我不懂设计,但是我就是觉得不协调","你觉得这好看?你的审美要加强啊"这些听着熟悉的话往往是产品 ...

  4. 《超越平凡的平面设计: 版式设计原理与应用》—色轮

    本节书摘来自异步社区<超越平凡的平面设计: 版式设计原理与应用>一书中的色轮,作者[美]John McWade,更多章节内容可以访问云栖社区"异步社区"公众号查看. 色 ...

  5. matlab图形与动画设计 pdf,MATLAB图形与动画设计

    基本信息 书名:MATLAB图形与动画设计 **:36.00元 售价:34.2元,便宜1.8元,折扣95 作者:张德丰,赵书梅,刘国希 出版社:国防工业出版社 出版日期:2009-04-01 ISBN ...

  6. 电极电阻测量,防雷接地电极设计原理和测试方案

    了解与接地电极系统设计相关的电极电阻测量是理解设计.接地电阻和土壤电阻率测量和计算的基本原理的关键.以下是地凯科技接地电极设计原理和测试系列的介绍 防雷接地的解决方案 1.土壤电阻率与测量 2.计算单 ...

  7. 角色扮演游戏引擎的设计原理--转自MOVE2008

    角色扮演游戏引擎的设计原理--转自MOVE2008 角色扮演游戏引擎的设计原理 角色扮演游戏(RPG)是深受广大游戏迷们喜爱的一种游戏, 它以独特的互动性和故事性吸引了无数的玩家.它向人们提供了超出现 ...

  8. 角色扮演游戏引擎的设计原理

    角色扮演游戏引擎的设计原理 角色扮演游戏(RPG)是深受广大游戏迷们喜爱的一种游戏, 它以独特的互动性和故事性吸引了无数的玩家.它向人们提供了超出现实生活的广阔的虚拟世界,使人们能够尝试扮演不同的角色 ...

  9. 移动端界面中的版式设计原理(上)

    "我总觉得页面不太好看但是我又说不出来","我不懂设计,但是我就是觉得不协调","你觉得这好看?你的审美要加强啊"这些听着熟悉的话往往是产品 ...

最新文章

  1. win10 4步快速安装vue
  2. knockout学习笔记目录
  3. 真正理解线程上下文类加载器(多案例分析)
  4. linux下perl命令行参数,Perl One-Liners | Perl命令行学习1 -e参数
  5. 高可用keepalived实例
  6. DefaultListableBeanFactory - Overriding bean defin
  7. QT5开发及实例学习之二信号和槽机制
  8. 解决Vscode编辑器不能打开多标签页问题
  9. 【论文解读】一种新的涨分神器!构造code-switching增广数据进行fine-tuning!
  10. mybatis支持属性使用驼峰的命名
  11. ZZNUOJ_C语言1083:数值统计(多实例测试)(完整代码)
  12. 论文摘要部分如何撰写
  13. 糖果将推翻译手机php切,全球首款翻译手机糖果S20发布 或将终结翻译机
  14. 爬取bili番剧相关内容
  15. 经典文献阅读之--Cam2BEV
  16. aegisub32汉化_Aegisub中文版(aegisub字幕特效)V3.2.3 免费版
  17. 阿里巴巴集团全资收购UC优视
  18. EasySysprep5系统封装教程
  19. 拼多多新阶段,透露出不寻常
  20. 蓝桥杯历届-奇妙的数字

热门文章

  1. WinRAR 在cmd执行rar压缩命令
  2. 【Pyhton】随机漫步散点图
  3. C#LeetCode刷题-队列
  4. 通用职责分配软件原则之8-中介原则
  5. 在Raspberry Pi上设置Docker的简单方法
  6. 如何创建多个条形图_学习使用D3创建条形图-初学者教程
  7. eos测试规格_希望您的测试更有效? 这样写您的规格。
  8. 离开载具_绝地最强载具登场?
  9. Mybatis使用之 Caused by: org.apache.ibatis.type.TypeException: Could not resolve type alias‘User’
  10. 如何用python写个人专属群聊提醒小助手?