php扩展开发参考手册(PHP-X教程之: 快速开发一个 PHP 扩展)

feifei123 发布于 2025-02-26 阅读(6)

php全套教程

PHP-X是我在2017年年初创建的一个新项目这个项目的目标就是让有一定工作经验的PHP程序都能够具备扩展开发的能力0x00 初衷从2012年开始编写swoole,现在算来已经有5个年头资源了我发现编写一个 PHP 扩展这个工作非常艰难。

PHP 程序员群体中,甚至可以说 100 人中都很难找出一个会编写 PHP 扩展的人来PHP 官方对扩展开发者非常不友好,源代码中提供的Zend API资源极其难用,API复杂而且凌乱,充斥着各种宏的写法Zend API

坑非常多,普通开发者很容易踩到坑里出现各种莫名其妙的core dump问题Zend API几乎没有任何文档,开发者如果要真正掌握这项技能资源需要付出大量的学习时间于是我今年就冒出一个新的想法,基于我编写swoole

扩展超过5年的经验,我试图在Zend API和C++之间建立一个包装层,让PHP扩展开发变得简单有一定C++基础的PHPer都资源可以轻松得开发一个PHP扩展PHP-X这个项目就这样诞生了,开发只用了一个月的时间。

它的开发效率非常高,在我公司中一个只工作了3年的 PHP 程序员,都可以做出一个扩展来接下来陆续在公司的几个项目中进资源行了快速验证在3个的时间里修复了大量崩溃和内存泄漏问题目前稳定性、性能、健壮性均已达到工业级水准。

0x01 起步PHP-X本身基于C++11开发,使用cmake进行编译配置首先,你需要确定所有依赖项已资源安装好包括:gcc-4.8 或更高版本php-7.0 或更高版本,需要php7-dev包cmake-2.8 或更高版本。

然后安装PHP-Xgit clone https://github.com/sw资源oole/PHP-X.gitcd PHP-Xcmake .make -j4sudo make install未出现任何编译错误,会成功编译出。

libphpx.so,并安装到系统的lib目录头文件会复制资源到系统的include目录这时需要执行 sudo ldconfig刷新so文件缓存0x02 新建工程使用任意开发工具,新建一个test.cc源文件。

首先需要引入phpx.h头文件然后使用using引入资源phpx的命名空间PHP官方未使用C++,因此phpx直接使用了php作为命名空间#includeusingnamespacestd;

usingnamespace php;创建扩展使用PHPX_EXT资源ENSION宏来实现在这宏中只需要new Extension即可创建扩展构造方法接受2个参数,第一个是扩展的名称,第二个是扩展的版本号在。

PHPX_EXTENSION宏中return这个扩展对象的指针资源PHPX_EXTENSION() {    Extension *ext = new Extension("test", "0.0.1");

return ext; 资源 }这里必须使用 new Extension,而不能直接在栈上创建对象0x03 增加函数一个PHP扩展的主要作用就是提供扩展函数,扩展函数由于是用C/C++代码实现,因此它的性能会比

PHP用资源户函数性能高几十甚至上百倍在phpx中实现函数非常简单使用PHPX_FUNCTION来实现扩展函数,然后调用Extension::registerFunction来注册扩展函数PHPX_FN是一个助手资源宏,实际上展开就是

"cpp_hello_world", cpp_hello_worldPHPX_FUNCTION展开后,包含了2个变量,第一个是参数args,第二个是返回值retval通过操作args资源和retval两个变量,就可以实现函数的输入和输出

这里我们的代码非常简单,cpp_test($str, $n),调用这个函数返回一个$n个$str的数组#includeusingnamespacest资源d;usingnamespace php;

//声明函数PHPX_FUNCTION(cpp_test); PHPX_EXTENSION() {    E资源xtension *ext = new Extension("test", "0.0.1"

);    ext->registerFunction(PHPX_FN(cpp_test));资源return ext; }//实现函数PHPX_FUNCTION(cpp_test) {        //args[1] 就是这个扩展函数的第 2 个参数

long n资源 = args[1].toInt();        //将返回值 retval 初始化为数组    Array _array(retval);     资源    for(int i =

0; i < n; i++)    {    //args[0] 就是这个扩展函数的第 1 个参数//append 方法表示向数组中追加元素 资源        _array.append(args[0]);    } }

0x04 编译扩展编写一个Makefile文件内容如下:PHP_INCLUDE = `ph资源p-config --includes` PHP_LIBS = `php-config --libs` PHP_LDFLAGS = `php-config --ldfl资源ags` PHP_INCLUDE_DIR = `php-config --include-dir` PHP_EXTENSION_DIR = `php-config --资源extension-dir` test.so: test.cc    c++ -DHAVE_CONFIG_H -g -o test.so -O0 -fPIC -sha资源red test.cc -std=c++11 ${PHP_INCLUDE} -I${PHP_INCLUDE_DIR} -lphpx。

install: test.so    cp tes资源t.so ${PHP_EXTENSION_DIR}/ clean:    rm *.sophp-config 这个工具是PHP提供的,使用

php-config可以得到P资源HP的安装路径、头文件目录、扩展目录、其他额外的编译参数等等这个Makefile支持了3个指令,make编译,make clean清理,make install安装到扩展目录中。

这里可能需要root权资源限,使用sudo make install进行安装 直接从网页复制,可能会出现tab制表符被替换为空格,请手工编辑一下Makefile使用tab缩进 MacOS下需要在c++编译参数中增加

-undef资源ined dynamic_lookup编写好之后执行make install,就会编译扩展并将扩展test.so安装到PHP的扩展目录中这时需要修改php.ini加入extension=test.so资源。

加载扩展使用php -m来观察你的扩展是否正常加载php -m [PHP Modules] Core ctype curl 资源 date dom fileinfo filter gd hash iconv in资源otify json libxml mbstring mcrypt memcached mongodb 资源 mysqli mysqlnd openssl pcntl pcre PDO pdo_my资源sql pdo_sqlite Phar posix redis Reflection session 资源 SimpleXML sockets SPL sqlite3 standard swoole。

testtok资源enizer xml xmlreader xmlwriter yac zlib zmq 资源 [Zend Modules]这里看到test,表明你的扩展已经加载成功了,现在就可以调用cpp_test

这个扩展函数了0x05 执行编写一个test.php,内容为:

标签:  之家 资源网 扩展 资源 函数 

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。