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

MacOS编译安装PHP7及解决各种编译错误 mac编译安装php7--with-iconv=,readdir_r(dirp, entry);Undefined symbols for architecture x86_64: "_libiconv", referenced from:PEAR package PHP_Archive not installed 阅读详情

编译安装 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
}

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

alt

联合体 union

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

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

alt

堆栈空间

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

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

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

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

本文由 mdnice 多平台发布

PHP7语言执行原理 常用的高级语言有很多种,根据运行的方式不同,大体分为两种:编译型语言解释型语言。 编译是指在应用源程序执行之前,就将程序源代码“翻译”成汇编语言,然后进一步根据软硬件环境编译成目标文件。一般称完成编译工作的工具为编译器。 而解释型语言,在程序运行时才被“翻译”为机器语言。但是执行一次“翻译”一次,所以执行效率较低。解释器的工作就是解释型语言中,负责“翻译”源代码的程序。 对于一段C语言代码... 阅读详情

相关推荐

PHP7.0.0(安装包源码SRC下载)

PHP7.0.0(安装包源码SRC下载),PHP7.0安装包 PHP安装下载 PHP安装包源码 PHPSRC下载

php-src-master

linux 安装php文档,直接下载,然后解压缩即可。linux系统

php-srcPHP解释器

PHP解释器 PHP是一种流行的通用脚本语言,特别适合于Web开发。 PHP快速,灵活,务实,为您的博客到世界上最受欢迎的网站提供强大的支持。 PHP是根据。 文献资料 PHP手册可从。 安装 预建包二进制文件 预构建的软件包二进制文件可用于通过PHP快速启动运行。 对于Windows,可以从获得PHP二进制文件。 解压缩存档文件后,即可使用*.exe文件。 对于其他系统,请参阅。 构建PHP源代码 对于Windows,请参阅 。 对于从Git进行的最低PHP构建,您将需要autoconf,bisonre2c。 对于默认构建,您还需要libxml2libsqlite3。 在Ubuntu上,您可以使用以下命令进行安装: sudo apt install -y pkg-config build-essential autoconf bison re2c \

PHP Configure Error: Please specify the install prefix of iconv with --with-iconv=<DIR>

使用brew install libiconv之后依然报错。1.brew 镜像,阿里的镜像可能只有比较旧的包?继续编译php8的包终于成功了...哭了。编译php源码的时候碰到了这个问题,2.php版本需要iconv对应的包。编译错误重新安装呗?网上的解决方案大多都不靠谱。尝试了几个小时依然不行。我改成php7源码包。

linsonggao的博客 689

Mac下编译安装PHP7时报错:configure: error: Please specify the install prefix of iconv with --with-iconv=<DIR>

所谓钩子就是与一些版本库事件触发的程序,例如新修订版本的创建,或是未版本化属性的修改。每个钩子都会被告知足够多的信息,包括那是什么事件,所操作的对象,触发事件的用户名。通过钩子的输出或返回状态,钩子程序能让工作继续、停止或是以某种方式挂起。 ...

涛々的技术博客 1642

PHP Configure Error: Please specify the install prefix of iconv with --with-iconv=<DIR>

PHP Configure Error: Please specify the install prefix of iconv with --with-iconv= 出现报错信息 解决方法 MAC os下本地安装 MAMP扩展 With Homebrew: brew install homebrew/dupes/libiconv then ./c

qq_36441898的博客 2827

php 内核调试,《PHP内核剖析》笔记--mac上安装php debug 版本

书中使用的是7.0版本,由于php.net上下载太慢,于是使用本地现有的7.2版本的代码../configure --prefix=/Users/luzhifang/php/php-7.3.4/output/ --enable-fpm过程中出现错误configure: error: Please specify the install prefix of iconv with --with-ico...

weixin_36084130的博客 406

PHP - 底层/内核 - 学习/实践

本文系统介绍了PHP底层实现原理的学习路径。主要内容包括:1)学习环境搭建(Windows/Mac/Linux);2)核心知识体系(Zend引擎、内存管理、变量实现等);3)扩展开发与性能优化技术;4)调试方法实践项目建议。文档提供了详细的学习大纲、推荐资源实践路线图,特别强调对PHP7/8内核改动的深入研究。同时展示了PCNTL扩展的进程管理实例,通过代码演示了多进程创建与等待的实现。学习过程需结合C语言基础编译原理计算机体系结构知识,建议从简单扩展开发入手,逐步深入内核机制研究。

"代码"的日常搬运 4462

php底层运行环境,PHP底层内核源码与扩展开发

