PHP的启动
PHP的启动经历了
PHP_MINIT_FUNCTION->
PHP_RINIT_FUNCTION->
PHP_RSHUTDOWN_FUNCTION->
PHP_MSHUTDOWN_FUNCTION
4个阶段。
但是 这4个阶段会由于SAPI宿主的不同在不同阶段执行。
如果把PHP比作汽车,那么SAPI就是公路。
常见的SAPI可以是
CLI/CGI
一个请求过来,会执行以上4个阶段。
多进程模型
以APACHE的PRE-FORK为代表,在此模式下,APACHE会设定一个初始进程数量,然后请求增多以后,会以2的指数次方创建进程。
多线程模型
以APACHE的worker为代表,在这种模式下,只有一个服务器进程在运行着,但会同时运行很多线程,这样可以减少一些资源开销,向Module init和Module shutdown就只需要运行一遍就行了,一些全局变量也只需要初始化一次,因为线程独具的特质,使得各个请求之间方便的共享一些数据成为可能。
PHP的类型
struct _zval_struct {
zvalue_value value; /* 变量的值 */
zend_uint refcount__gc; //引用计数
zend_uchar type; /* 变量当前的数据类型 */
zend_uchar is_ref__gc; //是否被引用
};
typedef struct _zval_struct zval;
其中变量的值zvalue_value又是个union,具体如下
typedef union _zvalue_value {
long lval; /* long value */
double dval; /* double value */
struct {
char *val;
int len;
} str; //可以看到php的str与c的用\0结束不同,而是用一个int表示他的长度
HashTable *ht; /* hash table value PHP数组的保存方式*/
zend_object_value obj;
} zvalue_value;
如何判断PHP值的类型(zval->type),PHP定义了一些以IS_开头的常量
IS_NULL,IS_LONG,IS_DOUBLE,IS_STRING,IS_ARRAY,IS_OBJECT,IS_RESOURCE
还定义了三个检测变量类型的宏,分别接收zval,zval*,zval**类型的变量
define Z_TYPE(zval) (zval).type
define Z_TYPE_P(zval_p) Z_TYPE(*zval_p)
define Z_TYPE_PP(zval_pp) Z_TYPE(**zval_pp)
说明:本来也可以把zval->type和IS_开头的常量比较,但是如果以后PHP改变zval的定义,就不能保证兼容性。
如何操作PHP的值(zval->value)
PHP定义了基础宏获取zval->value
//操作整数的
#define Z_LVAL(zval) (zval).value.lval
#define Z_LVAL_P(zval_p) Z_LVAL(*zval_p)
#define Z_LVAL_PP(zval_pp) Z_LVAL(**zval_pp)
//操作IS_BOOL布尔型的
#define Z_BVAL(zval) ((zend_bool)(zval).value.lval)
#define Z_BVAL_P(zval_p) Z_BVAL(*zval_p)
#define Z_BVAL_PP(zval_pp) Z_BVAL(**zval_pp)
//操作浮点数的
#define Z_DVAL(zval) (zval).value.dval
#define Z_DVAL_P(zval_p) Z_DVAL(*zval_p)
#define Z_DVAL_PP(zval_pp) Z_DVAL(**zval_pp)
//操作字符串的值和长度的
#define Z_STRVAL(zval) (zval).value.str.val
#define Z_STRVAL_P(zval_p) Z_STRVAL(*zval_p)
#define Z_STRVAL_PP(zval_pp) Z_STRVAL(**zval_pp)
#define Z_STRLEN(zval) (zval).value.str.len
#define Z_STRLEN_P(zval_p) Z_STRLEN(*zval_p)
#define Z_STRLEN_PP(zval_pp) Z_STRLEN(**zval_pp)
//操作数组的
#define Z_ARRVAL(zval) (zval).value.ht
#define Z_ARRVAL_P(zval_p) Z_ARRVAL(*zval_p)
#define Z_ARRVAL_PP(zval_pp) Z_ARRVAL(**zval_pp)
对象和资源类型的暂时不考虑了。
PHP值的创建
第一步,通过MAKE_STD_ZVAL(pzv)初始化一个指向zval的指针pzv
第二步,通过之前学过的操作PHP类型的各种宏对zval->type,zval->value进行赋值。
比如:
Z_TYPE_P(pzv) = IS_LONG;
Z_LVAL_P(pzv) = l;
也可以用新的宏把它简化
ZVAL_LONG(pzv, l);
注意:字符串在php中的表示是
struct {
char *val;
int len;
} str;
所以赋值时候要即赋值val 还要赋值len
比如:
Z_TYPE_P(pzv) = IS_STRING;
Z_STRLEN_P(pzv) = len;
if (dup)
{Z_STRVAL_P(pzv) =estrndup(str, len + 1);} //estrndup重新申请内存,并复制字符串
else
{Z_STRVAL_P(pzv) = str;}
也可以用新的宏把它简化
ZVAL_STRINGL(pzv,str,len,dup);
变量的存储
struct _zend_executor_globals {
...
HashTable symbol_table;
HashTable *active_symbol_table;
...
};
创建一个zval结构,并设置其类型。
设置值为'bar'。
将其加入当前作用域的符号表,只有这样用户才能在PHP里使用这个变量。
具体的代码为:
{
zval *fooval;
MAKE_STD_ZVAL(fooval);
ZVAL_STRING(fooval, "bar", 1);
ZEND_SET_SYMBOL( EG(active_symbol_table) , "foo" , fooval);
}
上面解释了zval->type,zval->vale相关的,下面解释zval->refcount__gc,zval->is_ref_gc
相关文章检索copy-on-write
ZEND_FUNCTION返回值
ZEND_FUNCTION的宏展开是
void name(INTERNAL_FUNCTION_PARAMETERS) 展开INTERNAL_FUNCTION_PARAMETERS
#define INTERNAL_FUNCTION_PARAMETERS
int ht,
zval *return_value, //返回值的指针,给他赋值就行了。
zval **return_value_ptr,
zval *this_ptr,
int return_value_used TSRMLS_DC
返回值例子:
ZEND_FUNCTION(sample_long)
{
ZVAL_LONG(return_value, 42); //前面讲过的如何给zval* 赋值。
return;
}
分享到:
相关推荐
java杂七杂八java杂七杂八java杂七杂八java杂七杂八
【标题】:“Linux 杂七杂八的资料”这一压缩包包含了多个与Linux操作系统相关的学习材料,涵盖了从基本概念到高级应用的多个方面。 【描述】:描述中的重复表明这个资料包是关于Linux的广泛主题,可能包括了教程、...
"杂七杂八"这个词,意指事物繁多且无秩序,通常用来形容物品或事情混杂在一起的情况。它的近义词包括"杂乱无章"、"参差不齐"、"错落有致"、"七零八落"等,这些词都有类似的含义,表示事物排列混乱或种类繁多。 1. ...
这些压缩包中的文件主要涵盖了软件测试的不同方面,包括性能测试、单元测试、自动化测试和测试框架等关键领域。以下是对每个文件内容的详细说明: 1. **软件性能测试过程详解与案例剖析.pdf**:这份文档可能详细...
模糊控制的一些杂七杂八的资料:模糊控制ch1ch2.ppt模糊控制ch3基本原理.ppt包模糊控制ch4应用实例.ppt包]模糊控制ch5改善系统性能的方法.ppt模糊控制算法c程序.doc模糊算法在智能车控制中的应用.pdf模糊控制算法...
这是一个关于使用PHP实现微信服务商支付JSAPI的示例项目。该项目包含了必要的文件和说明,旨在帮助开发者理解并实施微信支付接口。以下是对每个文件及标签的详细解释: 1. **PHP**:这是一种广泛使用的服务器端脚本...
杂七杂八攒在一起存着 目录: [apps-for-android-master]() [BmobExample]() [bookmanager]() [FirebaseSample]() [Gson_Fastjson_for_Json]() [highlight]() [Kyhelper]() [mytoolbar]() [Okdroid]() ...
文档中的"杂七杂八留下的代码"可能涵盖了日常工作中遇到的各种问题的解决方案,对于学习和提升Linux技能非常有帮助。 在Linux Shell中,用户可以执行系统级操作,如文件管理、进程控制、网络配置等。例如,`ls`命令...
PID的详细调试.pdfPID电机控制.pdfPID调节规律和过程控制.pdf PID过程控制及其参数整定.pdfPID控制算法的C语言实现.PID算法.pdf数字PID及其改进算法.pdf由入门到精通吃透PID.pdf增量式PID.docx
软件开发设计:应用软件开发、系统软件开发、移动应用开发、网站开发C++、Java、python、web、C#等语言的项目开发与学习资料 硬件与设备:单片机、EDA、proteus、RTOS、包括计算机硬件、服务器、网络设备、存储设备...
在"杂七杂八 都是收藏的编程方面"这个主题中,我们可以深入探讨C++ Builder的一些关键知识点,以及与之相关的编程技巧。 首先,C++ Builder提供了VCL(Visual Component Library)框架,它是一套面向对象的类库,...
广义表 图元识别 josep排列 jose排列 inver逆序表 paren括号匹配 expr波兰表达式 二叉树(满 前缀 同构 后缀 ) 多机调度 简单路径 非递归遍历 进制方程 嵌套 等价类划分 等等 太多了 不写了 自己下载了看看吧
这里是以 CentOS 为例,红帽系列的 Linux 方法应该都是如此,下面就详细说明步骤,在这里严重鄙视哪些内容啰嗦、说的杂七杂八的有关 PDO 编译安装的文章。 1、进入 PHP 的软件包 pdo 扩展目录中(注:不是 PHP 安装...
平时想到的一些杂七杂八的东西 版本 2021-02-19 将大屏展示弄成组件化 2018-11-30 添加了一些东西,也修改了一下里面的文件夹的结构,内容没有变 结构目录 aboutMap 关于地图的一些 BaiduMapTile使用C#写的,可以...
在"js代码-杂七杂八的"这个主题中,我们可以深入探讨JavaScript的多个方面,包括基本语法、变量、数据类型、控制结构、函数、对象、DOM操作以及事件处理等。 1. 基本语法:JavaScript是基于ECMAScript规范的,它...
杂七杂八" 暗示这是一个包含多种编程语言或技术的代码库,可能是一个学习资源或者开发者个人的代码收藏。"杂七杂八"一词表明其中涵盖了各种不同的主题和用途,可能没有特定的主线,而是以实用性和多样性为主。 ...