跨平台PHP调试器设计及使用方法——立项
作为一个闲不住且希望一直能挑战自己的人,我总是在琢磨能做点什么。自从今年初开始接触PHP,我也总想能在这个领域内产生点贡献。那能做点什么呢?我经常看到很多phper说自己设计了一个什么框架,或者说自己搭建了一个什么系统。虽然这些对自己来说算是一种历练,但是这些对更多的人来说可能并没太多帮助。而我希望我能做的是可以帮助到更多人的东西。于是就有了标题中这个项目的立项。(转载请指明出于breaksoftware的csdn博客)
这个项目的相关想法我酝酿了一两个月。利用零零散散的时间我不停的调研相关技术可能性,思考产品的形态和功能。于是在今年七月份,我给组内发了一份《PHP调试器设计心路历程和初步想法》的邮件。现在翻看了一下这封邮件,写的还算正式。我就将该邮件的内容作为该博文的主要内容给贴出来,最后我会对该封邮件进行补充:
Hi all:
由于我们组需要产出一些公共使用的组件,所以上次会上我提出一个制作PHP调试器的想法。
这个想法的初衷是为了解决PHP调试的一些痛点。我观察并询问了一些长期从事PHP开发的同学,发现他(她)们几乎都是使用var_dump/print之类的打印方法去进行调试。这个方法虽然很管用,但是其也有很多弊端:
- 需要改动源码进行调试。要在需要观察的数据的地方加上打印函数,否则无法观察数据。
- 增加代码出错的概率。调试结束后还需要找到之前添加的打印函数,并删除它们,如果忘记删除可能会导致输出错误。
- 降低效率。由于调试前需要修改文件,调试结束后还需要还原文件。这个过程消耗的时间会大大降低我们调试的效率。
- 不可更改性。我们可能对需要打印的数据做了错误的判断,导致打印数据的位置不正确,从而导致本次增加的调试信息不可以辅助我们调试。而这种不可更改性,需要我们重新修改文件以进行新的调试。
基于以上的问题,我最初的想法是想设计出一种PHP扩展,它将所有过程中的变量(全局变量,成员变量,临时变量等)都保存起来。这是一种轻量级的设计,可以让我们在执行一次PHP文件后,记录所有变量,然后回溯各个变量的值。但是这个方案我觉得存在以下问题:
- 大数据量。比如我们在PHP中需要读出一个文件,这个文件的内容可能只是简单使用一下,而我们的设计将要永久记录下它。
- 循环中处理数据的问题。如果循环中不停读取文件和写文件,那么我们要要记录大量中间数据。
- 递归处理数据问题。问题同上。
- 浪费磁盘空间,影响效率。因为存在可能需要将大量数据存储中磁盘中的操作,所以这个效率将影响整个调试过程。
- 不具有通用性。我们要输出的是一个希望大家都能使用起来的产品,这种轻量级的产品存在之前列出的很多的缺点,所以不可能成为一个通用性的产品。
于是上周五我将这个方案给否了,又进行一次方案的调研和设计。好在天无绝人之路,我找到一个我们可以做、且很有前景的一个方案:Xdebug+DebugWebServer。
Xdeug是PHP的一个调试扩展,我看了一下它的源码,写的挺好,是一个值得信任的插件。它提供了基本的调试功能,而这些调试功能也正好能解决我们之前的痛点。而且:
- 大牛作品,质量可信耐。且还在维护中。
- 有群众基础。有大量的用户使用这个扩展进行调试。
- 多版本支持。有标准PHP版本,还有hhvm版本,目前PHP标准版已经可以支持PHP7了。
- 开放的协议。它使用了一套开放的调试通信协议,方便用户使用其调试功能。
- Vim+xdebug。应该是一个最容易让人接受的方案。但是Vim是Linux系统上的软件,如果在Windows系统上部署的PHP引擎并在Windows上进行PHP开发,将无法使用这套方案。所以这个方案存在局限性。
- Netbeans+xdebug。诸如Netbeans这类IDE,很多开发者并不喜欢用,他们电脑也会存在这些IDE。所以这类IDE+xdebug的方案也存在局限性。
- Notepad++ + xdebug。不同的开发者喜欢不同的开发编辑工具,有很多人喜欢Notepad++,也有很多人喜欢Sublime。这些无法做到统一,所以编辑器+xdebug的方法也存在局限性。
- 作为网络服务存在,可以运行在Windows或者Linux系统上。
- 只需要在PHP所在的环境上部署一次,可以在不同环境下使用,降低学习成本。
- Python去实现相关功能。因为我们调试的是PHP,所以不想产生鸡生蛋蛋生鸡这类的问题,所以我没有选择PHP去实现功能(虽然Xdebug有Session这样的概念)。同时,我也没选择编译型语言——C/C++去实现。因为编译型需要需要在不同平台上编译出结果。而我希望提供的是一个可以直接使用的产品,所以编译型语言也不合适。而Python是一个广泛使用的工具性脚本语言,学习门槛低、且有大量组件可以直接使用,可以避免我们重复造轮子。
- Python去实现一个Http服务器,提供一个调试界面。Python实现Http服务器的代码非常简单,网上一搜一大堆。但是这个地方的难点就是调试界面的设计
- 打通debugwebserver和Xdebug。Xdebug的的调试协议是https://xdebug.org/docs-dbgp.php。实现协议是件很麻烦的事情,因为不仅要实现还要去调试各种场景。好在Python有相关实现。我找到一个我们可能可以使用的实现http://jaredforsyth.com/pydbgp/。但是这个实现没有给出使用的例子,所以这块也将是一个比较复杂的过程——我们可能要用它去模拟每个指令,然后打通它和我们的服务器。
大家对上面的想法有什么意见和建议请和我反馈,如果有特别想去攻关的技术或者特别想实现的功能,我们可以商量怎么一起去做。
谢谢。
这封邮件基本展现了这个项目立项时的背景。而在之后调研和实现的过程中,我也是按着这封邮件的思路去实施,其中若干的复杂点也是一点一点被攻克。其实这封邮件隐藏了我当时的一个疑虑——界面的实现,因为我并不擅长做网页,更不擅长做界面设计。但是最后我还是逼着自己把这块给攻克了下来,当然这些都是后话。在详细介绍这个工具诞生过程和使用方法前,我先把其目前相对稳定的版本展现给大家看。希望能吸引大家的注意,如果有兴趣,可以一起把这个项目完善。
相关文章:
机器推理文本+视觉,跨模态预训练新进展
作者 | 李根、段楠、周明来源 | 微软研究院AI头条(ID:MSRAsia)【导读】机器推理要求利用已有的知识和推断技术对未见过的输入信息作出判断,在自然语言处理领域中非常重要。本文将介绍微软亚洲研究院在跨模态预训练领域的研究进展。近年来&…