PHP底层内核源码与扩展开发下载!PHP底层内核源码与扩展开发教程视频是php内核介绍与扩展开发教程!帮你深入理解php内核php扩展开发与内核!需要学习PHP程序的用户可以通过此教程,让你快速学习php,有需要的用户可以下载使用。PHP底层内核源码与扩展开发大纲全球第一份深入学习PHP底层内核源码与扩展开发的视频课程,CSDN首发,系统讲解了PHP底层源代码学习,实现原理,PHP扩展知识学习,...

weixin_32103331的博客 202

php c扩展开发初试

开发环境 linux系统 php源码 生成c扩展并安装 php ./ext_skel.php --ext gradytest cd gradytest /usr/local/php7/bin/phpize ./configure --with-php-config=/usr/local/php7/bin/php-config make make install 修改php.ini 加入...

左手代码右手诗 287

视频教程-PHP底层内核源码与扩展开发-PHP

PHP底层内核源码与扩展开发 十年开发经验,五年PHP开发经验,曾任职于上海...

weixin_30203457的博客 328

php-src:php源码阅读

PHP解释器 这是位于的官方PHP存储库的github镜像。 拉取请求 PHP通过github接受拉取请求。 讨论在github上进行,但根据主题,也可以转发给正式PHP开发人员mailinglist 。 新功能需要RFC,并且必须为开发人员所接受。 有关该过程的更多信息,请参见 。 Bug修复不需要RFC,但需要一个错误追踪系统车票。 始终在打开票证,并使用#NNNNNN引用错误ID。 Fix #55371: get_magic_quotes_gpc() throws deprecation warning After removing magic quotes, the get_magic_quotes_gpc function caused a deprecate warning. get_magic_quotes_gpc can be used to detected t

PHP内核中的核心函数一共有哪些部分?使用场景是什么?底层原理是什么?

【代码】PHP内核中的核心函数一共有哪些部分?使用场景是什么?底层原理是什么?

长风破浪会有时的博客 967

探索 PHP7 扩展开发:深入理解与实践

探索 PHP7 扩展开发:深入理解与实践 在编程世界中,PHP 是一种广泛使用的服务器端脚本语言,尤其在 web 开发领域更是有着深厚的基础。随着 PHP7 的发布,其性能效率得到了显著提升。如果你是一名 PHP 爱好者或开发者,将引导你深入 PHP7 扩展的开发,让你更好地利用 PHP7 的底层机制。 项目简介 该项目由 Owen Liang 创建,旨在为 PHP7 编写扩展提供一个实践平台。...

gitblog_00041的博客 416

php源码详解,PHP7 源码整体框架详解

推荐(免费):PHP7一、PHP7语言执行原理常用的高级语言有很多种,根据运行的方式不同,大体分为两种:编译型语言解释型语言。编译是指在应用源程序执行之前,就将程序源代码“翻译”成汇编语言,然后进一步根据软硬件环境编译成目标文件。一般称完成编译工作的工具为编译器。而解释型语言,在程序运行时才被“翻译”为机器语言。但是执行一次“翻译”一次,所以执行效率较低。解释器的工作就是解释型语言中,负责“翻译...

weixin_27531501的博客 835

php基础——职业规划windows环境搭建

第一部分 进行职业规划知识的拓展(里面的一些知识还要查) 一 学习说明 二 职业发展与规划 1.项目经理 pmp 三 技术分享 1.了解的概念 同步阻塞 同步非阻塞 异步阻塞 异步非阻塞 计算机密集型 IO密集型 进程->线程->协程 进程:两个进程通讯比较麻烦 线程:刚开始出现了数据混乱的问题,所以发明了锁的概念,但是主要是计算机控制问题 协程: 2. 协议...

小世界的博客 379

PHP内核的前世今生,知识体系一共包含哪些部分?

PHP内核的发展,本质是“翻译效率”“功能丰富度”的平衡:从早期的简单解析,到Zend引擎的标准化流程,再到PHP 7/8的性能飞跃,每一步都让“PHP代码→机器指令”的翻译过程更快、更灵活。作为开发者,你不需要深入内核的C语言实现,但理解“词法分析→语法分析→OPCode→执行”的流程,能帮你写出更符合内核优化逻辑的代码,也能在遇到“Parse error”“内存溢出”等问题时,快速定位到底是哪一步出了问题——这正是理解底层原理的价值。

长风破浪会有时的博客 871
上一篇: Java 中反射、注解、动态代理、AOP 之间的联系
下一篇: PHP7内核实现原理-基本架构
菜皮日记
博客等级 码龄5年 103粉丝 73原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值