能直接在PHP代码中调用hello_world()函数的扩展开发流程是:先用PHP 7.3.1源码中的ext_skel.php生成骨架,修改myext.c输出"Hello from myext!",配置config.m4后执行phpize、./configure、make、sudo make install,最后通过php.ini启用myext.so。

你想从零开始为PHP 7.3写一个能直接在代码里调用的函数,比如hello_world(),但连ext_skel在哪、config.m4怎么改、编译完.so文件放哪都不知道——这篇教程只讲你真正要敲的命令和必须填的路径,不绕弯子。
准备开发环境
先确认你有root权限或sudo权限,没有就别往下试了,后面所有步骤都会卡在权限拒绝上。
在CentOS 7或Ubuntu 20.04系统中执行:
安装基础编译工具:yum groupinstall "Development Tools"(CentOS)或apt install build-essential autoconf bison re2c libxml2-dev libcurl4-openssl-dev libssl-dev zlib1g-dev(Ubuntu)。
下载PHP 7.3.1源码包并解压到/work/src/php-7.3.1,进入该目录后运行:./buildconf --force。这一步生成configure脚本,缺了它后面全报错。
立即学习“PHP免费学习笔记(深入)”;
【关键前提】必须用PHP源码目录里的ext_skel.php生成骨架,不能用系统自带的或网上随便下的版本——不同PHP小版本对应的ext_skel结构不兼容,强行混用会导致make时大量Zend API未定义错误。
创建扩展骨架
执行命令:php -f ext/ext_skel.php -- --extname=myext。注意双横线--不能少,否则参数会被php解释器吞掉。
这条命令会在ext/myext/下生成5个基础文件:config.m4、php_myext.h、myext.c、myext.php和CREDITS。其中myext.c是唯一需要你手动编辑的主逻辑文件。
打开myext.c,找到PHP_FUNCTION(confirm_myext_compiled)函数,把里面RETURN_TRUE;改成php_printf("Hello from myext!");,保存退出。这是你第一个能被PHP脚本调用的C函数。
配置与编译
第一步:修改config.m4,删掉开头三行注释符号dnl,让PHP_NEW_EXTENSION这行生效。否则phpize会跳过这个扩展,编译时直接提示“no extension found”。
第二步:进入myext目录,依次执行:phpize → ./configure → make。
第三步:执行make install,终端会输出类似Installing shared extensions: /usr/lib/php/20180731/的路径——记牢这个路径,后面启用扩展全靠它。
如果make install报错说“Permission denied”,说明你没用sudo。这时候不要加sudo重跑整个流程,只需sudo make install即可,前面的phpize和make不用重复。
启用并测试扩展
方法一:临时启用(仅当前命令生效)
运行php -d extension=/usr/lib/php/20180731/myext.so -r "hello_world();"。如果终端输出Hello from myext!,说明编译和加载都成功了。
方法二:永久启用
找到你的php.ini位置:php --ini | grep "Loaded Configuration File",然后在该文件末尾添加一行:extension=myext.so。注意这里写的是文件名,不是完整路径。
【易错点】如果PHP版本是7.3,扩展目录名一定是20180731,不是20180732或73——这个数字是PHP ABI版本号,硬编码在源码里,改错一个数字就加载失败。
最后重启PHP服务或Web服务器,再执行php -m | grep myext,看到myext出现在列表里,就完成了。



















