电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術(shù)文章
文章詳情頁

編寫自己的php擴展函數(shù)

瀏覽:5日期:2024-07-08 13:18:58

php程序?qū)懙臅r間長了,自然對他所提供的功能了如指掌,他所提供的一大堆功能,真是覺得很好用,但有時候會發(fā)現(xiàn)php也缺少一些功能,自己總是會產(chǎn)生為php添加一些自定義的功能的想法。久而久之,終于今天憋不住了,開始動手研究如何添加。;下載一個php的源代碼包,這里使用的是php 4.0.5版,解壓后會看到php的根目錄下會有README.EXT_SKEL這樣一個文件,打開詳細閱讀了一下,發(fā)現(xiàn)了一個非常好用的工具,這個工具可以幫你構(gòu)建一個空的php擴展,然后你向里面添加相應(yīng)的代碼就可以完成你自己的功能擴展了。下面我們就來介紹如何使用這個工具。;首先轉(zhuǎn)移你的目錄到php的目錄下的ext目錄,如果你只需要一個基本的擴展框架的話,執(zhí)行下面的命令:./ext_skel --extname=module_namemodule_name是你自己可以選擇的擴展模塊的名字,例如我選擇的my_module。執(zhí)行工具后會自動在ext目錄下建立你選擇的module_name名字的目錄,里面已經(jīng)生成了相關(guān)的代碼,這些代碼中只需要調(diào)整config.m4文件中的三行注釋就可以正常的編譯帶這個自定義擴展模塊的php了。在php的根目錄執(zhí)行下列操作就可以得到。./buildconf./configure --enable-module_namemake;下面我來演示建立my_module擴展框架的全過程,為了更有效果,我們來完成一個php的擴展功能,在php中調(diào)用這個功能可以在web頁面中顯示hello world這個經(jīng)典單詞。在php目錄下的ext目錄中,執(zhí)行下面的命令./ext_skel --extname=my_module得到反饋結(jié)果:Creating directory my_moduleCreating basic files: config.m4 Makefile.in .cvsignore my_module.c php_my_module.h tests/001.phpt my_module.php [done].;To use your new extension, you will have to execute the following steps:1. $ cd ..2. $ vi ext/my_module/config.m43. $ ./buildconf4. $ ./configure --[with|enable]-my_module5. $ make6. $ ./php -f ext/my_module/my_module.php7. $ vi ext/my_module/my_module.c8. $ make;Repeat steps 3-6 until you are satisfied with ext/my_module/config.m4 andstep 6 confirms that your module is compiled into PHP. Then, start writingcode and repeat the last two steps as often as necessary.;如果你能看懂上面的東西,那就照著去做。如果不是太明白的話,按照我下面的提示來做也可以。Cd my_module首先進入my_module目錄vi config.m4使用文本編輯器打開config.m4文件,文件內(nèi)容大致如下:dnl $Id$dnl config.m4 for extension my_modulednl don't forget to call PHP_EXTENSION(my_module);dnl Comments in this file start with the string 'dnl'.dnl Remove where necessary. This file will not workdnl without editing.;dnl If your extension references something external, use with:;dnl PHP_ARG_WITH(my_module, for my_module support,dnl Make sure that the comment is aligned:dnl [ --with-my_module;Include my_module support]);dnl Otherwise use enable:;dnl PHP_ARG_ENABLE(my_module, whether to enable my_module support,dnl Make sure that the comment is aligned:dnl [ --enable-my_module; Enable my_module support]);if test "$PHP_MY_MODULE" != "no"then;dnl If you will not be testing anything external, like existence of;dnl headers, libraries or functions in them, just uncomment the;dnl following line and you are ready to go.;dnl Write more examples of tests here...;PHP_EXTENSION(my_module, $ext_shared)Fi;根據(jù)你自己的選擇將dnl PHP_ARG_WITH(my_module, for my_module support,dnl Make sure that the comment is aligned:dnl [ --with-my_module;Include my_module support])修改成PHP_ARG_WITH(my_module, for my_module support,Make sure that the comment is aligned:[ --with-my_module;Include my_module support])或者將dnl PHP_ARG_ENABLE(my_module, whether to enable my_module support,dnl Make sure that the comment is aligned:dnl [ --enable-my_module; Enable my_module support])修改成PHP_ARG_ENABLE(my_module, whether to enable my_module support,Make sure that the comment is aligned:[ --enable-my_module; Enable my_module support]);一般我會選擇后者,然后保存退出。如果你對vi文本編輯器的操作有困難的話,請參考相應(yīng)的說明文章,這里就不再詳細描述了。Vi my_module.c將文件其中的下列代碼進行修改/* Every user visible function must have an entry in my_module_functions[].*/function_entry my_module_functions[] = {;;;;PHP_FE(say_hello,;;;NULL) /*ß添加著一行代碼*/;;;;PHP_FE(confirm_my_module_compiled,;;NULL) /* For testing, remove later. */;;;;{NULL, NULL, NULL};;/* Must be the last line in my_module_functions[] */};;在文件的最后添加下列代碼PHP_FUNCTION(say_hello){;;;;zend_printf("hello worldn");}保存文件退出;vi php_my_module.h在文件中PHP_FUNCTION(confirm_my_module_compiled);一行前面添加下面的代碼PHP_FUNCTION(say_hello);保存文件退出;退回到php的根目錄下,執(zhí)行下面的命令./buildconf./configure --enable-my_modulemake;如果一切順利的話,我們現(xiàn)在已經(jīng)將擴展模塊my_module編譯到php里面了。我們編寫下面的代碼進行測試<?;;;Say_hello();?>保存文件為say_hello.php在php的根目錄下運行./php –q say_hello.php正常情況下會顯示hello world表示我們的第一個擴展正常的運行了!;解釋一下上面做的操作,ext_skel生成一些框下文件,我們需要修改以下文件my_module.c 擴展模塊的主程序php_my_module.h擴展模塊的頭文件config.m4 配置文件;主程序中描述了php擴展模塊的聲明,模塊中含有多少個函數(shù),各個函數(shù)的作用,在phpinfo函數(shù)中顯示什么內(nèi)容,模塊初始化做些什么,結(jié)束做些什么都會在這個文件里進行描述。我們在上面只是添加了一個函數(shù)say_hello,并且描述了say_hello函數(shù)的具體內(nèi)容,調(diào)用zend_printf系統(tǒng)函數(shù)在php中打印字符串。;在對應(yīng)的頭文件中聲明了say_hello這個函數(shù),從而完成了我們預(yù)期的功能。下面我們會編寫一個更復(fù)雜的擴展,創(chuàng)造一個帶參數(shù)的php擴展函數(shù),根據(jù)給入的參數(shù),顯示hello world, xxxx。Xxxx代表輸入的字符串內(nèi)容,例如我的名字yorgo。;Vi my_module.c修改最后的say_hello函數(shù)內(nèi)容如下:PHP_FUNCTION(say_hello){;;;;zval **yourname;;;;;;if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &yourname) == FAILURE);;;;{;;;;WRONG_PARAM_COUNT;;;;;};;;;;zend_printf("hello world, %sn", Z_STRVAL_PP(yourname));}存盤退出。退回php的根目錄,運行make修改say_hello.php為<?;;;Say_hello(“yorgo);?>保存退出后運行./php –q say_hello.php得出結(jié)果hello world, yorgo表示我們這次的修改也成功了,可以改變say_hello中的參數(shù),看看動態(tài)的效果。這里主要解釋上面修改的函數(shù)內(nèi)容,由于say_hello函數(shù)需要有參數(shù)引入,所以在my_module.c中的say_hello函數(shù)主要在進行參數(shù)的處理,將php中引用say_hello時所填寫的參數(shù)內(nèi)容正確的傳遞到my_module.c中的say_hello處理函數(shù)中。為此,程序中添加了這么幾行。zval **yourname;if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &yourname) == FAILURE){WRONG_PARAM_COUNT;}zend_printf("hello world, %sn", Z_STRVAL_PP(yourname));;代碼解釋如下:zval **yourname;初始化一個參數(shù)的指針ZEND_NUM_ARGS()得到傳遞過來得參數(shù)數(shù)量,并且判斷如果不為1的時候表示有問題,報錯。zend_get_parameters_ex(1, &yourname)將剛剛初始化的指針指向傳遞過來的參數(shù),如果不成功則報錯。Z_STRVAL_PP(yourname)處理指針指向的參數(shù)并獲得實際存儲的值。

