在php 7.4中开发自定义c扩展需先安装development tools和php74-devel(或php7.4-dev),运行phpize生成构建脚本,./configure配置时确保php头文件路径正确,myext.c中必须包含config.h、正确注册常量与函数,make编译后sudo make install部署so文件,再通过ini启用并重启php-fpm验证加载与功能。

你需要在PHP 7.4环境中开发一个自定义底层扩展,比如实现一个高效字符串哈希函数或对接特定硬件驱动,但官方扩展无法满足需求,必须从C语言层动手编写并编译进PHP运行时。
准备开发环境与基础工具链
执行 yum groupinstall 'Development Tools' 安装GCC、make等核心编译工具。
安装PHP 7.4开发头文件:运行 yum install php74-devel(CentOS/RHEL)或 apt install php7.4-dev(Ubuntu/Debian),【缺少此包会导致phpize报错“Cannot find autoconf”或configure阶段找不到php.h】。
确认phpize可用:执行 phpize --version,输出应含 7.4.x 字样;若提示命令未找到,说明php74-devel未正确安装或PATH未包含 /usr/bin。
生成扩展骨架并初始化结构
创建项目目录并进入:mkdir ~/myext && cd ~/myext。
运行 phpize 生成构建脚本,这一步会读取当前系统PHP配置,生成 configure 文件及必要模板。
执行 ./configure --enable-myext(其中 myext 替换为你实际的扩展名),该命令将检测PHP API兼容性并生成 Makefile;若提示 error: Cannot find PHP headers,说明上一步的php74-devel未生效,需重新检查安装或指定路径:./configure --enable-myext --with-php-config=/usr/bin/php-config。
编写核心逻辑代码
编辑 myext.c 文件,填入标准扩展入口结构:
第一行必须是 #ifdef HAVE_CONFIG_H 包裹的 #include "config.h",否则编译时会因宏未定义而跳过函数注册;
在 PHP_MINIT_FUNCTION(myext) 中调用 REGISTER_STRING_CONSTANT("MYEXT_VERSION", "1.0.0", CONST_CS | CONST_PERSISTENT),这是唯一能确保常量在所有SAPI中全局可见的方式;
实现一个导出函数,例如 PHP_FUNCTION(myext_hash),内部必须调用 ZEND_PARSE_PARAMETERS_NONE() 或 ZEND_PARSE_PARAMETERS_START(1, 1) 解析参数,否则PHP 7.4的ZPP(Zend Parse Parameters)机制会直接拒绝调用并返回NULL。
编译并安装扩展模块
执行 make 编译源码,输出目标文件 modules/myext.so;
执行 sudo make install 将so文件复制到PHP扩展目录(通常是 /usr/lib64/php/modules/ 或 /usr/local/lib/php/extensions/no-debug-non-zts-20190902/),【注意:该命令会覆盖同名文件且无备份,请确认扩展名唯一】;
查看安装结果:ls -l /usr/lib64/php/modules/myext.so,确认文件存在且权限为644。
启用扩展并验证加载
方法一:编辑 /etc/php.d/myext.ini(或 /usr/local/php/etc/php.d/myext.ini),写入一行 extension=myext.so;
方法二:直接在主 php.ini 中追加 extension=/usr/lib64/php/modules/myext.so(绝对路径可避免查找失败);
重启PHP-FPM服务:sudo systemctl restart php-fpm 或 sudo service php-fpm restart;
运行 php -m | grep myext,有输出即表示扩展已成功加载;
执行 php -r "echo MYEXT_VERSION;",若打印 1.0.0 说明常量注册成功,扩展逻辑已就绪。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











