资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,2015/4/13,#,PHP,扩展开发,更多内容,请见,2015-04-14,下午分享会,NTS or TS,None Thread Safe(,非线程安全,),Thread Safe(,线程安全,),开发环境,Windows OR Linux,X86 OR X64,Windows,环境,VC6,(,Microsoft Visual C+6.0,),VC9,(,Microsoft Visual Studio 2008,),VC11,(,Microsoft Visual Studio 2012,),Cygwin64 OR Cygwin_X86,Php-deps,php-sdk-binary-tools,Php,源码,Windows,开发流程,Buildconf,configure,ext_skel_win32.php,参数,-extname,扩展名称,-proto,定义文件,编译,Linux,开发流程,ext_skel,-extname,扩展名称,-proto,定义文件,config.m4,PHP_ARG_WITH(example,for example support,-with-example=FILE Include example support.File is the optional path to example-config),PHP_ARG_WITH(example-extra,for extra libraries for example,-with-example-extra=DIR example:Location of extra libraries for example,no,no),Linux,开发流程,Phpize,configure,-with-php-config=/usr/local/php/bin/php-config,Make,Make install,函数声明宏,语义,PHP_MINIT_FUNCTION(),当,PHP,被装载时,模块启动函数即被引擎调用。这使得引擎做一些例如资源类型,注册,INI,变量等的一次初始化。,PHP_MSHUTDOWN_FUNCTION(),当,PHP,完全关闭时,模块关闭函数即被引擎调用。通常用于注销,INI,条目,PHP_RINIT_FUNCTION(),在每次,PHP,请求开始,请求前启动函数被调用。通常用于管理请求前逻辑。,PHP_RSHUTDOWN_FUNCTION(),在每次,PHP,请求结束后,请求前关闭函数被调用。经常应用在清理请求前启动函数的逻辑。,PHP_MINFO_FUNCTION(),调用,phpinfo(),时模块信息函数被呼叫,从而打印出模块信息。,PHP,的变量,typedef struct _zval_struct,zvalue_value value;,zend_uint refcount;,zend_uchar type;,zend_uchar is_ref;,zval;,typedef union _zvalue_value,long lval;,double dval;,struct,char*val;,int len;,str;,HashTable*ht;,zend_object_value obj;,zvalue_value;,typedef struct _zval_struct zval;,宏,访问对象,C,类型,Z_LVAL,Z_LVAL_P,Z_LVAL_PP,整型值,long,Z_BVAL,Z_BVAL_P,Z_BVAL_PP,布尔值,zend_bool,Z_DVAL,Z_DVAL_P,Z_DVAL_PP,浮点值,double,Z_STRVAL,Z_STRVAL_P,Z_STRVAL_PP,字符串值,char*,Z_STRLEN,Z_STRLEN_P,Z_STRLEN_PP,字符串长度值,int,Z_RESVAL,Z_RESVAL_P,Z_RESVAL_PP,资源值,long,Z_ARRVAL,Z_ARRVAL_P,Z_ARRVAL_PP,联合数组,HashTable*,Z_TYPE,Z_TYPE_P,Z_TYPE_PP,Zval,类型,Enumeration(IS_NULL,IS_LONG,IS_DOUBLE,IS_STRING,IS_ARRAY,IS_OBJECT,IS_BOOL,IS_RESOURCE,),Z_OBJPROP,Z_OBJPROP_P,Z_OBJPROP_PP,对象属性,hash,(本章不会谈到),HashTable*,Z_OBJCE,Z_OBJCE_P,Z_OBJCE_PP,对象的类信息(本章不会谈到),zend_class_entry,获取参数,zend_parse_parameters(int num_args TSRMLS_DC,char*type_spec,);,类型指定符,对应的,C,类型,描述,l,long,符号整数,d,double,浮点数,s,char*,int,二进制字符串,长度,b,zend_bool,逻辑型(,1,或,0,),r,zval*,资源(文件指针,数据库连接等),a,zval*,联合数组,o,zval*,任何类型的对象,O,zval*,指定类型的对象。需要提供目标对象的类类型,z,zval*,无任何操作的,zval,返回值,设置返回值并且结束函数,设置返回值,宏返回类型和参数,RETURN_LONG(l),RETVAL_LONG(l),整数,RETURN_BOOL(b),RETVAL_BOOL(b),布尔数,(1,或,0),RETURN_NULL(),RETVAL_NULL(),NULL,RETURN_DOUBLE(d),RETVAL_DOUBLE(d),浮点数,RETURN_STRING(s,dup),RETVAL_STRING(s,dup),字符串。如果,dup,为,1,,引擎会调用,estrdup(),重复,s,,使用拷贝。如果,dup,为,0,,就使用,s,RETURN_STRINGL(s,l,dup),RETVAL_STRINGL(s,l,dup),长度为,l,的字符串值。与上一个宏一样,但因为,s,的长度被指定,所以速度更快。,RETURN_TRUE,RETVAL_TRUE,返回布尔值,true,。注意到这个宏没有括号。,RETURN_FALSE,RETVAL_FALSE,返回布尔值,false,。注意到这个宏没有括号。,RETURN_RESOURCE(r),RETVAL_RESOURCE(r),资源句柄。,自定义,php,函数,?php,$i=3;,echo self_concat(“Hello World,$i);,Eg.1,PHP_FUNCTION(self_concat),char*str=NULL;,int argc=ZEND_NUM_ARGS();,int str_len;,long n;,char*result;,char*ptr;,int result_length;,if(zend_parse_parameters(argc TSRMLS_CC,sl,&str,&str_len,&n)=FAILURE),return;,Eg.2,result_length=(str_len*n);,result=(char*)emalloc(result_length+1);,ptr=result;,while(n-),memcpy(ptr,str,str_len);,ptr+=str_len;,*ptr=/0;,Eg.3,RETURN_STRINGL(result,result_length,0);,谢谢大家,
展开阅读全文