宿迁腾云网络网站建设公司

腾云网络 八年经验专注网站建设
  • 首页
  • 服务项目
    • 网站建设
    • 微信小程序
    • APP开发
    • SEO优化
  • 建站费用
  • 成功案例
    • 网站建设案例
    • 小程序案例
    • APP开发案例
    • SEO优化案例
  • 行业动态
    • 网站建设
    • SEO优化
    • 技术日志
  • 联系我们
    • 关于我们
首页 > 行业动态 > 技术日志 > 如何开发PHP扩展离我们并不远?|?

如何开发PHP扩展离我们并不远?|?

2021-10-21

原站地址:%E6%89%A9%E5%B1%95%E5%BC%80%E5%8F%91%E5%8F%8A%E5%85%A5%E9%97%A8%E8%A7 %A3%E6%83%91/

说在最前线

作为一个PHP程序员,如果不了解PHP内核和PHP扩展开发,那似乎是一件很“丢人”的事情,嗯,真的很“丢人”!虽然接触PHP已经三年多了,但一直没有机会,也没有主动学习过,所以更觉得“丢脸”。这种情况下,如果面试官问你有没有因为长期接触PHP而学习了PHP的底层知识,如果你理解了php 扩展开发,你会更“丢脸”。所以,废话不多说,是时候进行 PHP 扩展了。

什么是 PHP 扩展?

大家在日常的开发过程中或多或少都接触过PHP扩展,比如可以查看的vld扩展,比如性能分析工具,而我们经常使用的PDO其实就是作为扩展运行在PHP中的(只是PDO已经默认编译进了PHP源代码中,所以我们不需要单独安装),所以PHP扩展离我们不远了。

为什么要开发 PHP 扩展?

基础知识

准备好工作了

操作系统:.5(只要是)

PHP版本:PHP5.6.9(最好在PHP5.3之后,PHP7之前,毕竟PHP7对内核做了很多改动)

注:我这里的php环境是lnmp一键安装包搭建的,lnmp一键安装的入口在这里

如何开发PHP扩展离我们并不远?|?(图1)

第一个扩展名为

不要担心这里的概念,让我们快速浏览一下,了解扩展通常是如何播放的。

1. 通过PHP提供的工具生成扩展的骨架,--扩展名在右边

~/software/lnmp1.2-full/src/php-5.6.9/ext  ᐅ pwd
/root/software/lnmp1.2-full/src/php-5.6.9/ext
~/software/lnmp1.2-full/src/php-5.6.9/ext  ᐅ ./ext_skel --extname=myfirstext
Creating directory myfirstext
Creating basic files: config.m4 config.w32 .gitignore myfirstext.c php_myfirstext.h CREDITS EXPERIMENTAL tests/001.phpt myfirstext.php [done].
To use your new extension, you will have to execute the following steps:
1.  $ cd ..
2.  $ vi ext/myfirstext/config.m4
3.  $ ./buildconf
4.  $ ./configure --[with|enable]-myfirstext
5.  $ make
6.  $ ./sapi/cli/php -f ext/myfirstext/myfirstext.php
7.  $ vi ext/myfirstext/myfirstext.c
8.  $ make
Repeat steps 3-6 until you are satisfied with ext/myfirstext/config.m4 and
step 6 confirms that your module is compiled into PHP. Then, start writing
code and repeat the last two steps as often as necessary.

2. 进入目录,修改.m4文件,删除下面代码前面的dnl,我知道你不想知道这个dnl是干什么的,但是我还是想说这个dnl是只是一个评论,编辑它,退出!

dnl PHP_ARG_ENABLE(myfirstext, whether to enable myfirstext support,
dnl Make sure that the comment is aligned:
dnl [  --enable-myfirstext           Enable myfirstext support])

这时候可以执行ls看看一般都有哪些文件。让我先告诉你。比较重要的是.c、.h和.php,最重要的是.c,文件夹也是,以后我们的测试脚本都会写在这里。

~/software/lnmp1.2-full/src/php-5.6.9/ext/myfirstext  ᐅ ls
config.m4   CREDITS       myfirstext.c    php_myfirstext.h
config.w32  EXPERIMENTAL  myfirstext.php  tests

3.登场,会根据我们的.m4配置生成一些编译好的文件(比如etc)。

