关于后端:PHP7内核实现原理基本环境和C基础

5次阅读

共计 1508 个字符,预计需要花费 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.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 多平台公布

正文完
 0