Deliverer 1.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_data的opline中查到了当前执行的函数信息,但在 PHP5.4 前后逻辑还有差异,需要区别对待(还好编译器提示报错的字段)

#if PHP_VERSION_ID op1.u.constant)#else#define OP1_FUNCTION_PTR(n) ((n)->op1.zv)#endif

登录后复制

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

立即学习“PHP免费学习笔记(深入)”;

#if PHP_VERSION_ID 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 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查看完整的调用栈。

如果觉得有这兴趣,就请给个星星吧,https://github.com/zhoumengkang/deliverer

安装和使用上有任何问题,欢迎加我微信 zhoumengkang 前来骚扰,暗号:deliverer

推荐学习:《PHP视频教程》

以上就是Deliverer 1.0.8已经支持 PHP5啦!的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2115292.html

(0)

关于作者

上一篇 2025年2月24日 17:03:25
下一篇 2025年2月24日 01:11:25

AD推荐 黄金广告位招租... 更多推荐

相关推荐

发表回复

登录后才能评论