注:由于我这里是为php5.6.9开发扩展,所以尽量使用php5.6.9源码,如果你用我的PHP版本是不同,那么你可以在你的PHP源码包中找到该命令并执行它。

~/software/lnmp1.2-full/src/php-5.6.9/ext/myfirstext  ᐅ ../../scripts/phpize 
Configuring for:
PHP Api Version:         20131106
Zend Module Api No:      20131226
Zend Extension Api No:   220131226
~/software/lnmp1.2-full/src/php-5.6.9/ext/myfirstext  ᐅ ls
acinclude.m4    config.guess  configure     EXPERIMENTAL     missing         php_myfirstext.h
aclocal.m4      config.h.in   configure.in  install-sh       mkinstalldirs   run-tests.php
autom4te.cache  config.m4     config.w32    ltmain.sh        myfirstext.c    tests
build           config.sub    CREDITS       Makefile.global  myfirstext.php

执行后,发现了很多文件。

4.编译安装三连发

~/software/lnmp1.2-full/src/php-5.6.9/ext/myfirstext  ᐅ ./configure
~/software/lnmp1.2-full/src/php-5.6.9/ext/myfirstext  ᐅ make
~/software/lnmp1.2-full/src/php-5.6.9/ext/myfirstext  ᐅ make install
Installing shared extensions:     /usr/lib64/php/modules/

注意:如果编译安装顺利,则忽略这个

./报告re2c错误:执行yum -y re2c

使错误(/root//.2-full/src/php-5.6.9/ext//.c:146:错误:``未声明(不在功能中)):打开。 c、删除第146行,替换为{NULL, NULL, NULL}。

5.恭喜你,你的第一个扩展开发成功了,就是名字不太好听,现在我们验证一下我们的扩展是否可用

在 CLI 模式下找到你的 php.ini(执行命令 php -i | grep php.ini 找到它,添加一行

extension=myfirstext.so

如何开发PHP扩展离我们并不远?|?(图2)

重启php,我这里重启php-fpm。执行命令看到如下,证明你的第一个扩展可以正常工作了!可以看出我们通过扩展创建了一个新的PHP函数()。

~/software/lnmp1.2-full/src/php-5.6.9/ext/myfirstext  ᐅ php -r 'echo confirm_myfirstext_compiled("Hello World!");' 
Congratulations! You have successfully modified ext/myfirstext/config.m4. Module Hello World! is now compiled into PHP.

问题来了?

好了,既然来到了这里,我想你的第一个 PHP 扩展也已经开发出来了。在上面的例子中,我们新建了一个PHP内置函数(),并通过它实现了一个简单的函数。是不是有点不上瘾?不知道你是不是太沉迷了,我相当沉迷,但是我对我刚刚开发的第一个扩展仍然有很多疑问。下面我们将逐步解读这些我们都有的疑问。

扩展文件夹中的文件是做什么用的?

在这里,我们将只关注少数文件,因为大多数文件都是由该工具自动生成的。在这里,我将对这些文件进行分类。

代码文件:

。H

。C

至于为什么会有.h文件,我想你知道。

如何开发PHP扩展离我们并不远?|?(图3)

扩展配置文件:

.m4: *在 nix 下使用

.w32:用于

我现在将跳过其他文件,因为我不知道。

最重要的 .c 文件在哪里重要?

首先我们把.c文件分块,这样更直观(因为里面满是注释,这里没有列出注释部分)

/**
 * 头文件部分
 */
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include "php.h"
#include "php_ini.h"
#include "ext/standard/info.h"
#include "php_myfirstext.h"
static int le_myfirstext;
/**
 * 自定义函数部分,看到该函数的参数还熟吗?这里就是我们上面自定义函数的实现部分!
 */
PHP_FUNCTION(confirm_myfirstext_compiled)
{
    char *arg = NULL;
    int arg_len, len;
    char *strg;
    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &arg, &arg_len) == FAILURE) {
        return;
    }
    len = spprintf(&strg, 0, "Congratulations! You have successfully modified ext/%.78s/config.m4. Module %.78s is now        compiled into PHP.", "myfirstext", arg);
    RETURN_STRINGL(strg, len, 0);
}
/**
 * Module初始化和Shutdown部分
 */
