question_about_Thinking_in_PHP_internals(SAPI)

深入理解PHP内核

关于PHP的源码目录结构,根目录下都放了哪些文件?这些文件有什么用?

有哪些比较重要的文件值得看看?

想写PHP扩展应该看看那个文件?

源码编译的文件存放在哪里?这些文件是如何编译的?构建是什么?怎样构建脚本文件?

检查环境的脚本是什么?

编译的脚本后缀是什么?

官方扩展目录是哪个?里面包含的内容是什么?

扩展中的东西是怎样和PHP联合起来使用的?怎样进行调用??为什么能调用?如何书写自己的扩展?

扩展文件中的tests文件是干嘛的?里面是测试和调试的么?

最核心的代码是放在哪里的?主要实现了什么?

zend引擎目录里面都有些什么?这些机制的实现和测试都在这里么?

PHP扩展与应用仓库是哪个文件?

各种服务器抽象层的代码都安家在哪?这里面都有哪些抽象??或者说哪些接口?

PHP的线程安全是构建在哪个库上面的?这玩意是干嘛的?能封装嘛?封装它干嘛?

PHP的测试脚本都在哪待着?怎样写测试文件?怎么进行自动化测试?测试有啥好处?有必要么?

虽然我是macos系统,但是这要是在windows下,有哪个目录里面有对它的相关实现?

fatal error是什么?为什么测试脚本会“不小心”触发它?

PHP中有哪些将脚本隔离的方法?

研究下$PHP_SRC/run-tests.php脚本的实现也是不错的选择,哪里不错?如何研究?

PHP源码中的宏在哪?有哪些常见的》怎么理解这些宏?

###有啥子区别?

宏在实际中有哪些应用?比如对字符串进行封装,是怎么封装的??

宏定义中的do-while循环?do-while和宏定义有啥关系?多行宏又是什么?宏不是只是用#来标明的么?

宏定义了是不是就直接在代码执行时按照宏定义的方式来?所以宏定义就是对相关的底层操作和参数进行定义?宏只是简单的代码替换?

预处理(#line)又是啥?主要是干嘛的?

全局变量宏又是啥?这系列宏的主要作用是什么?啥叫解决线程安全所写的全局变量包裹宏?

什么是线性安全??ifdef是什么?ZTS又是啥?

PHP运行时的全局参数,这些参数都有啥意义?他们都在哪个里面?

zend_bool代表什么?

据说那些全局变量和php.ini文件的配置项是对应的,在PHP启动并读取php.ini文件时就会对这些字段进行赋值,而用户空间的ini_get(),ini_set()函数操作的一些配置也是对这个全局变量进行操作的,这两者是如何联系起来的?

用户代码的执行

脚本的编译,解析,执行,web服务器的配合,内存管理,语法实现这些过程都是什么,运行过程中发生了什么变化?

PHP的整体结构是什么?

PHP的生命周期是什么?

PHP与其他容器(Apache)的交互式怎样进行的?

什么是词法分析?

什么是语法分析?

上述分析是存在哪里?源码是什么?怎么执行的?有什么用?

zend engine在PHP中的作用?

SAPI接口是什么?

什么是Opcodes?

生命周期和zend引擎

SAPI server application programming interface

Apache,Nginx这类web服务器是怎样和PHP脚本工作的?怎么测试PHP脚本?他们工作是为了什么?

PHP解释器又是什么?

web服务器应答?是应答什么?为什么回应答,并且将应答内容显示给浏览器,这期间是怎样运行的?

标准输入输出又是什么?

PHP解释器在哪?

web服务器和命令行程序执行的脚本为何不一样?哪里不一样?

SAPI接口有哪些?常见的有哪些?怎么工作的?和Apache是如何联系?二者有什么关系?

模块初始化阶段(MINIT)主要做了什么?Apache启动以后,都做了什么?命令行程序执行流程是什么?

什么是模块激活阶段?(RINIT)

什么是PHP注册扩展模块?注册是什么意思?

注册常量,定义模块使用的类,这些是每次执行PHP脚本都会发生的么?是怎样发生的?都如何实现的?

什么是回调函数,如果实现这些回调函数?

怎样创建一个执行环境?

PHP每次运行中那些定义的变量和函数都存放在哪里?RINIT函数是什么?

什么是单进程?

CLI CGI又是什么?

为什么在调用每个模块前,都有一个初始化的过程?

脚本中定义的变量在初始化时被放在哪里?

什么是内置模块?

禁用函数是什么?不可调用么?那为什么还存在?

什么是垃圾收集机制?如何重置?

什么是多进程模式?

PHP是怎样编译为Apache的一个模块来处理PHP请求的?

Apache启动后怎样fork出多个子进程?

Hiphop是啥?

PHP的很多扩展是怎样和zend引擎耦合在一起?

如何将PHP扩展和zendapi解耦?

SAPI源码解读

SAPI概述

PHP源码的SAPI目录存放了哪些抽象层的代码?

fastcgi和cgi有什么区别?为什么多了个fast?

各个服务器抽象层直线遵守怎样的约定?

_sapi_module_struct结构体变量是什么?怎么实现?

函数指针的说明:

  • startup 当SAPI初始化时,首先会调用该函数,如果服务器处理多个请求时,该函数只会调用一次,比如Apache的SAPI,它是以mod_php5的Apache模块的形式加载到Apache中的,在这个SAPI中,startup函数只会在父进程中创建一次,在其fork的子进程中不会调用。
  • activate 此函数会在每个请求开始时调用,会再次初始化每个请求前的数据结构
  • deactivate 此函数会在每个请求结束时调用,用来确保所有的数据,以及释放activate中初始化的数据结构。
  • shutdown 关闭函数,用来释放所有的SAPI的数据结构,内存等。
  • ub_write 不缓存的写操作(unbuffered write),用来将PHP的数据输出给客户端,如在CLI模式下,其最终是调用fwrite实现向标准输出输出内容,在Apache模块中,它最终是调用Apache提供的方法rwrite。
  • sapi_error 报告错误用,大多数的SAPI都是使用的PHP默认实现php_error
  • flush 刷新输出,在CLI模式下通过使用c语言的库函数(??)fflush实现,在php_mode5模式下,使用Apache提供的函数rflush实现。
  • read_cookie 在SAPI激活时,程序会调用此函数,并且将此函数获取的值赋值给SG(request_info).cookie_data.在CLI模式下,此函数会返回null。
  • read_post 此函数和read_cookie一样也是在SAPI激活(????怎样激活???)时调用,它与请求的方法有关,当请求的方法是post时,程序会操作$_POST,$HTTP_RAW_POST_DATA等变量。
  • send_header 发送头部信息,此方法一般的SAPI都会定制,其所不同的是,有些的会调用服务器自带的(such Apache),有些是需要自己实现的(such fastcgi)

现在的sapi目录已经去除了很多。