返回顶部
首页 > 资讯 > 后端开发 > PHP编程 >Deliverer1.0.8是否已经支持 PHP5
  • 328
分享到

Deliverer1.0.8是否已经支持 PHP5

2023-06-20 14:06:42 328人浏览 泡泡鱼
摘要

小编给大家分享一下Deliverer1.0.8是否已经支持 PHP5,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Deliverer 1.0.8 支持 PHP5

小编给大家分享一下Deliverer1.0.8是否已经支持 PHP5,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

经历了两周的迭代,Deliverer 目前更新到了 1.0.8 https://GitHub.com/zhoumengka...

因为是为了解决祖传代码的问题,也听到群友的一些声音,还是很有必要支持下 php5 的,所以这段时间一直在着力解决这个版本兼容问题,没想到问题比较我预计的要难很多。

记录下开发中遇到的问题(主要是体力活)也想分享之后,有兴趣的朋友可以fork一份之后,对代码不那么陌生,更期待各位个 PR

在 PHP7 中,函数或者方法在执行的时候都在zend_execute_data结构体中的execute_data->call->fbc中,而 PHP5 中对应的字段拿到的却是调用该函数的函数,二者差距比较大。

后来发现 PHP5 zend_execute_dataopline中查到了当前执行的函数信息,但在 PHP5.4 前后逻辑还有差异,需要区别对待(还好编译器提示报错的字段)

#if PHP_VERSioN_ID < 50400#define OP1_FUNCTION_PTR(n) (&(n)->op1.u.constant)#else#define OP1_FUNCTION_PTR(n) ((n)->op1.zv)#endif

初次调用解决了,发现内嵌的调用,又不在opline里面了,而且版本不一样,取得地方也不一样,并且和上面的 opline 的判断版本号还不一样,这就只能靠体力来测了。

#if PHP_VERSION_ID < 50500    if (execute_data->fbc != NULL)    {        fbc = execute_data->fbc;    }#else    if (execute_data->call != NULL && execute_data->call->fbc != NULL)    {        fbc = execute_data->call->fbc;    }#endif

最终获取函数信息就是多层判断

    zend_function *fbc;#if PHP_VERSION_ID < 70000#if PHP_VERSION_ID < 50500    if (execute_data->fbc != NULL)    {        fbc = execute_data->fbc;    }#else    if (execute_data->call != NULL && execute_data->call->fbc != NULL)    {        fbc = execute_data->call->fbc;    }#endif    if (fbc == NULL)    {        fbc = get_function_from_opline(execute_data->opline);    }#else    if (execute_data->call != NULL && execute_data->call->func != NULL)    {        fbc = execute_data->call->fbc;    }#endif

在从 opline 里查询到的只是函数的名字,需要再去全局函数表里找到对应的函数指针

static zend_function *get_function_from_opline(zend_op *opline){    zend_function *fbc;    zval *function_name = OP1_FUNCTION_PTR(opline);    if (Z_STRVAL_P(function_name) == NULL)    {        return NULL;    }    if (zend_hash_find(EG(function_table), Z_STRVAL_P(function_name), Z_STRLEN_P(function_name) + 1, (void **)&fbc) ==        FaiLURE)    {        return NULL;    }    return fbc;}

整体来说 PHP5 的处理要比 PHP7 复杂很多,这也说明 PHP7 做的更好了,点赞。

这些就是这几天的开发工作,可能还有很多实际的线上环境没有遇到过,如果你有兴趣,可以使用这个工具来解决问题,也可以一起来完善这个小工具。

下周或者下下周我将加上 watch 功能,支持函数和方法的参数打印。主要是类比 Java 的 Arthas ,因为在其中 trace 和 watch 功能是我最常用的,虽然 PHP 可以线上直接修改加日志,但是这样毕竟不规范,走发布流程又太慢,我想这个 watch 功能还是很有必要的,大概是

$ ./bin/deliverer -w foo -n 3

表示监控foo函数3次调用后退出,并且打印出deliverer-request-id和其入参,可以再根据deliverer-request-id查看完整的调用栈。

以上是“Deliverer1.0.8是否已经支持 PHP5”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网PHP编程频道!

--结束END--

本文标题: Deliverer1.0.8是否已经支持 PHP5

