PHP7扩展开发教程之Hello World实现方法示例
发布时间 - 2026-01-11 02:37:56 点击率:次本文实例讲述了PHP7扩展开发教程之Hello World实现方法。分享给大家供大家参考,具体如下:

一、下载PHP源代码
要开发PHP扩展,需要先下载PHP的源代码,一方面是因为我们的扩展一般会用到PHP自身定义的函数和宏,另一方面我们可以利用官方提供的工具减少工作量。
我下载了PHP-7.0.2,地址是:http://cn2.php.net/get/php-7.0.2.tar.gz。
解压源码压缩包, tar xzf php-7.0.2.tar.gz,我们现在只需要关注Zend和ext这两个目录。
Zend目录里面包含了PHP的Zend Engine源代码,有些函数和宏的定义我们需要在这里面简单地看一下。
ext目录里面包含了PHP原生的扩展,以及我们开发自己的扩展时可以利用的工具,Linux下使用ext_skel,Windows下使用ext_skel_win32.php
二、使用ext_skel工具
我们可以在ext目录下看到所有的PHP原生扩展,其中包括了熟悉的curl,json,mbstring,simplexml,sockets等扩展,还有很多没有用过甚至没有听说过的扩展,不用在意这些,我们先打开我们最熟悉的curl来看看,有config.m4配置文件,有php_curl.h,curl_file.c等源代码,还有一些中间文件,最后还有一个tests目录,里面放的curl扩展的单元测试。重点关注config.m4,php_curl.h,curl_file.c即可,最简单的场景下这三个文件就是一个扩展的全部组成部分了。
打开随便看一下,不算太复杂,但是自己写一个类似的还是挺头疼的,这时就需要用到我前面提到的ext_skel工具了。这个工具也在ext目录下,我们执行一下,./ext_skel --help,可以看到若干参数,我们用到的只有--extname=module,这里填上自己开发的扩展名称。想深入了解各个参数的作用可以看这里:http://php.net/manual/en/internals2.buildsys.skeleton.php
./ext_skel --extname=hello
ext目录下多了一个hello目录,我们后续的工作都在这个目录下面,工具已经为我们自动生成了一些文件。
config.m4配置文件
开发PHP扩展,在写C代码之前,要先配置一下这里。我们打开可以看到详细的注释说明,dnl是注释语法。
如果你的扩展用到了外部依赖,就配置--with-hello选项,否则配置--enable-hello选项,删除这下面3行的del注释
PHP_ARG_ENABLE(hello, whether to enable hello support, Make sure that the comment is aligned: [ --enable-hello Enable hello support])
PHP_ARG_WITH和PHP_ARG_ENABLE这两个宏用来配置configure选项,一个配置需要外部依赖的,另一个配置不需要外部依赖的
配置好的内容,在后面执行configure --help时可以看到。
php_hello.h头文件
类似于C语音的头文件,包含了一些自定义的结构和函数声明,在这个demo中暂时不需要改动
hello.c代码文件
真正的逻辑代码都在这个文件中,后面会详细介绍。
三、编写代码
好了,到这一步我们终于要开始写代码了,打开hello.c文件。
整个扩展的入口是zend_module_entry这个结构,具体的定义可以在Zend目录下的zend_modules.h文件中看到,一共有十几个属性,快速跳过,我们暂时只需要"hello world"。
zend_module_entry hello_module_entry = {
STANDARD_MODULE_HEADER,
"hello",
hello_functions,
PHP_MINIT(hello),
PHP_MSHUTDOWN(hello),
PHP_RINIT(hello), /* Replace with NULL if there's nothing to do at request start */
PHP_RSHUTDOWN(hello), /* Replace with NULL if there's nothing to do at request end */
PHP_MINFO(hello),
PHP_HELLO_VERSION,
STANDARD_MODULE_PROPERTIES
};
STANDARD_MODULE_HEADER帮我们实现了前面6个属性
"hello"是扩展的名字
hello_functions是扩展包含的全部方法的集合
后面5个宏分别代表5个扩展特定方法
PHP_HELLO_VERSION是扩展的版本号,定义在头文件中
STANDARD_MODULE_PROPERTIES帮我们实现了剩下的属性
暂时都不需要修改,知道这是一个入口就行。顺着这个入口,我们继续看怎么给扩展添加方法,在hello_functions[]方法数组中已经有了一个示例方法confirm_hello_compiled,我们参考它写我们的方法hello_world
const zend_function_entry hello_functions[] = {
PHP_FE(confirm_hello_compiled, NULL) /* For testing, remove later. */
PHP_FE(hello_world, NULL)
PHP_FE_END /* Must be the last line in hello_functions[] */
};
先在扩展的方法数组中添加上hello_world,然后再定义hello_world。找到confirm_hello_compiled方法定义的地方,在它下面依葫芦画瓢,php_printf是Zend Engine中的printf方法。
PHP_FUNCTION(hello_world)
{
php_printf("Hello World!\n");
RETURN_TRUE;
}
四、编译安装
最后就是编译安装我们的扩展了,安装过PHP扩展的同学不用看,没有经验的可以参考一下。
phpize
./configure make make install
现在PHP的扩展目录中已经有了hello.so这个文件,在php.ini中添加上扩展的配置
extension = hello.so
五、测试
写一个test.php方法,执行脚本就可以看到"Hello World!"
<?php hello_world();
更多关于PHP相关内容感兴趣的读者可查看本站专题:《PHP扩展开发教程》、《php面向对象程序设计入门教程》、《php+mysql数据库操作入门教程》、《PHP网络编程技巧总结》及《php常见数据库操作技巧汇总》
希望本文所述对大家PHP程序设计有所帮助。
# PHP7
# 扩展
# 开发
# Hello
# World
# PHP扩展开发教程(总结)
# PHP扩展开发入门教程
# PHP内核介绍及扩展开发指南—基础知识
# 初步介绍PHP扩展开发经验分享
# PHP7扩展开发之基于函数方式使用lib库的方法详解
# PHP7扩展开发之hello word实现方法详解
# 快速开发一个PHP扩展图文教程
# 详解Window7 下开发php扩展
# 一个简单php扩展介绍与开发教程
# 关于尝试开发PHP的MYSQL扩展的使用
# windows下开发并编译PHP扩展的方法
# php扩展开发入门demo示例
# 源代码
# 可以看到
# 目录下
# 都在
# 不需要
# 这两个
# 头文件
# 只需要
# 看一下
# 已经有了
# 包含了
# 可以利用
# 程序设计
# 配置文件
# 自己的
# 组中
# 实现了
# 依葫芦画瓢
# 是因为
# 好了
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
WordPress 子目录安装中正确处理脚本路径的完整指南
企业网站制作这些问题要关注
Midjourney怎样加参数调细节_Midjourney参数调整技巧【指南】
Midjourney怎么调整光影效果_Midjourney光影调整方法【指南】
如何获取PHP WAP自助建站系统源码?
Python自动化办公教程_ExcelWordPDF批量处理案例
JavaScript如何实现继承_有哪些常用方法
大学网站设计制作软件有哪些,如何将网站制作成自己app?
Laravel如何使用Blade模板引擎?(完整语法和示例)
Laravel如何实现数据库事务?(DB Facade示例)
网站制作大概要多少钱一个,做一个平台网站大概多少钱?
制作公司内部网站有哪些,内网如何建网站?
Laravel辅助函数有哪些_Laravel Helpers常用助手函数大全
如何在万网开始建站?分步指南解析
laravel怎么实现图片的压缩和裁剪_laravel图片压缩与裁剪方法
Laravel如何生成和使用数据填充?(Seeder和Factory示例)
如何有效防御Web建站篡改攻击?
Laravel的路由模型绑定怎么用_Laravel Route Model Binding简化控制器逻辑
Laravel怎么为数据库表字段添加索引以优化查询
中山网站制作网页,中山新生登记系统登记流程?
Laravel如何实现API版本控制_Laravel版本化API设计方案
轻松掌握MySQL函数中的last_insert_id()
百度浏览器ai对话怎么关 百度浏览器ai聊天窗口隐藏
齐河建站公司:营销型网站建设与SEO优化双核驱动策略
JavaScript如何实现路由_前端路由原理是什么
如何生成腾讯云建站专用兑换码?
Laravel如何实现模型的全局作用域?(Global Scope示例)
javascript中的数组方法有哪些_如何利用数组方法简化数据处理
湖南网站制作公司,湖南上善若水科技有限公司做什么的?
Laravel怎么实现观察者模式Observer_Laravel模型事件监听与解耦开发【指南】
如何用搬瓦工VPS快速搭建个人网站?
PHP怎么接收前端传的文件路径_处理文件路径参数接收方法【汇总】
Laravel如何安装Breeze扩展包_Laravel用户注册登录功能快速实现【流程】
html文件怎么打开证书错误_https协议的html打开提示不安全【指南】
HTML透明颜色代码在Angular里怎么设置_Angular透明颜色使用指南【详解】
千问怎样用提示词获取健康建议_千问健康类提示词注意事项【指南】
php json中文编码为null的解决办法
Laravel怎么自定义错误页面_Laravel修改404和500页面模板
大连 网站制作,大连天途有线官网?
如何在搬瓦工VPS快速搭建网站?
网站制作价目表怎么做,珍爱网婚介费用多少?
绝密ChatGPT指令:手把手教你生成HR无法拒绝的求职信
网站建设整体流程解析,建站其实很容易!
家族网站制作贴纸教程视频,用豆子做粘帖画怎么制作?
JS去除重复并统计数量的实现方法
香港网站服务器数量如何影响SEO优化效果?
Linux系统运维自动化项目教程_Ansible批量管理实战
Laravel Facade的原理是什么_深入理解Laravel门面及其工作机制
如何用花生壳三步快速搭建专属网站?
Laravel如何使用.env文件管理环境变量?(最佳实践)

