Deprecated
: htmlspecialchars(): Passing null to parameter #1 ($string) of type string is deprecated in
/www/wwwroot/testblog.58heshihu.com/var/Widget/Archive.php
on line
1057
首页
关于
Search
1
给你10个市场数据调研报告的免费下载网站!以后竞品数据就从这里找!
182 阅读
2
php接口优化 使用curl_multi_init批量请求
144 阅读
3
《从菜鸟到大师之路 ElasticSearch 篇》
107 阅读
4
2024年备考系统架构设计师
104 阅读
5
PHP 文件I/O
92 阅读
php
thinkphp
laravel
工具
开源
mysql
数据结构
总结
思维逻辑
令人感动的创富故事
读书笔记
前端
vue
js
css
书籍
开源之旅
架构
消息队列
docker
教程
代码片段
redis
服务器
nginx
linux
科普
java
c
ElasticSearch
测试
php进阶
php基础
登录
Search
标签搜索
php函数
php语法
性能优化
安全
错误和异常处理
问题
vue
Composer
Session
缓存
框架
Swoole
api
并发
异步
正则表达式
php-fpm
mysql 索引
开发规范
协程
dafenqi
累计撰写
786
篇文章
累计收到
28
条评论
首页
栏目
php
thinkphp
laravel
工具
开源
mysql
数据结构
总结
思维逻辑
令人感动的创富故事
读书笔记
前端
vue
js
css
书籍
开源之旅
架构
消息队列
docker
教程
代码片段
副业
redis
服务器
nginx
linux
科普
java
c
ElasticSearch
测试
php进阶
php基础
页面
关于
搜索到
1
篇与
的结果
2023-08-07
PHP扩展开发(写一个加法的例子)
PHP扩展开发(写一个加法的例子)5.1 您的第一个扩展配置文件才开始,我们先用最快的(不是最标准的)的方式来建立一个代码最少的扩展。在php源码文件夹的ext目录下创建一个新的文件夹,这里我取的名字叫做walu,它往往就是我们扩展的名字。其实这个文件夹可以放在任何一个位置,但是为了我们在后面介绍win32的编译与静态编译,我们还是把它放在php源码的ext目录下。 现在,我们在这个目录下创建一个config.m4文件,并输入以下内容:PHP_ARG_ENABLE(walu,[Whether to enable the "walu" extension], [ enable-walu Enable "walu" extension support]) if test $PHP_WALU != "no"; thenPHP_SUBST(WALU_SHARED_LIBADD) PHP_NEW_EXTENSION(walu, walu.c, $ext_shared)fi上面PHP_ARG_ENABLE函数有三个参数,第一个参数是我们的扩展名(注意不用加引号),第二个参数是当我们运行./configure脚本时显示的内容,最后一个参数则是我们在调用./configure --help时显示的帮助信息。也许有人会问,为什么有的扩展的开启方式是 --enable-extname的形式,有的则是 --with-extname的形式呢?其实两者并没有什么本质的不同,只不过enable多代表不依赖外部库便可以直接编译,而with大多需要依赖于第三方的lib。 现在,我们的扩展并不需要依赖其它的库文件,所以我们直接使用--enable-walu便可以了。在第17章的时候我们将接触通过CFLAGS和LDFLAGS来配置自己的扩展,使其依赖第三方库文件才能被编译成php扩展。如果我们显示运行./configure --enable-walu,那么终端环境便会自动将$PHP_WALU变量设置为yes,而PHP_SUBST函数只不过是php官方对autoconf里的AC_SUBST函数的一层封装。 最后重要的一点是,PHP_NEW_EXTENSION函数声明了这个扩展的名称、需要的源文件名、此扩展的编译形式。如果我们的扩展使用了多个文件,便可以将这多个文件名罗列在函数的参数里,如:PHP_NEW_EXTENSION(sample, sample.c sample2.c sample3.c, $ext_shared)最后的$ext_shared参数用来声明这个扩展不是一个静态模块,而是在php运行时动态加载的。下面,我们来编写实现扩展主逻辑的源文件walu.c://加载config.h,如果配置了的话ifdef HAVE_CONFIG_Hinclude "config.h"endif//加载php头文件include "php.h"define phpext_walu_ptr &walu_module_entry//module entryzend_module_entry walu_module_entry = {if ZEND_MODULE_API_NO >= 20010901 STANDARD_MODULE_HEADER,endif"walu", //这个地方是扩展名称,往往我们会在这个地方使用一个宏。 NULL, /* Functions */ NULL, /* MINIT */ NULL, /* MSHUTDOWN */ NULL, /* RINIT */ NULL, /* RSHUTDOWN */ NULL, /* MINFO */if ZEND_MODULE_API_NO >= 20010901"2.1", //这个地方是我们扩展的版本endifSTANDARD_MODULE_PROPERTIES};ifdef COMPILE_DL_WALUZEND_GET_MODULE(walu)endif这就是所有的代码了,不过鉴于我们平时的开发习惯,往往会把这一份代码分成两份,一个.h文件,一个.c文件。上面的代码只是生成了一基本的框架,而没有任何实际的用处。 紧接着,创建一个zend_module_entry结构体,你肯定已经发现了,依据ZEND_MODULE_API_NO 是否大于等于 20010901,这个结构体需要不同的定义格式。20010901大约代表PHP4.2.0版本,所以我们现在的扩展几乎都要包含STANDARD_MODULE_HEADER这个元素了。 其余六个成员我们可以先赋值为NULL,其实看看它们各自后面的注释你就应该大体上了解它们各自是负责哪一方面的工作了。 最后,最底下的代码用来标志我们的这个扩展是一个共享模块。它是干么的呢?我也说不清楚,反正带上就对了,否则扩展会工作不正常。原文解释:这个简短的条件只是在动态加载扩展时使用 Zend 使用的一个引用。不要担心它做了什么或它是如何做的;只要确保它就在附近,否则下一部分将不起作用。标准一些根据我们平时的开发习惯,应该不会把所有代码都写在这一个文件里的,我们需要把上述代码放在两个文件里,一个头文件,一个c文件。//php_walu.hifndef WALU_Hdefine WALU_H//加载config.h,如果配置了的话ifdef HAVE_CONFIG_Hinclude "config.h"endif//加载php头文件include "php.h"define phpext_walu_ptr &walu_module_entryextern zend_module_entry walu_module_entry;endif下面的是c文件//walu.cinclude "php_walu.h"//module entryzend_module_entry walu_module_entry = {if ZEND_MODULE_API_NO >= 20010901 STANDARD_MODULE_HEADER,endif"walu", //这个地方是扩展名称,往往我们会在这个地方使用一个宏。 NULL, /* Functions */ NULL, /* MINIT */ NULL, /* MSHUTDOWN */ NULL, /* RINIT */ NULL, /* RSHUTDOWN */ NULL, /* MINFO */if ZEND_MODULE_API_NO >= 20010901"2.1", //这个地方是我们扩展的版本endifSTANDARD_MODULE_PROPERTIES};ifdef COMPILE_DL_WALUZEND_GET_MODULE(walu)endif链接5 你的第一次延期
2023年08月07日
15 阅读
0 评论
0 点赞