標簽: PHP
主站蜘蛛池模板: 合肥白癜风医院_[治疗白癜风]哪家好_合肥北大白癜风医院 | 北京印刷厂_北京印刷_北京印刷公司_北京印刷厂家_北京东爵盛世印刷有限公司 | 活性炭厂家-蜂窝活性炭-粉状/柱状/果壳/椰壳活性炭-大千净化-活性炭 | 智能案卷柜_卷宗柜_钥匙柜_文件流转柜_装备柜_浙江福源智能科技有限公司 | 桁架机器人_桁架机械手_上下料机械手_数控车床机械手-苏州清智科技装备制造有限公司 | 乐泰胶水_loctite_乐泰胶_汉高乐泰授权(中国)总代理-鑫华良供应链 | 自动售货机_无人售货机_专业的自动售货机运营商_免费投放售货机-广州富宏主官网 | 科普仪器菏泽市教育教学仪器总厂| 无缝钢管-聊城无缝钢管-小口径无缝钢管-大口径无缝钢管 - 聊城宽达钢管有限公司 | 上海租车公司_上海包车_奔驰租赁_上海商务租车_上海谐焕租车 | CPSE安博会| 隐形纱窗|防护纱窗|金刚网防盗纱窗|韦柏纱窗|上海青木装潢制品有限公司|纱窗国标起草单位 | 不锈钢钢格栅板_热浸锌钢格板_镀锌钢格栅板_钢格栅盖板-格美瑞 | 宝宝药浴-产后药浴-药浴加盟-艾裕-专注母婴调养泡浴 | 防水接头-电缆防水接头-金属-电缆密封接头-不锈钢电缆接头 | 天空彩票天下彩,天空彩天空彩票免费资料,天空彩票与你同行开奖,天下彩正版资料大全 | 深圳装修_店面装修设计_餐厅设计_装修全包价格-尚泰装饰设计 | 老城街小面官网_正宗重庆小面加盟技术培训_特色面馆加盟|牛肉拉面|招商加盟代理费用多少钱 | 立式矫直机_卧式矫直机-无锡金矫机械制造有限公司 | 橡胶粉碎机_橡胶磨粉机_轮胎粉碎机_轮胎磨粉机-河南鼎聚重工机械制造有限公司 | 深圳美安可自动化设备有限公司,喷码机,定制喷码机,二维码喷码机,深圳喷码机,纸箱喷码机,东莞喷码机 UV喷码机,日期喷码机,鸡蛋喷码机,管芯喷码机,管内壁喷码机,喷码机厂家 | 新车测评网_网罗汽车评测资讯_汽车评测门户报道 | 动力配电箱-不锈钢配电箱-高压开关柜-重庆宇轩机电设备有限公司 聚天冬氨酸,亚氨基二琥珀酸四钠,PASP,IDS - 远联化工 | 气体热式流量计-定量控制流量计(空气流量计厂家)-湖北南控仪表科技有限公司 | 水平筛厂家-三轴椭圆水平振动筛-泥沙震动筛设备_山东奥凯诺矿机 包装设计公司,产品包装设计|包装制作,包装盒定制厂家-汇包装【官方网站】 | 吲哚菁绿衍生物-酶底物法大肠菌群检测试剂-北京和信同通科技发展有限公司 | 安德建奇火花机-阿奇夏米尔慢走丝|高维|发那科-北京杰森柏汇 | 升降炉_真空气氛炉_管式电阻炉厂家-山东中辰电炉有限公司 | 深圳高新投三江工业消防解决方案提供厂家_服务商_园区智慧消防_储能消防解决方案服务商_高新投三江 | 高压直流电源_特种变压器_变压器铁芯-希恩变压器定制厂家 | 齿轮减速机电机一体机_齿轮减速箱加电机一体化-德国BOSERL蜗轮蜗杆减速机电机生产厂家 | 隧道烘箱_隧道烘箱生产厂家-上海冠顶专业生产烘道设备 | 农业四情_农业气象站_田间小型气象站_智慧农业气象站-山东风途物联网 | 广西绿桂涂料--承接隔热涂料、隔音涂料、真石漆、多彩仿石漆等涂料工程双包施工 | 上海防爆真空干燥箱-上海防爆冷库-上海防爆冷柜?-上海浦下防爆设备厂家? | 水平筛厂家-三轴椭圆水平振动筛-泥沙震动筛设备_山东奥凯诺矿机 包装设计公司,产品包装设计|包装制作,包装盒定制厂家-汇包装【官方网站】 | 宿松新闻网 宿松网|宿松在线|宿松门户|安徽宿松(直管县)|宿松新闻综合网站|宿松官方新闻发布 | 奶茶加盟,奶茶加盟店连锁品牌-甜啦啦官网 | ★店家乐|服装销售管理软件|服装店收银系统|内衣店鞋店进销存软件|连锁店管理软件|收银软件手机版|会员管理系统-手机版,云版,App | 光环国际-新三板公司_股票代码:838504 | 色谱柱-淋洗液罐-巴罗克试剂槽-巴氏吸管-5ml样品瓶-SBS液氮冻存管-上海希言科学仪器有限公司 |