
深入理解php内核
enlyhua
这个作者很懒,什么都没留下…
展开
-
1.PHP简介
1.版本区别PHP版本VC6与VC9、Thread Safe与None-Thread Safe等的区别PHP的大版本主要分三支:PHP4/PHP5/PHP6其中,PHP4由于太古老、对QQ支持不力已基本被淘汰,请无视PHP4。PHP6由于基本没有生产线上的应用,还基本只是一款概念产品,很多功能已在PHP5.3.3上实现,所以也不详述,请无视PHP6。PHP5的版本主要分四支:PHP5.2之前的版本转载 2016-07-23 15:59:19 · 453 阅读 · 0 评论 -
23.PHP的哈希表实现
typedef struct _hashtable { uint nTableSize; // hash Bucket的大小,最小为8,以2x增长。 uint nTableMask; // nTableSize-1 , 索引取值的优化 uint nNumOfElements; // hash Bucket中当前存在的元素个数,count()转载 2017-01-18 23:51:34 · 512 阅读 · 0 评论 -
24.链表简介
typedef struct _zend_llist_element { struct _zend_llist_element *next; struct _zend_llist_element *prev; char data[1]; /* Needs to always be last in the struct */} zend_llist_element;typed转载 2017-01-19 23:48:57 · 247 阅读 · 0 评论 -
25.常量
typedef struct _zend_constant { zval value; /* zval结构,PHP内部变量的存储结构,在第一小节有说明 */ int flags; /* 常量的标记如 CONST_PERSISTENT | CONST_CS */ char *name; /* 常量名称 */ uint name_len; int modul转载 2017-01-20 00:03:49 · 234 阅读 · 0 评论 -
26.预定义变量
... // 省略zend_hash_init(&EG(symbol_table), 50, NULL, ZVAL_PTR_DTOR, 0);{ zval *globals; ALLOC_ZVAL(globals); Z_SET_REFCOUNT_P(globals, 1); Z_SET_ISREF_P(globals); Z_TYPE_P(globals转载 2017-01-20 21:24:21 · 511 阅读 · 0 评论 -
27.静态变量
| T_STATIC static_var_list ';'static_var_list: static_var_list ',' T_VARIABLE { zend_do_fetch_static_variable(&$3, NULL, ZEND_FETCH_STATIC TSRMLS_CC); } | static_var_list ',' T_VARIABLE转载 2017-01-20 21:42:28 · 255 阅读 · 0 评论 -
28.类型提示的实现
static int ZEND_FASTCALL ZEND_RECV_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS){ ...//省略 if (param == NULL) { char *space; char *class_name = get_active_class转载 2017-01-20 21:50:38 · 302 阅读 · 0 评论 -
29.变量的生命周期
http://www.php-internals.com/book/?p=chapt03/03-06-00-var-lifecycle转载 2017-01-20 21:53:15 · 264 阅读 · 0 评论 -
30.变量的赋值和销毁
static zend_always_inline zval **_get_zval_ptr_ptr_cv(const znode *node, const temp_variable *Ts, int type TSRMLS_DC){ zval ***ptr = &CV_OF(node->u.var); if (UNEXPECTED(*ptr == NULL)) {转载 2017-01-20 22:08:19 · 350 阅读 · 0 评论 -
31.变量的作用域
http://www.php-internals.com/book/?p=chapt03/03-06-02-var-scope转载 2017-01-20 22:11:46 · 213 阅读 · 0 评论 -
32.global语句
| T_GLOBAL global_var_list ';'global_var_list: global_var_list ',' global_var { zend_do_fetch_global_variable(&$3, NULL, ZEND_FETCH_GLOBAL_LOCK TSRMLS_CC); }| global_var转载 2017-01-20 22:14:55 · 308 阅读 · 0 评论 -
33. 数据类型转换
可用看出如果字符串链接的两个操作数如果不是字符串的话, 则调用zend_make_printable_zval函数将操作数转换为"printable_zval"也就是字符串。ZEND_API void zend_make_printable_zval(zval *expr, zval *expr_copy, int *use_copy){ if (Z_TYPE_P(expr)==IS_ST转载 2017-01-20 22:18:13 · 320 阅读 · 0 评论 -
10.生命周期和Zend引擎
http://www.php-internals.com/book/?p=chapt02/02-01-php-life-cycle-and-zend-engine转载 2016-12-26 00:40:29 · 797 阅读 · 0 评论 -
1.单进程SAPI生命周期
CLI/CGI模式的PHP属于单进程的SAPI模式。这类的请求在处理一次请求后就关闭。也就是只会经过如下几个环节: 开始 - 请求开始 - 请求关闭 - 结束 SAPI接口实现就完成了其生命周期。如图2.1所示:1.php_module_startup() // 启动2.php_request_startup() // 激活3.php_execute_script() ...原创 2018-08-21 14:53:17 · 457 阅读 · 0 评论 -
2.php.ini, php-fpm.conf 详解配置
1.php.ini http://www.cnblogs.com/ellisonDon/archive/2013/03/05/2944704.htmlhttp://php.net/manual/zh/configuration.php 2.php-fpm.confhttp://php.net/manual/zh/install.fpm.configuration.phph...转载 2018-08-29 00:22:51 · 762 阅读 · 0 评论 -
1.PHP 扩展开始以及内核应用(1) --- PHP 的生命周期
1.2 PHP 的启动与终止 PHP 程序的启动可以看做有2个概念上的启动,终止也有2个。其中一个是 PHP 作为 Apache(举例)的一个模块的启动和终止, 这次启动PHP会初始化一些必要的数据,比如与宿主apache有关的,并且这些数据是常驻内存的。终止与之相对。还有一个概念上 的启动就是当 apache 分配一个页面请求过来的时候,php 会有一次启动与终止。 ...转载 2018-11-22 13:54:39 · 225 阅读 · 0 评论 -
2.PHP 扩展开始以及内核应用(1) --- PHP 变量在内核中的实现
2.PHP 变量在内核中的实现 1.变量的类型 php 在内核中是通过 zval 这个结构体来存储变量的,它定义在 Zend/zend.h 文件里。 struct _zval_struct { /* Variable information */ //存储变量的值 zvalue_value value; /* value */ //变量的值 zend_uin...转载 2018-11-26 14:09:28 · 363 阅读 · 0 评论 -
2.PHP7内核剖析 --- SAPI
SAPI 是 PHP 框架的接口层,它是进入 PHP 内部的入口。其中 Cli,Fpm SAPI 是完整的应用程序,它们有定义自己的 main 函数, 方便我们从入口开始逐步调试分析 PHP 的处理,有其是 Cli,非常方便调试。1.Cli cli 即命令行接口,用于在命令行下执行 php 脚本,就像 shell 那样。 --enable-cli --disable-cli ...转载 2019-07-28 23:27:23 · 343 阅读 · 0 评论 -
22.哈希表(HashTable)
初始化的主要工作是为哈希表申请存储空间,函数中使用calloc函数的目的是确保 数据存储的槽为都初始化为0,以便后续在插入和查找时确认该槽为是否被占用。int hash_insert(HashTable *ht, char *key, void *value){ // check if we need to resize the hashtable resize_hash_tab转载 2017-01-18 23:41:10 · 360 阅读 · 0 评论 -
21.变量的结构和类型
typedef struct _zval_struct zval;...struct _zval_struct { /* Variable information */ zvalue_value value; /* value */ zend_uint refcount__gc; zend_uchar type; /* active type */转载 2017-01-17 23:59:50 · 327 阅读 · 0 评论 -
20.变量及数据类型
http://www.php-internals.com/book/?p=chapt03/03-00-variable-and-data-types转载 2017-01-17 23:38:31 · 297 阅读 · 0 评论 -
2. PHP 编译安装
1.去官网下载对应的 php 版本http://php.net/downloads.php用版本控制也可以:git clone https://git.php.net/repository/php-src.git2.准备编译环境sudo apt-get install build-essential3. 编译./configure --help # 查看可用参数./configure --dis转载 2016-07-30 21:04:46 · 295 阅读 · 0 评论 -
3.源码结构
根目录: / 这个目录包含的东西比较多,主要包含一些说明文件以及设计方案。 其实项目中的这些README文件是非常值得阅读的例如:/README.PHP4-TO-PHP5-THIN-CHANGES 这个文件就详细列举了PHP4和PHP5的一些差异。还有有一个比较重要的文件/CODING_STANDARDS,如果要想写PHP扩展的话,这个文件一定要阅读一下, 不管你个人的代码风格是什么样,怎么样使转载 2016-07-31 19:14:16 · 587 阅读 · 0 评论 -
4.PHP的运行方式
1、运行模式 1.1 CGI模式 CGI模式安装: 1.2 FastCGI模式 安装fastcgi模式: 1.3 CLI模式 1.4 模块模式 1.5 ISAPI模式 6. php在Nginx中运行模式(Nginx+ PHP-FPM) http://www.cnblogs.com/xia520pi/p/3914964.htmlhttp://blog.csdn.转载 2016-12-10 20:53:24 · 290 阅读 · 0 评论 -
6.常用代码
#define PHP_FUNCTION ZEND_FUNCTION#define ZEND_FUNCTION(name) ZEND_NAMED_FUNCTION(ZEND_FN(name))#define ZEND_FN(name) zif_##name#define ZEND_NAMED_FUNCTION(name) void na转载 2016-12-18 22:55:17 · 380 阅读 · 0 评论 -
7.用户代码的执行
http://www.php-internals.com/book/?p=chapt02/02-00-overview转载 2016-12-18 23:39:09 · 408 阅读 · 0 评论 -
5.PHP 命令行模式
PHP 命令行模式转载 2016-12-10 22:14:09 · 548 阅读 · 0 评论 -
14.嵌入式
嵌入式 #include <sapi/embed/php_embed.h>#ifdef ZTS void ***tsrm_ls;#endif/* Extension bits */zend_module_entry php_mymod_module_entry = { STANDARD_MODULE_HEADER, "mymod", /* extension nam转载 2017-01-06 00:03:12 · 395 阅读 · 0 评论 -
15.FastCGI
#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <sys/types.h>#include <sys/socket.h>#include <arpa/inet.h>#include <netinet/in.h>#include <string.h>#define SERV_PORT 9003char *s转载 2017-01-06 12:56:44 · 329 阅读 · 0 评论 -
16.PHP脚本的执行
<?php$code =<<<PHP_CODE<?php$str = "Hello, Tipi\n";echo $str;PHP_CODE;var_dump(token_get_all($code));运行上面的脚本你将会看到一如下的输出array ( 0 => array ( 0 => 368, // 脚本开始标记 1 => '<?php /转载 2017-01-08 22:46:57 · 348 阅读 · 0 评论 -
17.词法分析和语法分析
定义段%%规则段%%用户代码段例如以下一个用于统计文件字符、词以及行数的例子:%option noyywrap%{int chars = 0;int words = 0;int lines = 0;%}%%[a-zA-Z]+ { words++; chars += strlen(yytext); }\n { chars++; lines++; }. { chars++;转载 2017-01-08 23:20:45 · 695 阅读 · 0 评论 -
18.opcode
struct _zend_op { opcode_handler_t handler; // 执行该opcode时调用的处理函数 znode result; znode op1; znode op2; ulong extended_value; uint lineno; zend_uchar opcode; // opcode代码};voi转载 2017-01-08 23:27:25 · 270 阅读 · 0 评论 -
19.opcode处理函数查找
ZEND_API void execute(zend_op_array *op_array TSRMLS_DC){...zend_vm_enter:....if ((ret = EX(opline)->handler(execute_data TSRMLS_CC)) > 0) { switch (ret) { case 1:转载 2017-01-08 23:32:00 · 391 阅读 · 0 评论 -
12.第二节 SAPI概述
SAPI概述 struct _sapi_module_struct { char *name; // 名字(标识用) char *pretty_name; // 更好理解的名字(自己翻译的) int (*startup)(struct _sapi_module_struct *sapi_module); // 启动函数 int (转载 2017-01-04 23:31:09 · 368 阅读 · 0 评论 -
13.Apache模块
static sapi_module_struct apache2_sapi_module = {"apache2handler","Apache 2.0 Handler",php_apache2_startup, /* startup */php_module_shutdown_wrapper, /* shutdown */NULL,转载 2017-01-05 13:41:25 · 297 阅读 · 0 评论 -
1.PHP7内核剖析 --- PHP 基础架构
1.PHP7 的变化: 1.抽象语法树 在 php 之前的版本,php 代码在语法解析阶段直接生成了 ZendVM 指令,也就是 zend_language_parser.y 中直接生成 opline 指令, 这使得编译器与执行器耦合在一起。编译生成的指令供执行引起使用,该指令是在语法解析时直接生成的,加入要把执行引擎换成其他的,就需要 修改语法解析规则;或者如果 php 语法...转载 2019-07-25 23:49:27 · 4597 阅读 · 0 评论