当前位置: 首页 > 科技观察

如何编写独立的PHP扩展

时间:2023-03-16 01:06:32 科技观察

独立的PHP扩展可以独立于PHP源代码进行分发。要创建这样的扩展,需要两件事:配置文件(config.m4)您的模块源代码接下来我们将描述如何创建这些文件并将它们放在一起。准备系统工具要使扩展在系统上成功编译运行,需要准备以下工具:GNUautoconfGNUautomakeGNUlibtoolGNUm4以上可以从ftp://ftp.gnu.org/pub/获取牛/。注意:以上是只能在类Unix环境下使用的工具。改造现有扩展为了展示创建独立扩展有多么容易,让我们首先将已经内置到PHP中的扩展转换为独立扩展。安装PHP并执行以下命令:$mkdir/tmp/newext$cd/tmp/newext现在您有一个空目录。我们复制mysql扩展目录下的文件:$cp-rpphp-4.0.X/ext/mysql/*.#注意:看来这个README确实需要更新了#mysql扩展在PHP7中已经去掉了一部分到这里扩展就完成了,执行:$phpize现在就可以独立的把这个目录下的文件存放在任何地方了,这个扩展就可以完全独立存在了。用户在编译时需要使用如下命令:$./configure[--with-php-config=/path/to/php-config][--with-mysql=MYSQL-DIR]$makeinstall使MySQL模块可以使用内置的MySQL客户端库或位于MySQL目录中的已安装MySQL。注意:这意味着要编写PHP扩展,您需要已经安装了PHP,并且需要下载一份PHP源代码。定义一个新的扩展让我们将示例扩展命名为“foobar”。新的扩展包含两个资源文件:foo.c和bar.c(以及一些头文件,但这些不是唯一重要的)。示例扩展不引用任何外部库(这很重要,因为用户不需要指定一些编译选项)。LTLIBRARY_SOURCES选项用于指定资源文件的名称,您可以拥有任意数量的资源文件。注意:上面提到的Makefile.in文件中的配置选项,可以参考xdebug。修改带有m4后缀的配置文件m4配置文件可以指定一些额外的检查。对于独立的扩展,您只需要调用几个宏。PHP_ARG_ENABLE(foobar,是否启用foobar,[--enable-foobar启用foobar])iftest"$PHP_FOOBAR"!="no";然后PHP_NEW_EXTENSION(foobar,foo.cbar.c,$ext_shared)fiPHP_ARG_ENABLE将自动设置为正确的变量,以确保扩展可以在共享模式下与PHP_NEW_EXTENSION一起启动。PHP_NEW_EXTENSION第一个参数是扩展名,第二个参数是资源文件。第三个参数$ext_shared由PHP_ARG_ENABLE/WITH为PHP_NEW_EXTENSION设置。始终使用PHP_ARG_ENABLE或PHP_ARG_WITH进行设置。即使您不打算分发您的PHP模块,这些设置也将确保您的模块与主PHP模块的接口保持一致。注意:PHP_ARG_ENABLE和PHP_ARG_WITH应该用来定义模块是动态扩展还是静态编译成PHP,就像编译PHP时使用的--enable-xxx和--with-xxx一样。创建资源文件ext_skel可以为你的PHP模块创建一些通用代码,你也可以编写一些基本的函数定义和C代码来处理函数的参数。可以在READNE.EXT_SKEL中找到详细信息。没有例子不用担心,PHP中有很多模块供大家参考,选一个简单的点开始,自己添加代码。注意:ext_skel可以生成基础模块需要的资源文件和配置文件,不需要自己创建。修改自定义模块,将config.m4文件和资源文件放在同一目录下,然后执行phpize(PHP4.0以上版本编译PHP时安装phpize)。如果你的phpize不在系统环境变量中,则需要指定绝对路径,例如:$/php/bin/phpize这条命令会自动将需要的build文件复制到当前目录,并根据config创建配置文件.m4。通过以上步骤,你已经有了一个独立的扩展。安装扩展可以使用以下命令编译和安装扩展:$./configure[--with-php-config=/path/to/php-config]$makeinstall为模块添加共享支持有时需要共享独立的扩展并提供加载其他模块。接下来我将解释如何为已经创建的foo模块添加共享支持。在config.m4文件中,使用PHP_ARG_WITH/PHP_ARG_ENABLE设置扩展名,这样就可以自动使用--with-foo=shared[,..]或--enable-foo=shared[,..]这样的指令编译参数。在config.m4文件中,使用PHP_NEW_EXTENSION(foo,..,$ext_shared)使扩展可构建。在你的C语言资源文件中加入如下代码:#ifdefCOMPILE_DL_FOOZEND_GET_MODULE(foo)#endif这段在上面已经讲过了,这里只是再次强调一下。PECL网站约定如果你打算将你的扩展发布到PECL网站,你需要考虑以下几点:将LICENSE或COPYING添加到package.xml你需要在扩展头文件中定义版本信息,这个宏将被foo_module_entry调用声明扩展版本:#definePHP_FOO_VERSION"1.2.3"