我是靠谱客的博主 怕孤单小白菜,最近开发中收集的这篇文章主要介绍自己动手写php扩展,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

1.下载最新版php源码

git clone https://github.com/php/php-src

2.切换到ext目录

cd php-src
cd ext

3.利用php-src提供的工具生成扩展的骨架

./ext_skel.php --ext test

便可以在当前目录查看到test文件夹--扩展的文件夹

./ext_skel.php具体怎么使用,可在当前目录输入

./ext_skel.php --help

 

4.如果是需要把扩展编译进php,则选择静态重编译;否则选择动态加载so的方式。根据扩展的载入方式,修改config.m4.

静态重编译:去掉PHP_ARG_ENABLE前的注释dnl,注释掉PHP_ARG_WITH

dnl PHP_ARG_WITH(test, for test support,
dnl Make sure that the comment is aligned:
dnl [
--with-test
Include test support])
dnl Otherwise use enable:
PHP_ARG_ENABLE(test, whether to enable test support,
dnl Make sure that the comment is aligned:
[
--enable-test
Enable test support], no)

动态载入方式:去掉PHP_ARG_WITH前的注释dnl,注释掉PHP_ARG_ENABLE

PHP_ARG_WITH(test, for test support,
dnl Make sure that the comment is aligned:
[
--with-test
Include test support])
dnl Otherwise use enable:
dnl PHP_ARG_ENABLE(test, whether to enable test support,
dnl Make sure that the comment is aligned:
dnl [
--enable-test
Enable test support], no)

我这里选择动态载入的方式。此时php已经编译安装,我这里在此基础上添加扩展

5.在当前目录test目录下执行phpize,生成编译的所需脚本。确保已安装php-dev工具。权限若不够,使用sudo phpize

phpize

6.添加自定义函数 test_myfunc


//1.添加test_func函数定义(一个可选参数)
/* {{{ void test_myfunc()
*/
PHP_FUNCTION(test_myfunc)
{
char *var = "myfunc";
size_t var_len = sizeof("myfunc") - 1;
zend_string *retval;
ZEND_PARSE_PARAMETERS_START(0, 1)
Z_PARAM_OPTIONAL
Z_PARAM_STRING(var, var_len)
ZEND_PARSE_PARAMETERS_END();
retval = strpprintf(0, "Hello %s", var);
RETURN_STR(retval);
}
/* }}} */
//2.定义test_myfunc参数结构
/* {{{ arginfo
*/
//......
ZEND_BEGIN_ARG_INFO(arginfo_test_myfunc, 0)
ZEND_ARG_INFO(0, str)
ZEND_END_ARG_INFO()
//......
/* }}} */
//3.添加扩展支持的函数列表
/* {{{ test_functions[]
*/
static const zend_function_entry test_functions[] = {
PHP_FE(test_test1,
arginfo_test_test1)
PHP_FE(test_test2,
arginfo_test_test2)
PHP_FE(test_myfunc,
arginfo_test_myfunc) //!!!此处为添加的部分
PHP_FE_END
};
/* }}} */

7.   编译生成so文件

./configure
make

 

8.make之后会在当前目录test目录下生成modules文件夹,modules文件夹下的test.so即使我们动态生成库文件。

9.把test.so文件拷贝到PHP的extensions目录里,我这里是通过phpinfo的输出数据获取的extension_dir目录

//phpinfo.php文件内容
<?php
echo phpinfo();
//执行phpinfo.php文件,获取extension_dir目录
php ~/phpinfo.php
| grep extension_dir

10.修改php.ini文件,添加extension=test.so

//执行步骤9中的phpinfo.php文件,获取Loaded Configuration File(php.ini)目录
php ~/phpinfo.php
| grep 'Loaded Configuration File'
sudo vi /etc/php/7.2/cli/php.ini
;extension=pgsql
;extension=shmop
extension=test.so ;.so可要可不要
; The MIBS data available in the PHP distribution must be installed.
; See http://www.php.net/manual/en/snmp.installation.php
;extension=snmp
;extension=soap

11.自己写个脚本测试

//test.php
<?php
echo test_myfunc("func1rn");//预期 Hello func1 换行
echo test_myfunc("");//预期Hello
echo test_myfunc();//预期Hello myfunc,扩展里面有默认值myfunc
php test.php
//结果
Hello func1
Hello Hello myfunc

 

最后

以上就是怕孤单小白菜为你收集整理的自己动手写php扩展的全部内容,希望文章能够帮你解决自己动手写php扩展所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(64)

评论列表共有 0 条评论

立即
投稿
返回
顶部