基于Swoole开发PHP扩展
2019独角兽企业重金招聘Python工程师标准>>>
Swoole-1.9.7增加了一个新特性,可以基于Swoole使用C++语言开发扩展模块,在扩展模块中可以注册PHP内置函数和类。现在可以基于Swoole来编写PHP扩展了。Swoole使用了C++ 11封装了ZendAPI,配合C++ IDE的自动提示和自动补齐,使PHP扩展开发的效率得到了大幅提升,分分钟写出一个PHP扩展。
环境准备
- 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");
编译程序
编写Makefile
SWOOLE_SRC = "/home/htf/workspace/swoole"
PHP_INCLUDE = `php-config --includes`
PHP_LIBS = `php-config --libs`
PHP_LDFLAGS = `php-config --ldflags`all: test.cppc++ -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.sorm 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();
转载于:https://my.oschina.net/matyhtf/blog/864656
基于Swoole开发PHP扩展相关推荐
- IMI 基于 Swoole 开发的协程 PHP 开发框架 常驻内存、协程异步非阻塞
介绍 IMI 是基于 Swoole 开发的协程 PHP 开发框架,拥有常驻内存.协程异步非阻塞IO等优点. IMI 框架文档丰富,上手容易,致力于让开发者跟使用传统 MVC 框架一样顺手. IMI 框 ...
- 可以发送图片文件的php聊天室,基于 Swoole 开发实时在线聊天室(十四):发送图片消息...
基于 Swoole 开发实时在线聊天室(十四):发送图片消息 由 学院君 创建于1年前, 最后更新于 1年前 版本号 #1 2055 views 0 likes 0 collects 上篇教程我们演示 ...
- mysql for循环_基于Swoole扩展开发异步高性能的MySQL代理服务器
MySQL数据库对每个客户端连接都会分配一个线程,所以连接非常宝贵.开发一个异步的MySQL代理服务器,PHP应用服务器可以长连接到这台Server,既减轻MYSQL的连接压力,又使PHP保持长连接减 ...
- mysql异步扩展_基于Swoole扩展开发异步高性能的MySQL代理服务器
MySQL数据库对每个客户端连接都会分配一个线程,所以连接非常宝贵.开发一个异步的MySQL代理服务器,PHP应用服务器可以长连接到这台Server,既减轻MYSQL的连接压力,又使PHP保持长连接减 ...
- 使用php开发,基于swoole扩展开发的工具 swoole-crontab
2019独角兽企业重金招聘Python工程师标准>>> 使用php开发,基于swoole扩展开发的工具 swoole-crontab https://www.oschina.net/ ...
- PHP 接收 UDP包_php只能做网站?基于swoole+websocket开发双向通信应用
前言 众所周知,PHP用于开发基于HTTP协议的网站应用非常便捷.而HTTP协议是一种单向的通信协议,只能接收客户端的请求,然后响应请求,不能主动向客户端推送信息.因此,一些实时性要求比较高的应用,如 ...
- 基于Mozilla Thunderbird的扩展开发(四)---修改Thunderbird源代码实现自动保存附件...
<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" /><?xml:namespace ...
- php7 定义变量,基于PHP7的PHP扩展开发之七(定义变量)
目的:熟悉在PHP扩展里面如何定义变量 要实现的PHP代码如下: class lostphp{} $lng = 2; $str = "abc"; $arr = array(1,'a ...
- php 扩展 返回字符串,基于PHP7的PHP扩展开发之四(字符串的处理)
目的:熟悉字符串在PHP扩展里面如何处理 要实现的PHP代码如下: 1.当字符串不包含指定前缀字符串时,把前缀字符串和被检测字符合并返回. 2.当字符串包含指定前缀字符串时,原样返回. 我们将使用PH ...
最新文章
- c#中嵌入echarts_利用c#+jquery+echarts生成统计报表(附源代码)
- python脚本怎么使用_如何使用Python脚本
- linux 分区 文件,Linux的分区与文件结构
- svg mysql_SVG 实例
- Vue 学习笔记 — css属性计算的问题
- C#正则的委托和lambda表达式用法
- 20145321 《Java程序设计》第4周学习总结
- iOS开发日记49-详解定位CLLocation
- 【报告分享】微信视频号新机遇白皮书.pdf
- Ubuntu系统中各种文件颜色的含义
- h2 mysql mode_H2 数据库快速入门
- 8代cpu能装linux 系统吗,Intel支持八九代酷睿的B365芯片组将登场亮相
- BAT54C不断电源保护电路
- 安卓手机通过抓包实现钉钉网课刷赞
- 通过后台事务来使单据提交工作流
- Java错误类型:Exception in thread main java.lang.Error: Unresolved compilation problem: 	Syntax error,
- css3简单实现页面中出现雪花飘落效果
- xampp php网站,xampp部署php网站
- 欧洲监管机构与银行合作开发区块链权证发行系统
- JavaScript中shift() 方法
热门文章
- Linux Ubuntu使用技巧
- Java 并发编程—有锁互斥机制及AQS理论
- 分布式系统保障—混沌工程—初识
- List类系列(一):list中各元素出现的次数
- JVM学习笔记之-运行时数据区概述及线程概述,程序计数器(PC寄存器),虚拟机栈(栈,局部变量表,操作数栈,动态连接,方法调用,方法返回地址等),本地方法接口,本地方法栈
- 浅谈Mybatis的一级缓存和二级缓存
- H.264(MPEG-4 AVC)级别(Level)、DPB 与 MaxDpbMbs 详解(转载)
- netty 为什么用nio 不用 aio
- SpringBoot使用Thymeleaf模板
- 51Nod 1050 循环数组最大子段和