写点什么

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

作者:菜皮日记
  • 2023-09-09
    北京
  • 本文字数:1127 字

    阅读完需:约 4 分钟

编译安装 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.gitcd vld../output/bin/phpize./configure --with-php-config=xxxx/output/bin/php-config --enable-vldmake && 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:动态内存区域,随时申请和释放,程序要自己负责这里的回收

  • 全局区(静态区):存储全局和静态变量

  • 字面量区:存储常量字符串

  • 程序代码区:存储二进制代码,待执行


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

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

用户头像

菜皮日记

关注

全干程序员 2018-08-08 加入

还未添加个人简介

评论

发布
暂无评论
PHP7内核实现原理-基本环境和C基础_php_菜皮日记_InfoQ写作社区