基于PHP-X快速开发PHP扩展的完整指南
0x01 起步
PHP-X框架基于C++11构建,并使用cmake作为其编译配置工具。开始之前,你需要确保所有必要的依赖项已经准备就绪。具体包括:
免费影视、动漫、音乐、游戏、小说资源长期稳定更新! 👉 点此立即查看 👈
gcc-4.8 或更高版本
PHP7.0 或更高版本,同时需要安装php7-dev开发包
cmake-2.8 或更高版本
接下来,就可以着手安装PHP-X了。
git clone https://github.com/swoole/PHP-X.git
cd PHP-X
cmake .
make -j 4
sudo make install
如果编译过程一帆风顺,没有报错,那么系统lib目录下就会生成libphpx.so文件,相应的头文件也会被复制到系统的include目录。这时,别忘了执行 sudo ldconfig 命令来刷新系统的so文件缓存。
0x02 新建工程
你可以使用任何顺手的开发工具,创建一个名为 test.cc 的源文件。第一步,就是引入核心的phpx.h头文件,并通过using指令导入phpx的命名空间。由于PHP官方源码并未采用C++,因此phpx直接使用了php作为其命名空间。
#include
using namespace std;
using namespace php;
创建一个扩展,需要借助PHPX_EXTENSION宏。在这个宏里,你只需要简单地new一个Extension对象即可。它的构造函数接受两个参数:第一个是扩展的名称,第二个是扩展的版本号。最后,在宏里返回这个扩展对象的指针。
PHPX_EXTENSION()
{
Extension *ext = new Extension("test", "0.0.1");
return ext;
}
0x03 增加函数
PHP扩展的核心使命之一,就是提供高性能的扩展函数。这些用C/C++实现的函数,其性能往往比PHP用户函数高出数十甚至上百倍。在phpx中,实现一个函数变得异常简单:使用PHPX_FUNCTION宏来定义函数逻辑,然后调用Extension::registerFunction方法进行注册。
我们来定义一个简单的函数:cpp_test($str, $n)。它的功能是,返回一个包含$n个$str的数组。
#include
using namespace std;
using namespace php;
// 声明函数
PHPX_FUNCTION(cpp_test);
PHPX_EXTENSION()
{
Extension *ext = new Extension("test", "0.0.1");
ext->registerFunction(PHPX_FN(cpp_test));
return ext;
}
// 实现函数
PHPX_FUNCTION(cpp_test)
{
// args[1] 对应扩展函数的第二个参数
long n = args[1].toInt();
// 将返回值 retval 初始化为一个数组
Array _array(retval);
for(int i = 0; i < n; i++)
{
// args[0] 对应扩展函数的第一个参数
// append 方法用于向数组中追加元素
_array.append(args[0]);
}
}
0x04 编译扩展
接下来,我们需要一个Makefile来管理编译流程。其内容如下:
PHP_INCLUDE = `php-config --includes`
PHP_LIBS = `php-config --libs`
PHP_LDFLAGS = `php-config --ldflags`
PHP_INCLUDE_DIR = `php-config --include-dir`
PHP_EXTENSION_DIR = `php-config --extension-dir`
test.so: test.cc
c++ -DHA VE_CONFIG_H -g -o test.so -O0 -fPIC -shared test.cc -std=c++11 ${PHP_INCLUDE} -I${PHP_INCLUDE_DIR} -lphpx
install: test.so
cp test.so ${PHP_EXTENSION_DIR}/
clean:
rm *.so
这里用到了一个PHP提供的实用工具——php-config。通过它,我们可以轻松获取PHP的安装路径、头文件目录、扩展目录以及其他关键的编译参数。
这个Makefile支持三个常用指令:make用于编译,make clean用于清理,make install则会将编译好的扩展安装到PHP的扩展目录中。
编写完成后,执行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
inotify
json
libxml
mbstring
mcrypt
memcached
mongodb
mysqli
mysqlnd
openssl
pcntl
pcre
PDO
pdo_mysql
pdo_sqlite
Phar
posix
redis
Reflection
session
SimpleXML
sockets
SPL
sqlite3
standard
swoole
test
tokenizer
xml
xmlreader
xmlwriter
yac
zlib
zmq
[Zend Modules]
在输出列表中看到test模块了吗?这就意味着你的扩展已经加载成功了。现在,你已经可以调用cpp_test这个扩展函数了。
0x05 执行
我们来编写一个简单的test.php脚本进行测试:
var_dump(cpp_test("hello", 3));
执行这个脚本:
php test.php
array(3) {
[0]=>
string(5) "hello"
[1]=>
string(5) "hello"
[2]=>
string(5) "hello"
}
看,执行结果完全符合预期。恭喜你,至此你已经成功开发并运行了你的第一个PHP扩展!整个过程是不是比想象中要简单?
0x06 更多
当然,上面的例子只是一个起点,仅仅演示了如何编写一个简单的扩展函数。若想在实际项目中游刃有余地使用PHP-X,你还需要在C++功底上多下功夫。
更重要的是,你需要深入了解更多PHP-X提供的API。配合使用Eclipse这类支持良好的IDE,实现API的自动提示和代码补齐,能让开发过程更加顺畅高效。
平心而论,与传统的Zend API相比,PHP-X的易用性确实提升了不少。相信你不需要花费太多时间,就能掌握这项实用的技能。在接下来的教程中,我会继续分享如何使用PHP-X来实现扩展类、资源、回调函数等更为复杂的功能,敬请期待。
相关攻略
原文地址:https: blog lmzg org 2018 PHP_disable_eval html 在PHP安全加固的讨论中,eval函数常常是焦点。这里有个关键点需要明确:eval是一个语言构造器而非普通函数,这意味着常规的disable_functions指令对它无效。这也就是为什么我们
PHP官网www php net 当前主流版本为5 6 7 1 cd usr local src 接下来,我们进入正题,开始安装PHP 5 6版本。 安装php5 首先,下载源码包并解压: wget http: cn2 php net distributions php-5 6 30 tar
1 安装 安装PHP 第一步,我们来安装PHP及其相关模块。在终端中执行以下命令: yum -y install php php-mysql php-fpm 安装完成后,需要让Nginx知道如何处理PHP文件。这就得修改Nginx的配置文件了。 配置Nginx以支持PHP 使用Vim编辑器打开Ng
PHP-FPM与PHP-CGI:两个FastCGI管理器的路径与渊源 在Linux服务器上,我们常常需要定位PHP相关组件的具体位置。执行which命令,结果清晰地展示了两者的不同: [root& 64;master php] which php-fpm usr local php sbin ph
0x01 起步 PHP-X框架基于C++11构建,并使用cmake作为其编译配置工具。开始之前,你需要确保所有必要的依赖项已经准备就绪。具体包括: gcc-4 8 或更高版本 PHP7 0 或更高版本,同时需要安装php7-dev开发包 cmake-2 8 或更高版本 接下来,就可以着手安装PHP-
热门专题
热门推荐
2026年,Bitget在交易所排行榜上展现出强劲的竞争力。其表现主要体现在用户资产安全体系的持续加固、多元化产品矩阵的成熟与创新,以及在合规与全球化布局上的显著进展。平台通过优化现货与衍生品交易体验,并深化Web3生态建设,巩固了其在行业中的领先地位,获得了市场与用户的广泛认可。
HttpClient的7个常见陷阱与规避指南 在 NET 生态里进行项目开发,HttpClient 几乎是调用外部 API 绕不开的一个工具。它的上手门槛很低,用起来很顺手,但恰恰是这份“简单”,让不少开发者放松了警惕。如果不清楚它内部的运作机制,一不小心就可能掉进坑里,轻则请求失败,重则引发服务
如何解决 NET Core项目与Linux服务器之间的时间同步问题 导语 搞分布式系统的开发者,多少都踩过时间不同步的“坑”。这事说大不大,说小不小——日志对不上、订单乱取消、交易出岔子,追根溯源,往往是几台机器的时间“各走各的”。尤其是在 NET Core应用遇上Linux服务器的场景,时区、格式
1 首先安装必要的NuGet包 第一步,咱们得把项目里需要的“砖瓦”——也就是那几个关键的NuGet包——给准备好。具体是下面这几个: NLog:日志记录的核心库。 NLog Config (可选):如果你想让配置文件自动生成,可以加上这个。 当然,别忘了根据你用的数据库类型,安装对应的提供程序。
在 NET Core 中玩转 RabbitMQ:从零搭建可靠的消息队列 消息队列是现代应用解耦和异步通信的基石,而 RabbitMQ 无疑是这个领域的明星选手。它基于 AMQP 协议,为不同应用程序间的可靠消息传递提供了强大支持。今天,我们就来深入聊聊,如何在 NET Core 环境中,亲手搭建





