编写一个 PHP 扩展是一个相对复杂的任务,需要对 C 语言有一定的了解,并且熟悉 PHP 的内部工作机制。以下是一个简单的步骤指南,帮助你用 C 语言编写一个基本的 PHP 扩展。我们将创建一个简单的扩展,提供一个函数来返回两个整数的和。
环境准备
-
安装开发工具:确保你的系统上安装了 GCC 或其他 C 编译器,以及 PHP 的开发包(通常包括
phpize
工具)。 -
获取 PHP 源代码:虽然不是必须的,但了解 PHP 的源码结构有助于调试和开发。
编写扩展
-
创建扩展目录:
mkdir my_extension cd my_extension
-
创建
config.m4
文件:
这个文件用于配置扩展的编译选项。PHP_ARG_ENABLE(my_extension, whether to enable my_extension support, [ --enable-my_extension Enable my_extension support]) if test "$PHP_MY_EXTENSION" != "no"; then PHP_NEW_EXTENSION(my_extension, my_extension.c, $ext_shared) fi
-
编写 C 代码:
创建my_extension.c
文件,并实现你的功能。#ifdef HAVE_CONFIG_H <h1>include "config.h"</h1> <h1>endif</h1> <h1>include "php.h"</h1> // 声明导出的函数 PHP_FUNCTION(my_addition); // 函数列表 const zend_function_entry my_extension_functions[] = { PHP_FE(my_addition, NULL) PHP_FE_END }; // 模块入口 zend_module_entry my_extension_module_entry = { STANDARD_MODULE_HEADER, "my_extension", // 扩展名称 my_extension_functions, // 函数列表 NULL, // MINIT NULL, // MSHUTDOWN NULL, // RINIT NULL, // RSHUTDOWN NULL, // MINFO PHP_MODULE_GLOBALS(my_extension), // 全局变量(如果有) PHP_GINIT(my_extension), // 全局变量初始化(如果有) NULL, // GSHUTDOWN NULL, // RPOSTSHUTDOWN STANDARD_MODULE_PROPERTIES }; // 标准化全局变量宏(如果需要) <h1>ifdef COMPILE<em>DL</em>MY_EXTENSION</h1> ZEND_GET_MODULE(my_extension) <h1>endif</h1> // 实现函数 PHP_FUNCTION(my_addition) { long a, b; if (zend_parse_parameters(ZEND_NUM_ARGS(), "ll", &a, &b) == FAILURE) { RETURN_NULL(); } RETURN_LONG(a + b); }
-
编写
php_my_extension.h
(可选):
如果你的扩展需要定义一些结构体或宏,可以在这里定义。
编译和安装扩展
-
运行
phpize
:phpize
-
配置扩展:
./configure --enable-my_extension
-
编译和安装:
make sudo make install
-
启用扩展:
编辑你的php.ini
文件,添加以下行:extension=my_extension.so
-
重启 Web 服务器(如果使用 Web 环境,如 Apache 或 Nginx)。
测试扩展
创建一个 PHP 文件来测试你的扩展:
<?php
echo my_addition(3, 4); // 应输出 7
?>
注意事项
- 确保在开发和生产环境中启用适当的错误报告和日志记录,以便在出现问题时能够快速定位。
- 始终在安全的开发环境中测试扩展,以避免潜在的安全漏洞。
- 查阅 PHP 的 扩展开发文档 以获取更多信息和高级功能。
编写 PHP 扩展需要对 C 语言和 PHP 的内部机制有深入的理解,因此建议从简单的功能开始,并逐步增加复杂性。