PHP_MINIT_FUNCTION(myfirstext)
{   
    return SUCCESS;
}
PHP_MSHUTDOWN_FUNCTION(myfirstext)
{   
    return SUCCESS;
}
/**
 * Request初始化和shutdown部分
 */
PHP_RINIT_FUNCTION(myfirstext)
{
    return SUCCESS;
}
PHP_RSHUTDOWN_FUNCTION(myfirstext)
{   
    return SUCCESS;
}
/**
 * Module Info部分,这里主要控制将扩展信息打印到phpinfo()中
 */
PHP_MINFO_FUNCTION(myfirstext)
{
    php_info_print_table_start();
    php_info_print_table_header(2, "myfirstext support", "enabled");
    php_info_print_table_end();
    /* Remove comments if you have entries in php.ini
    DISPLAY_INI_ENTRIES();
    */
}
/**
 * function_entry部分,这里主要对我们前面自定义的confirm_myfirstext_compiled函数做一个封装
 */
const zend_function_entry myfirstext_functions[] = {
    PHP_FE(confirm_myfirstext_compiled, NULL)       /* For testing, remove later. */
    {NULL, NULL, NULL}
        /* Must be the last line in myfirstext_functions[] */
};
/**
 * module_entry部分,这里应该算是整个文件最重要的部分了吧,属于我们扩展的CPU,这里将会告诉PHP如何初始化我们的扩展。
 */
zend_module_entry myfirstext_module_entry = {
    STANDARD_MODULE_HEADER,
    "myfirstext",
    myfirstext_functions,
    PHP_MINIT(myfirstext),
    PHP_MSHUTDOWN(myfirstext),
    PHP_RINIT(myfirstext),      /* Replace with NULL if there's nothing to do at request start */
    PHP_RSHUTDOWN(myfirstext),  /* Replace with NULL if there's nothing to do at request end */
    PHP_MINFO(myfirstext),
    PHP_MYFIRSTEXT_VERSION,
    STANDARD_MODULE_PROPERTIES
};
#ifdef COMPILE_DL_MYFIRSTEXT
ZEND_GET_MODULE(myfirstext)
#endif

所以,.c中最重要、最基本的代码段是这样的。

让我们创建一个新函数,称为 ()

只需要两步就可以实现我们想要的功能。

如何开发PHP扩展离我们并不远?|?(图4)

1.添加函数定义

......
PHP_FUNCTION(confirm_myfirstext_compiled)
{
    char *arg = NULL;
    int arg_len, len;
    char *strg;
    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &arg, &arg_len) == FAILURE) {
        return;
    }
    len = spprintf(&strg, 0, "Congratulations! You have successfully modified ext/%.78s/config.m4. Module %.78s is now        compiled into PHP.", "myfirstext", arg);
    RETURN_STRINGL(strg, len, 0);
}
PHP_FUNCTION(hello_world)
{   
    php_printf("hello world!");
}
......

2.添加功能

