在linux系统下用C语言开发php扩展

一、生成扩展文件目录

首先,我们需要下载php的源码: https://github.com/php/php-src/releases

选择自己对应的版本,下载压缩包即可。

宝塔面板php7.3默认版本为php7.3.3,所以接下来以php7.3.3为例。

真实下载地址如下:

https://codeload.github.com/php/php-src/zip/refs/heads/PHP-7.3.3

下载完后上传到linux服务器,解压。

你也可以使用linux命令wget下载,然后在服务器中解压。

wget https://github.com/php/php-src/archive/php-7.3.3.tar.gz
tar -zvxf php-7.3.3.tar.gz

解压完成后进入php目录 ext/

cd php-src-php-7.3.3/ext

然后在ext文件夹中运行ext_skel.php文件。

php ext_skel.php --ext myext

执行结果如下:

[root@localhost ext]# php ext_skel.php --ext myext
Copying config scripts... done
Copying sources... done
Copying tests... done

Success. The extension is now ready to be compiled into PHP. To do so, use the
following steps:

cd /path/to/php-src
./buildconf
./configure --enable-myext
make

Don't forget to run tests once the compilation is done:
make test TESTS=ext/myext/tests

Thank you for using PHP!

这个时候扩展相关文件就已经全部生成了,后面只需要改代码然后编译就可以了,暂时先不修改代码,先编译一遍看下效果。

二、编译安装

进入扩展文件夹

cd myext

里面有以下几个文件:

tests  //文件夹,用于扩展安装之后的测试
config.m4  //配置编译的执行命令
config.w32  //win32编译
php_myext.h //扩展的头文件  
myext.c //扩展c文件

我们直接通过phpize生成./configure文件:(多版本情况需要注意phpize版本)

phpize

然后根据正常的安装扩展进行安装:

./configure --with-php-config=/www/server/php/73/bin/php-config
make
make install

在编译完成之后,在php.ini中加入一行配置:

注意引用扩展的真实路径

extension = myext.so

三、测试

进入tests文件夹,运行测试文件:

cd tests
php 001.phpt 
php 002.phpt 
php 003.phpt

即可看到自定义扩展myext的输出(我的是php多版本,所以用的是php73版本运行)

[root@localhost tests]# php73 001.phpt 
--TEST--
Check if myext is loaded
--SKIPIF--
--FILE--
The extension "myext" is available--EXPECT--
The extension "myext" is available
[root@localhost tests]# php73 002.phpt 
--TEST--
myext_test1() Basic test
--SKIPIF--
--FILE--
The extension myext is loaded and working!
NULL
--EXPECT--
The extension myext is loaded and working!
NULL
[root@localhost tests]# php73 003.phpt 
--TEST--
myext_test2() Basic test
--SKIPIF--
--FILE--
string(11) "Hello World"
string(9) "Hello PHP"
--EXPECT--
string(11) "Hello World"
string(9) "Hello PHP"

 这时候,php扩展就已经编译并安装成功了。

也可以编辑PHP文件调用测试函数,感受效果会更直观。

<?php
$test1 = myext_test1();
$test2 = myext_test2();
var_dump($test1);
var_dump($test2);
?>

四、自定义扩展函数

如果要添加新函数,只需要修改myext.c文件即可。

添加一个带参数的函数hello(可以仿照生成自带的函数PHP_FUNCTION(myext_test2)):


PHP_FUNCTION(hello)
{
   char *var = "World";//定义一个world字符串变量
   size_t var_len = sizeof("World") - 1;//定义长度
   zend_string *retval;//定义zend_string类型的变量

   ZEND_PARSE_PARAMETERS_START(0, 1)//设置参数数量限制,前面的代表着最少传0个参数,后面的代表了最多传1个
      Z_PARAM_OPTIONAL //可选参数 ,不强制传参
      Z_PARAM_STRING(var, var_len)//如果有传值,则把值赋值给字符串变量var
   ZEND_PARSE_PARAMETERS_END();//设置参数结束

   retval = strpprintf(0, "Hello %s", var);//格式化字符串

   RETURN_STR(retval);//返回值
}

添加函数进注册模块


static const zend_function_entry myext_functions[] = {
   PHP_FE(myext_test1,    arginfo_myext_test1)
   PHP_FE(myext_test2,    arginfo_myext_test2)
   PHP_FE(hello,    NULL)
   PHP_FE_END
};

 修改后重新编译安装扩展后即可使用。

猜你喜欢

转载自blog.csdn.net/weixin_58881595/article/details/125115244