[LeetCode]:94:Binary Tree Inorder Traversal
题目: Given a binary tree, return the inorder traversal of its nodes values. For example:Given binary tree {1,#,2,3}, 1\2/3return [1,3,2]. 代码: public class Solution {public static ArrayList<Integer> listResult new ArrayList&l…
腾讯 AI 2019这一年
所有参与投票的 CSDN 用户都参加抽奖活动群内公布奖项,还有更多福利赠送近日,腾讯AI实验室总结了 2019 年其取得重大进展的两大研究方向,推动实现的行业应用以及前沿研究探索方面的成果。一、两大难题攻坚:通用人工智能与数字人用…
跨平台PHP调试器设计及使用方法——探索和设计
在《跨平台PHP调试器设计及使用方法——立项》一文中,我确定了使用xdebug作为调试器插件部分的基础组件。xdebug提供了一个远程调试的功能(相关资料可以详见https://xdebug.org/docs/remote),我们这个项目便是基于这个功能实现的。…

Ubuntu下允许Root用户直接登录图形界面
ubuntu root是默认禁用了,不允许用root登陆,所以先要设置root密码。 执行:sudo passwd root 接着输入密码和root密码,重复密码。再重新启动就可以用root登陆。 另外,默认情况下是不允许用root帐号直接登陆图形界面的。…

携程App for Apple Watch探索
在Apple Watch发布之后,很多App都针对它设计了相应的版本。旅行作为与Apple Watch时间管理特性契合度较高的场景,同时携程旅行作为国内领先的OTA行业App,也成为了首批适配Apple Watch并荣登Apple官网和App Store推荐的应用之一。InfoQ就App f…
跨平台PHP调试器设计及使用方法——通信
首先引用《跨平台PHP调试器设计及使用方法——探索和设计》中的结构图(转载请指明出于breaksoftware的csdn博客) 本文要介绍的是我们逻辑和pydbgp通信的实现(图中红框内内容)。 设计通信之前,我需要先设计一种通信协议…

MVP模式的相关知识
MVP 是从经典的模式MVC演变而来,它们的基本思想有相通的地方:Controller/Presenter负责逻辑的处理,Model提供数据,View负责显示。作为一种新的模式,MVP与MVC有着一个重大的区别:在MVP中View并不直接使用Mod…
“数学不行,还能干点啥?”面试官+CTO:干啥都费劲!
关于数学与程序员的“暧昧”关系,先看看网友的看法:同时编程圈也流传着一个段子:一流程序员靠数学,二流程序员靠算法,末端程序员靠百度,低端看高端就是黑魔法。想一想,我们日常学习、求职、工作…

CentOS7 yum 源的配置与使用
YUM:Yellowdog Updater Modified Yum(全称为 Yellow dog Updater, Modified)是一个在Fedora和RedHat以及CentOS中的Shell前端软件包管理器。基于RPM包管理,能够从指定的服务器自动下载RPM包并且安装,可以自动处理依赖…

跨平台PHP调试器设计及使用方法——协议解析
在《跨平台PHP调试器设计及使用方法——探索和设计》一文中,我介绍了将使用pydbgp作为和Xdebug的通信库,并让pydbgp以(孙)子进程的方式存在。《跨平台PHP调试器设计及使用方法——通信》解决了和pydbgp通信的问题,本文…

测试客户端发图图
转载于:https://blog.51cto.com/ericsong/116942
搜狐、美团、小米都在用的Apache Doris有什么好? | BDTC 2019
【导读】12 月 5-7 日,由中国计算机学会主办,CCF 大数据专家委员会承办,CSDN、中科天玑协办的中国大数据技术大会(BDTC 2019)在北京长城饭店隆重举行。100 顶尖技术专家、1000 大数据从业者齐聚于此,以“大…

cacti邮件告警设置
功能说明对指定流量图形(指定接口)设置最高或最低流量阀值,当流量出现异常偏高或偏低触发阀值,系统自动将异常信息以邮件形式通知指定收件人。如果收件人邮箱是139邮箱,还可以增设短信通知功能。设置前准备设置该功能之…
跨平台PHP调试器设计及使用方法——高阶封装
在《跨平台PHP调试器设计及使用方法——协议解析》一文中介绍了如何将pydbgp返回的数据转换成我们需要的数据。我们使用该问中的接口已经可以构建一个简单的调试器。但是由于pydbgp存在的一些问题,以及调试器需要的一些高级功能,我们还需要对这些接口进行…

Oracle的口令文件(passwordfile)的讲解(摘录)
初学oracle,很多概念迷糊,今天看到这文章,让我有一个比较清晰的认识。转载[url]http://www.itpub.net/viewthread.php?tid906008&extra&page1[/url]1、os认证oracle安装之后默认情况下是启用了os认证的,这里提到的os认证…
如何优雅地使用pdpipe与Pandas构建管道?
作者 | Tirthajyoti Sarkar译者 | 清儿爸编辑 | 夕颜出品 | AI科技大本营(ID: rgznai100) 【导读】Pandas 是 Python 生态系统中的一个了不起的库,用于数据分析和机器学习。它在 Excel/CSV 文件和 SQL 表所在的数据世界与 Scikit-learn 或 Te…

第 十 天 : 添 加 硬 盘 和 分 区 挂 载 等
小Q:狼若回头,必有缘由,不是报恩,就是***; 事不三思必有败,人能百忍则无忧。今天的进度虽然慢了,但是学习状态还是一如往常,只不过今天遇到了不少新的知识点,需要好好想想…
从4个月到7天,Netflix开源Python框架Metaflow有何提升性能的魔法?
作者 | Rupert Thomas译者 | 凯隐编辑 | Jane出品 | AI科技大本营(ID:rgznai100)【导语】Metaflow 是由 Netflix 开发,用在数据科学领域的 Python框架,于 2019 年 12 月正式对外开源。据介绍,Metaflow 解决…
SOA标准发展混乱 国内业务缺少经验
近年来,SOA已经成为国际及我国信息技术领域的重大热点之一。从2005年至今,SOA逐渐成为影响中国IT系统构建的主导思想。从2006年开始,SOA的建设方法已在我国部分行业信息化项目中开始得以越来越广泛的应用。 但热潮背后, SOA概念在…
跨平台PHP调试器设计及使用方法——界面设计和实现
一个优秀的交互设计往往会影响一个产品的命运。在设计这款调试器时,我一直在构思这款调试器该长什么样子。简单、好用是我设计的原则,于是在《跨平台PHP调试器设计及使用方法——立项》一文中,我给出了一个Demo。之后实现的效果也与之变化并不…

AJAX安全-Session做Token
个人思路,请大神看到了指点 个人理解token是防止扫号机或者恶意注册、恶意发表灌水,有些JS写的token算法,也会被抓出来被利用,个人感觉还是用会过期的Session做token更好,服务器存储,加载到客户端页面&…
跨平台PHP调试器设计及使用方法——使用
经过之前六篇博文的分析和介绍,大家应该对这套调试器有个初步的认识。本文我将讲解它的使用方法。(转载请指明出于breaksoftware的csdn博客) 上图是该软件界面的布局,我们之后的讲解也将围绕着这些功能展开。 文件夹管理 在查看一…
管理7k+工作流,月运行超10000万次,Lyft开源的Flyte平台意味着什么?
作者 | Allyson Gale译者 | 刘畅编辑 | Jane出品 | AI科技大本营(ID:rgznai100)【导读】Flyte 平台可以更容易的创建并发,可伸缩和可维护的工作流,从而进行机器学习和数据处理。Flyte 已有三年多的训练模型和数据处理经…

Jmeter组件执行顺序与作用域
一、Jmeter重要组件: 1)配置元件---Config Element: 用于初始化默认值和变量,以便后续采样器使用。配置元件大其作用域的初始阶段处理,配置元件仅对其所在的测试树分支有效,如,在同一个作用域…
跨平台PHP调试器设计及使用方法——拾遗
之前七篇博文讲解了跨平台PHP调试器从立项到实现的整个过程,并讲解了其使用方法。但是它们并不能全部涵盖所有重要内容,所以新开一片博文,用来讲述其中一些杂项。(转载请指明出于breaksoftware的csdn博客) 触发调试的…
召唤超参调优开源新神器:集XGBoost、TensorFlow、PyTorch、MXNet等十大模块于一身...
整理 | 凯隐编辑 | Jane出品 | AI科技大本营(ID:rgznai100)【导读】Optuna是一款为机器学习任务设计的自动超参数优化软件框架,是一款按运行定义(define-by-run) 原则设计的优化软件,允许用户动态地调整搜索空间&#…

Linux下的Silverlight:Moonlight 1.0 Beta 1发布了
Moonlight是微软Silverlight的一个开源实现,其目标平台是Linux与Unix/X11系统。自从2007年9月开始,Moonlight就在Mono项目下进行了开发,它是由Novell发起并资助的。现在,Moonlight 1.0 Beta 1已经向公众发布了。 Novell和Mono宣布…
在visual studio 2010中调用ffmpeg
转自:http://blog.sina.com.cn/s/blog_4178f4bf01018wqh.html 最近几天一直在折腾ffmpeg,在网上也查了许多资料,费了不少劲,现在在这里和大家分享一下。 一、准备工作本来是想自己在windows下编译ffmpeg生成lib、dll等库文件的&am…
无线路由器与无线AP的区别
摆脱线缆的羁绊,手捧一杯香醇的咖啡在家中的任何角落都可以无拘无束和网友谈天说地──这就是无线的魅力!在无线网络迅猛发展的今天,无线局域网(Wireless Local-Area Network,简称WLAN)已经成为许多SOHO家庭…