const zend_function_entry myfirstext_functions[] = {
    PHP_FE(confirm_myfirstext_compiled, NULL)       /* For testing, remove later. */
    PHP_FE(hello_world, NULL)
    {NULL, NULL, NULL}
        /* Must be the last line in myfirstext_functions[] */
};
c
好,再一次编译安装三连发,重启PHP
```bash
~/software/lnmp1.2-full/src/php-5.6.9/ext/myfirstext  ᐅ make install
Installing shared extensions:     /usr/lib64/php/modules/
~/software/lnmp1.2-full/src/php-5.6.9/ext/myfirstext  ᐅ service php-fpm restart
Gracefully shutting down php-fpm . done
Starting php-fpm  done
~/software/lnmp1.2-full/src/php-5.6.9/ext/myfirstext  ᐅ php -r "hello_world();"
hello world!

当然,我们直接通过上面PHP官方提供的工具创建了扩展骨架,其实我们也可以手动创建。

手工制作这里就不赘述了,大家可以直接跳到学习walu大神的开源项目walu/,在这里系统学习。这几天一直在研究这个教程,也有幸得到了瓦鲁大神的帮助。

那么php 扩展开发,我该如何阅读本教程?我会在这里做一个小分享

首先,请打开目录。您会发现目前总共有 20 章。这些天我已经学习了前13章和18章。保证的是所有的例子都可以验证。不仅有利于开发方法的扩展和PHP内核知识的增长,所以推荐墙!

如果觉得看walu大神的教程有点难,可以看我的博客PHP扩展开发相关内核

这个其实是我在学习过程中整理出来的,不保证对你有用。

如果你想得到原版,你可以点击这里/

Tag: php php环境搭建 编程语言
网站制作公众号

宿迁腾云网络网站建设公司 | 网站开发 | 网站制作 | 网站优化

咨询电话:13160355545

上一篇

返回栏目

下一篇

免责声明:本站所有文章和图片均来自用户分享和网络收集,文章和图片版权归原作者及原出处所有,仅供学习与参考,请勿用于商业用途,如果损害了您的权利,请联系网站客服处理。

热推

  • 本文实例讲述了PHP保存到服务器的方法(图)
  • 网上商城自定义布局开发php腾云网络:小程序分销系统开发多少钱用php开发简单的商城
  • 1.遵守PHP核心代码的命名规则,你知道吗?
  • php网站开发框架RedHat红帽云开发人员php框架开发视频教程
  • php 分享到微信代码PHP初级开发工程师1.比较全面的学习流程,你知道吗? 分享到微信朋友圈 代码
  • php 架构 推荐,为快速开发API设计的特色框架/-
  • 关于该软件,我截取了了一段维基百科中的介绍。
  • php开发web应用一门语言是最基础的到底学什么语言最好呢?php web开发入门到精通
  • 在PHP中位运算的实际项目当中高级运用操作
  • php 统计访问量代码“四川人口普查”微信小程序正式上线(图)网站访问人数统计代码

相关

了解常见PHP应用程序安全威胁,掌握6个常见安全性攻击

了解常见PHP应用程序安全威胁,掌握6个常见安全性攻击

如何查看php版本?多种方法助你快速知晓

如何查看php版本?多种方法助你快速知晓

PHP格式化:提升代码质量与协作效率的关键规则

如何查看虚拟主机上的 PHP 版本?这篇文章告诉你

Linux 系统管理员和 web 开发者必知:如何查看 PH

Linux 系统管理员和 web 开发者必知:如何查看 PH

免费开源的轻量级 PHP 开发框架 ThinkPHP,遵循

从零开始开发完整网站:前端、后端与 Web 服务器的关键技术

php框架 Java 与 PHP 之争:为何懂技术的大佬选

BitDefender 发布超级工厂病毒专杀工具,可清除所有

asp语言与php语言的区别 前端和后端的区别,你真的了解吗

标签

seo(1182) 市场营销(661) 网站制作(573) 网站建设(564) 搜索引擎(553) 网站(482) PHP(361) 编程语言(345) 建站(294) 关键词排名优化(267) 网站建设公司(245) 优化(216) seo排名(207) 域名(190) 软件(171) 网站优化(148) 搜索引擎优化(146) 外链(141) 科技(136) 网站关键词(124) 网站排名优化(123) 域名服务器(120) 网站排名(107) 时政(103) 排名优化(95) 搜索引擎收录(93) 网站设计(92) 电子商务(88) 引擎(86) 移动互联网(85) 开发框架(79) 开发(75) 网站服务器(74) 框架(68) 前端开发(68) 网站分析(66) 网站建设方案(65) 关键(64) 流量(63) 源码(62) 百度优化(62) 网站权重(61) 开放源代码(59) seo培训(53) 网页设计(51) 百度(51) php框架(50) 网站建设知识(50) 大数据(50) 谷歌(49)
宿迁腾云网络网站建设公司
网站建设
  • 私人定制
  • 标准模板建站
  • 经济模板建站
精品模板

宿迁腾云网络网站建设公司

联系电话:13160355545

公司地址:江苏省宿迁市丽景湾华庭北门都市花园公寓9楼907

联系邮箱:admin@tyweb.net

全国分站
  • 北京
  • 广东
  • 东莞 广州 中山 深圳 惠州 江门 珠海 汕头 佛山 湛江 河源 肇庆 潮州 清远 韶关 揭阳 阳江 云浮 茂名 梅州 汕尾
  • 山东
  • 济南 青岛 临沂 济宁 菏泽 烟台 泰安 淄博 潍坊 日照 威海 滨州 东营 聊城 德州 莱芜 枣庄
  • 江苏
  • 苏州 徐州 盐城 无锡 南京 南通 连云港 常州 扬州 镇江 淮安 泰州 宿迁
  • 河南
  • 郑州 南阳 新乡 安阳 洛阳 信阳 平顶山 周口 商丘 开封 焦作 驻马店 濮阳 三门峡 漯河 许昌 鹤壁 济源
  • 上海
  • 河北
  • 石家庄 唐山 保定 邯郸 邢台 沧州 秦皇岛 张家口 衡水 廊坊 承德
  • 浙江
  • 温州 宁波 杭州 台州 嘉兴 金华 湖州 绍兴 舟山 丽水 衢州
  • 陕西
  • 西安 咸阳 宝鸡 汉中 渭南 安康 榆林 商洛 延安 铜川
  • 湖南
  • 长沙 邵阳 常德 衡阳 株洲 湘潭 永州 岳阳 怀化 郴州 娄底 益阳 张家界 湘西
  • 重庆
  • 福建
  • 漳州 泉州 厦门 福州 莆田 宁德 三明 南平 龙岩
  • 天津
  • 云南
  • 昆明 红河 大理 文山 德宏 曲靖 昭通 楚雄 保山 玉溪 丽江 临沧 思茅 西双版纳 怒江 迪庆
  • 四川
  • 成都 绵阳 广元 达州 南充 德阳 广安 阿坝 巴中 遂宁 内江 凉山 攀枝花 乐山 自贡 泸州 雅安 宜宾 资阳 眉山 甘孜
  • 广西
  • 贵港 玉林 北海 南宁 柳州 桂林 梧州 钦州 来宾 河池 百色 贺州 崇左 防城港
  • 安徽
  • 芜湖 合肥 六安 宿州 阜阳 安庆 马鞍山 蚌埠 淮北 淮南 宣城 黄山 铜陵 亳州 池州 巢湖 滁州
  • 海南
  • 三亚 海口 琼海 文昌 东方
  • 江西
  • 南昌 赣州 上饶 吉安 九江 新余 抚州 宜春 景德镇 萍乡 鹰潭
  • 湖北
  • 武汉 宜昌 襄樊 荆州 恩施 孝感 黄冈 十堰 咸宁 黄石 仙桃 随州 天门 荆门 潜江 鄂州 神农架
  • 山西
  • 太原 大同 运城 长治 晋城 忻州 临汾 吕梁 晋中 阳泉 朔州
  • 辽宁
  • 大连 沈阳 丹东 辽阳 葫芦岛 锦州 朝阳 营口 鞍山 抚顺 阜新 本溪 盘锦 铁岭
  • 黑龙江
  • 齐齐哈尔 哈尔滨 大庆 佳木斯 双鸭山 牡丹江 鸡西 黑河 绥化 鹤岗 伊春 大兴安岭 七台河
  • 内蒙古
  • 赤峰 包头 通辽 呼和浩特 乌海 鄂尔多斯 呼伦贝尔
  • 贵州
  • 贵阳 黔东 黔南 遵义 黔西 毕节 铜仁 安顺 六盘水
  • 甘肃
  • 兰州 天水 庆阳 武威 酒泉 张掖 陇南 白银 定西 平凉 嘉峪关 临夏 金昌 甘南
  • 青海
  • 西宁 海西 海东 海北 果洛 玉树 黄南
  • 新疆
  • 乌鲁木齐 伊犁 昌吉 石河子 哈密
  • 西藏
  • 拉萨 山南 林芝 日喀则
  • 吉林
  • 长春 白山 白城 延边 松原 辽源 通化 四平
  • 宁夏
  • 银川 吴忠 中卫 石嘴山 固原
SiteMap
网站地图
TAG标签
Copyright © 2017-2025 TYWEB.NET 宿迁腾云网络科技有限公司 ALL RIGHTS RESERVED.   苏ICP备17033535号-1

热门搜索

百度 下载 2025 2024 2026 货源 货货源 虚拟 禅道 报名 金蝶KIS旗舰版
  • 客服

    在线客服

  • 电话

    13160355545

  • 微信

精品模板
建站费用
成功案例
联系我们