开发工具:
文件大小: 4mb
下载次数: 0
上传时间: 2019-03-04
详细说明:1. PHP 可以用 C++ 扩展实现多线程
2. PHP-X 支持 Windows 平台,可以开发Windows的PHP扩展
3. 程序中大量运算的逻辑可以改为 C++ 扩展实现
4. 使用 PHP-X 开发商业软件,避免源码泄漏PHP的扩展加载过程
1.zend引擎的 php load extension函数
2.加载并执行So中 get module函数,返回 zend module entry
3. struct中设置了M(R)N|T、M(R) SHUTDOWN4个函数指针
4.执行 zend startup module ex函数启动扩展
5.PHP扩展加载依赖gibc的d库,是标准的 Linux动态链接库
if (type = MODULE_ PERSISTENT)i
extension dir INI STR("extension dir");
extension dir PG(extension dir)
if (type = MODULE_TEMPORARY)i
error type E WARNING;
else t
error type E CORE WARNING;
/ Check if passed filename contains directory separators *
if (strchr(filename,'/')!= NULL strchr(filename, DEFAULT SLASH)!=NULL)[
/ Passing modules with full path is not supported for dynamically loaded extensions *
if (type = MODULE_ TEMPORARY)(
php error docref(NULL, E_WARNING, " Temporary module name should contain only filename")
turn FAIlure
ibpath estrup(filename)
else if (extension dir & extension dirle]t
int extension dir len =(int)strlen(extension dir);
if (IS SLASH(extension dir [extension dir len]))(
spprintf(&libpath, 0,%s%s", extension dir, filename );/ SAFE *
spprintf(&libpath, 0,%s%c%s", extension dir, DEFAULT SLASH, filename);/* SAFE *
/ load dynamic symbol */
handle DL LOAD(libpath)
if ( handle)[
#ifdef PHP WIn32
char *err GET DL ERRORO)
f(err&&(*er!='\0"){
php error docref (NUll, error type, Unable to load dynamic library %s-%s", libpath, err)
LocalFree(err)
f else t
php error docref (NUll, error type, Unable to load dynamic library %s-%s", libpath,"Unknown reason")
#else
php error docref(NUll, error type, Unable to load dynamic library %s-%s", libpath, GET DL ERRORO)
GET DL ERROR O;/ free the buffer storing the error */
#endif
efree (libpath)
return FAIlUre
efree (libpath)
get module =(zend module entry *(*)(void)) DL FETCH SYMBOL(handle,"get module");
Some oS prepend to symbol names while their dynamic linker
k does not do that automatically. Thus we check manually for
get module. *
if (!get module)i
get module =(zend module entry *(*)(void))DL FETCH SYMBOL(handle,"get module");
if (!get module) f
if (DL FETCH SYMBOL(handle, zend extension entry") DL FETCH SYMBOL(handle, " zend extension entry" ))t
DL UNLOAD(handle);
php_error_docref(NULL, error_type,"Invalid library (appears to be a Zend Extension, try loading using z
return FAILURE,
DL UNLOAD(handle)
php error docref(NUll, error type,"Invalid library (maybe not a Php library) %s", filename );
return FAIlUre
module entry get module
if ((module entry zend register module ex(module entry )== NULl)[
DL UNLOAD(handle)
return FAILUre
if((type =MODULE TEMPORARY start now )& zend startup module ex(module entry)==FAILURe)[
DL UNLOAD (handle)
return FAILURE j
if ((type = MODULE TEMPORARY start now )&& module entry->request startup func)f
if (module entry->request startup func(type, module entry->module number)== FaIlure[
php error docref(NULl, error type, Unable to initialize module %s", module entry->name)
DL UNLOAD(handle)
return FAIlure
return SUCCESS;
创建PHP的扩展工程
1.扩展骨架生成工具: ext skel
2.编辑 config,n4
3.修改 extension. h头文件定义扩展的函数
4.修改 extension.c源文件,实现函数的逻辑
5. phpize、 configure、make、 make install
6.建议:参考其他扩展的源码
编写PHP扩展-基本类型
zvaL a3
Sa=1234;
ZVAL_ LONG(&a, 1234);
sb=1234.56;
zval b
ZVAL DOUBLE(&b, 1234.56)
sc= hello wor ldI
zvaL ci
ZVAL_STRING(&c,"hello wor ld")
sd= array o:
zval d
se= false;
array_init(&d);
zval ej
ZVAL BOOL (&e, o)
编写PHP扩展-类型推断
zval xvalue
is_int(Svalue);
Z-TYPE_P(value)== IS_LONG;
is_float(Svalue);
Z TYPE P(va lue)
IS STRING
is string(svalue)
Z TYPE P(value)== IS ARRAY
is_array(Svalue)
Z TYPE P(value)== IS DOUBLE
is_bool(Svalue);
Z TYPE P(value)
IS TRUE
is object(Svalue)
Z TYPE P(value)
工 S FALSE
Z TYPE P(value)== IS_OBJECT
(系统自动生成,下载前可以参看下载内容)
下载文件列表
相关说明
- 本站资源为会员上传分享交流与学习,如有侵犯您的权益,请联系我们删除.
- 本站是交换下载平台,提供交流渠道,下载内容来自于网络,除下载问题外,其它问题请自行百度。
- 本站已设置防盗链,请勿用迅雷、QQ旋风等多线程下载软件下载资源,下载后用WinRAR最新版进行解压.
- 如果您发现内容无法下载,请稍后再次尝试;或者到消费记录里找到下载记录反馈给我们.
- 下载后发现下载的内容跟说明不相乎,请到消费记录里找到下载记录反馈给我们,经确认后退回积分.
- 如下载前有疑问,可以通过点击"提供者"的名字,查看对方的联系方式,联系对方咨询.