基于Swoole开发PHP扩展
2017-03-22 13:59
351 查看
Swoole-1.9.7增加了一个新特性,可以基于Swoole使用C++语言开发扩展模块,在扩展模块中可以注册PHP内置函数和类。现在可以基于Swoole来编写PHP扩展了。Swoole使用了C++ 11封装了ZendAPI,配合C++ IDE的自动提示和自动补齐,使PHP扩展开发的效率得到了大幅提升,分分钟写出一个PHP扩展。
必须安装Swoole-1.9.7或更高版本
必须要有Swoole源码
PHP_API.hpp和module.h在Swoole包中
swModule_init表示模块初始化函数
swModule_destory是模块销毁函数
cpp_hello_world就是我们编写的C++扩展函数,在PHP代码中可以调用
在swModule_init中调用了
在代码中可以直接使用数组的方式访问参数,如下:
使用var_dump函数可以打印PHP变量的值。
返回值可以直接赋值。
可以使用Array类实现数组操作。
编译模块
编译完成后,会生成一个
环境准备
IDE建议使用Eclipse CDT必须安装Swoole-1.9.7或更高版本
必须要有Swoole源码
编写程序
#include <string> #include <iostream> #include "PHP_API.hpp" #include "module.h" using namespace std; using namespace PHP; extern "C" { int swModule_init(swModule *); void swModule_destory(swModule *); } //C++函数必须要在头部声明 void cpp_hello_world(Args &args, Variant &retval); int swModule_init(swModule *module) { module->name = (char *) "test"; PHP::registerFunction(function(cpp_hello_world)); } void swModule_destory(swModule *module) { PHP::destory(); } //C++函数的实现 void cpp_hello_world(Args &args, Variant &retval) { printf("SWOOLE_BASE=%ld\n", PHP::constant("SWOOLE_BASE").toInt()); printf("swoole_table::TYPE_INT=%ld\n", PHP::constant("swoole_table::TYPE_INT").toInt()); Variant argv = args.toArray(); var_dump(argv); Array arr(retval); arr.set("key", "key"); arr.set("value", 12345); }
PHP_API.hpp和module.h在Swoole包中
swModule_init表示模块初始化函数
swModule_destory是模块销毁函数
cpp_hello_world就是我们编写的C++扩展函数,在PHP代码中可以调用
cpp_hello_world()来执行
在swModule_init中调用了
PHP::registerFunction注册C++函数到PHP中
程序逻辑
cpp_hello_world函数中的代码逻辑比较简单,首先cpp_hello_world函数一共2个参数,argv表示传入的参数,retval是给PHP的返回值。
在代码中可以直接使用数组的方式访问参数,如下:
void cpp_hello_world(Args &args, Variant &retval) { int a = argv[0].toInt(); string b = argv[1].toString(); double c = argv[2].toFloat(); }
使用var_dump函数可以打印PHP变量的值。
Variant d = argv[3]; var_dump(d);
返回值可以直接赋值。
retval = 1234; retval = "hello world";
可以使用Array类实现数组操作。
//将返回值转为数组 Array arr(retval); arr.set("key", 123); arr.set("value", "world");
编译程序
编写MakefileSWOOLE_SRC = "/home/htf/workspace/swoole" PHP_INCLUDE = `php-config --includes` PHP_LIBS = `php-config --libs` PHP_LDFLAGS = `php-config --ldflags` all: test.cpp c++ -DHAVE_CONFIG_H -g -o test.so -O0 -fPIC -shared test.cpp ${PHP_INCLUDE} -std=c++11 -I${SWOOLE_SRC}/include -I${SWOOLE_SRC} clean: test.so rm test.so
编译模块
make
编译完成后,会生成一个
test.so,可以使用
swoole_load_module方法来加载模块
运行程序
$module = swoole_load_module(__DIR__.'/test.so'); cpp_hello_world(1234, "hello", 3.1415, array("xxx", "eeee")); $module->destory();
相关文章推荐
- 使用php开发,基于swoole扩展开发的工具 swoole-crontab
- 基于swoole扩展实现真正的PHP数据库连接池
- 基于swoole的Hprose for PHP 开发后端API服务 实践
- 【原】用PHP搭建基于swoole扩展的socket服务(附PHP扩展的安装步骤及Linux/shell在线手册)
- php基于swoole扩展的WebSocket
- ASF 基于Swoole开发的PHP App Server框架
- 基于swoole扩展实现真正的PHP数据库连接池
- 基于swoole扩展实现真正的PHP数据库连接池
- php实现基于微信公众平台开发SDK(demo)扩展的方法
- php实现基于微信公众平台开发SDK(demo)扩展的方法
- 基于Visual c++ 2012的php扩展开发 - HelloWord!
- 基于swoole扩展实现真正的PHP数据库连接池
- 如何基于 PHP-X 快速开发一个 PHP 扩展
- 基于Visual c++ 2012的php扩展开发 - 环境搭建
- 基于swoole扩展实现真正的PHP数据库连接池
- 基于Swoole做Socket服务器开发探索与实现PHP代码热更新机制
- php实现基于微信公众平台开发SDK(demo)扩展的方法
- 使用 Swoole 扩展和PHP 开发的在线聊天室
- 基于Swoole扩展开发异步高性能的MySQL代理服务器
- 基于Mozilla Thunderbird的扩展开发(四)---修改Thunderbird源代码实现自动保存附件