首页 > 编程语言 >PHP7内核实现原理-基本环境和C基础

PHP7内核实现原理-基本环境和C基础

时间:2023-09-08 21:44:31浏览次数:46  
标签:php -- char gdb 内核 output 原理 PHP7 ini

编译安装 PHP 7.1.0

下载 7.1.0 源码压缩包:www.php.net/releases/

./configure --prefix=/Users/lisong/Documents/workspace/php-src/output --enable-fpm 编译,报错:configure: error: Please specify the install prefix of iconv with --with-iconv=

iconv 是个国际化扩展,暂时用不到,先禁用之:

重新编译 ./configure --prefix=/Users/lisong/Documents/workspace/php-src/output --enable-fpm --without-iconv

安装 gdb 调试

安装步骤,后期需要配置 gdb 证书。https://blog.csdn.net/qq_33154343/article/details/104784641

在 output 目录中开始调试 sudo gdb bin/php ,第一次会卡在 [New Thread 处,跟随教程中处理,先 cntrl z 退出,kill 掉之后,在重新开始调试。

使用 echo 断点调试技巧

echo 底层实现利用了 ZEND_ECHO_SPEC_CV_HANDLER 函数,可以在 PHP 代码中使用 echo 打印变量,之后在 gdb 中设置 b ZEND_ECHO_SPEC_CV_HANDLER 断点,当执行到 echo 时,就会被断住,之后可以尝试解析变量。

查看字符串完整内容 : p *z.value.str.val@12 @后接字符串长度

安装 vld 扩展,查看 opcode

git clone https://github.com/derickr/vld.git
cd vld
../output/bin/phpize
./configure --with-php-config=xxxx/output/bin/php-config --enable-vld
make && make install

编译完修改 ini ,使之生效。

但源码编译的 PHP 默认没有 php.ini

源码中提供了两个配置 php.ini-production 和 php.ini-development,选择一个将其复制到 ini 加载路径即可。

看下 ini 加载路径 output/bin/php -i | grep ini ,之后 cp 过去 改名为 php.ini 即可

C 语言基础回顾

基础数据类型空间大小

x86-64 架构下

  • char 1字节
  • int 4字节
  • long 8字节
  • 指针类型 8字节

可使用 gdb 查看:

p sizeof(char)
p sizeof(int)
p sizeof(long)
p sizeof(char*)
p sizeof(void*)

结构体 struct

struct test {
	char a; // 1字节
	int b; // 4
	long c; //8
	void* d; //8
	int e; //4
	char* f; //8
}

因为结构体有结构对齐的概念,所以整个结构体的大小并不等于其内部各个字段大小之和:

联合体 union

union test {
	char a; //1
	int b; //4
	long c; //8
}

跟结构体类似,不同的是其内部字段是复用内存的:

堆栈空间

程序执行时内存有如下几种结构和区域

  • 栈 stack:存储参数值、局部变量,维护函数调用关系
  • 堆 heap:动态内存区域,随时申请和释放,程序要自己负责这里的回收
  • 全局区(静态区):存储全局和静态变量
  • 字面量区:存储常量字符串
  • 程序代码区:存储二进制代码,待执行

总体来说,栈上的变量是局部的,随着局部空间销毁也随之销毁,有系统负责。

堆上的变量可以给全局访问,需要用户代码自行处理生命周期,主动用完回收掉。

本文由mdnice多平台发布

标签:php,--,char,gdb,内核,output,原理,PHP7,ini
From: https://www.cnblogs.com/caipi/p/17688598.html

相关文章

  • PHP7内核实现原理-基本架构
    发展史PHP最早是由Lerdorf于1995年,使用Perl语言,以PersonalHomePageTools(PHPTools)的形式创建的,目的是为了方便记录个人网站的访客记录和支持留言本等功能,此时称为PHP1。后来越来越多的网站开始使用PHP并希望能提供更多的功能,之后Lerdorf将PHP开源,此时称为......
  • 内核升级
    一、内核升级在企业用过的内核升级#centos7.6内核升级4.19前提条件已配置好基础yum源,参考yum源配置1、获取内核的rpm包http://193.49.22.109/elrepo/kernel/el7/x86_64/RPMS/从上述页面上下载4.19.12的rpm包kernel-ml-4.19.12-1.el7.elrepo.x86_64.rpm然后拷贝到主机上......
  • 带您了解智能视频监控系统EasyCVR的工作原理和广泛应用场景。
    EasyCVR国标视频综合管理平台是一款以视频为核心的智慧物联应用平台。它基于分布式、负载均衡等流媒体技术进行开发,提供广泛兼容、安全可靠、开放共享的视频综合服务。该平台具备多种功能,包括视频直播、录像、回放、检索、云存储、告警上报、语音对讲、集群、智能AI分析以及平台级......
  • Python 网页爬虫原理及代理 IP 使用
    一、Python网页爬虫原理Python是一种高效的编程语言,在Web开发和数据分析领域广受欢迎。Python的优秀模块使其更加适合大规模数据处理和Web服务的编程。网络爬虫是Python开发者最常用的工具之一。网络爬虫(WebCrawler)是一种自动化程序,可以模拟人类浏览器的行为,自动在互联网......
  • RDMA-内核接口-rxe_map_mr_sg
    描述:映射mr的sg调用链:此处多处调用staticintnvme_rdma_map_sg_fr(structnvme_rdma_queue*queue,    structnvme_rdma_request*req,structnvme_command*c,    intcount){   req->mr=ib_mr_pool_get(queue->qp,&queue->qp->rdma_mrs);  /*  ......
  • K8S之ipvs负载均衡原理
    1、iptables、ipvs(IPVirtualServer)实现了传输层负载均衡,也就是我们常说的4层LAN交换,作为Linux内核的一部分。ipvs运行在主机上,在真实服务器集群前充当负载均衡器。ipvs可以将基于TCP和UDP的服务请求转发到真实服务器上,并使真实服务器的服务在单个IP地址上显示为虚拟服务......
  • Android View绘制原理-GrSurface
    上一篇文章分析了SkSurface的两种生成方式,他们都需要使用GrSurfaceDrawContext来创建一个SkGpuDevice。生成GrSurfaceDrawContext时其中一种方式生成的是GrSurfaceProxy,另外一种生成的是GrTextureProxy,从它们的名字可以看出,他们是一个代理,他们代理的就是一个GrSurface对象。而这个G......
  • 数字钥匙关键技术:UWB(超宽带)实现原理一文讲透
    在之前的文章《一文讲透超宽带(UWB)前世今生》中,我们从起源、定义、标准、发展、应用等角度概述了UWB技术。根据UWB的特性,其基础功能分为:数据传输、雷达成像、测距定位。接下来我们将概述其数据传输和雷达成像功能,并对UWB当前的主要运用:测距定位功能进行深入解析。图1UWB主题图片►......
  • 机器学习算法原理实现——使用梯度下降求解Lasso回归和岭回归
    本文本质上是在线性回归的基础上进行扩展,加入了正则化而已!机器学习算法原理实现——使用梯度下降求解线性回归 正则化在机器学习中是一种防止过拟合的技术,它通过在损失函数中添加一个惩罚项来限制模型的复杂度。举一个实际的例子,假设你正在训练一个机器学习模型来预测房价。你......
  • tornado 的协程调度原理
    本文讨论tornado的协程实现原理,简单做了一份笔记。首先看一段最常见的tornadoweb代码:importtornadoimporttornado.webimporttornado.genfromtornado.genimportcoroutinefromtornado.httpclientimportAsyncHTTPClientclassGenHandler(tornado.web.RequestHa......