本文链接: https://lsjlt.com/news/297165.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Deliverer1.0.8是否已经支持 PHP5
    小编给大家分享一下Deliverer1.0.8是否已经支持 PHP5,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Deliverer 1.0.8 支持 PHP5 ...
    99+
    2023-06-20
  • 精品阐述:Dubbo是否已经支持Go语言
    尊敬的读者朋友们,今天我们将为您精心奉上一篇关于Dubbo在Go语言方面的探讨文章。Dubbo作为一款优秀的分布式服务框架,在Java语言中得到了广泛的应用和支持。而随着Go语言在近年...
    99+
    2024-04-02
  • PHP是否支持MySQL
    PHP支持MySQL;MySQL是与PHP搭配使用最多的数据库,它们常被称为“黄金组合”。PHP中提供了完整的操作MySQL数据库的函数,这些函数包括了从连接数据库、执行SQL语句、处理数据结果集到关闭数据库的方方面面;通过这些函数,使基于...
    99+
    2022-06-14
    php mysql
  • vs2010是否支持html5
    本教程操作环境:Windows10系统、VS2010版、DELL G3电脑vs2010是否支持html5?让VS2010支持HTML5的解决方案今天用VS2010写前段代码,用到HTML5的标签属性,但是VS2010提示不支持该属性,于是就...
    99+
    2023-05-14
    vs2010 html5
  • thinkphp5是否支持事件
    这篇文章主要介绍了thinkphp5是否支持事件的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇thinkphp5是否支持事件文章都会有所收获,下面我们一起来看看吧。首先,我们需要了解什么是事件。事件(Event...
    99+
    2023-07-05
  • mysql是否支持分布式
    下文主要给大家带来mysql是否支持分布式,希望这些内容能够带给大家实际用处,这也是我编辑mysql是否支持分布式这篇文章的主要目的。好了,废话不多说,大家直接看下文吧。    &nbs...
    99+
    2024-04-02
  • vuejs是否能够支持ie678
    这篇文章将为大家详细讲解有关vuejs是否能够支持ie678,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。 vuejs不支持ie678,因为V...
    99+
    2024-04-02
  • LeetCode是否支持ASP语言?
    LeetCode是一个面向程序员的在线编程平台,它提供了大量的编程题目,以帮助开发者提高编程技能。但是,很多人不知道LeetCode是否支持ASP语言。在本文中,我们将深入探讨这个问题,并提供一些演示代码。 首先,我们需要了解什么是ASP语...
    99+
    2023-08-16
    windows linux leetcode
  • Kylin是否支持SQL接口
    是的,Kylin支持SQL接口。Kylin提供了一个RESTful API,可以通过SQL查询来访问和操作Kylin中的数据。用户可...
    99+
    2024-03-08
    Kylin
  • Impala是否支持SQL查询
    Impala是一个开源的分布式SQL查询引擎,它是基于Hadoop的生态系统。Impala通过支持SQL查询来进行数据分析,用户可以...
    99+
    2024-04-02
  • Kylin是否支持SQL查询
    Kylin是一个开源的分布式分析引擎,专为OLAP(联机分析处理)设计,支持SQL查询。Kylin提供了SQL接口来进行复杂的多维分...
    99+
    2024-04-02
  • LinuxMint是否支持多用户
    是的,Linux Mint支持多用户。用户可以创建多个用户账户,并为他们分配不同的权限和访问级别。管理员可以控制每个用户的权限,以确...
    99+
    2024-04-02
  • MariaDB是否支持触发器
    是的,MariaDB支持触发器。触发器是一种在特定的数据库操作(如插入、更新或删除)发生时自动执行的SQL语句集合。触发器可以用于实...
    99+
    2024-04-02
  • javascript是否支持面向对象
    本篇内容介绍了“javascript是否支持面向对象”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! ...
    99+
    2024-04-02
  • git是否支持本地仓库
    Git是一个开源的分布式版本控制系统,用于管理项目的代码和版本。它可以支持本地仓库,这意味着您可以在本地计算机上设置Git仓库来管理您的项目代码。本地仓库通常用于在您自己的计算机上开发软件。在这种情况下,您可以使用Git来跟踪您对代码的更改...
    99+
    2023-10-22
  • linux是否支持动态路由
    这篇文章主要介绍“linux是否支持动态路由”,在日常操作中,相信很多人在linux是否支持动态路由问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”linux是否支持动态路由”...
    99+
    2023-04-14
    linux
  • Grafana是否支持模板功能
    是的,Grafana支持模板功能。模板是Grafana中一种非常有用的功能,允许用户在仪表板中动态地更改和应用变量。用户可以使用模板...
    99+
    2024-04-02
  • LinuxMint是否支持文件加密
    是的,Linux Mint支持文件加密。用户可以使用GNU Privacy Guard(GPG)等工具来加密文件和文件夹,以保护其内...
    99+
    2024-04-02
  • SQLite是否支持存储过程
    SQLite不支持存储过程。SQLite是一种轻量级的嵌入式数据库管理系统,它主要用于移动设备和小型应用程序中。由于其设计的简洁性和...
    99+
    2024-04-02
  • Impala是否支持压缩数据
    是的,Impala支持对数据进行压缩。Impala可以使用Snappy、Gzip、Bzip2等压缩格式来减少存储空间和提高查询性能。...
    99+
    2024-03-07
    Impala
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作