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扩展相关推荐

  1. IMI 基于 Swoole 开发的协程 PHP 开发框架 常驻内存、协程异步非阻塞

    介绍 IMI 是基于 Swoole 开发的协程 PHP 开发框架,拥有常驻内存.协程异步非阻塞IO等优点. IMI 框架文档丰富,上手容易,致力于让开发者跟使用传统 MVC 框架一样顺手. IMI 框 ...

  2. 可以发送图片文件的php聊天室,基于 Swoole 开发实时在线聊天室(十四):发送图片消息...

    基于 Swoole 开发实时在线聊天室(十四):发送图片消息 由 学院君 创建于1年前, 最后更新于 1年前 版本号 #1 2055 views 0 likes 0 collects 上篇教程我们演示 ...

  3. mysql for循环_基于Swoole扩展开发异步高性能的MySQL代理服务器

    MySQL数据库对每个客户端连接都会分配一个线程,所以连接非常宝贵.开发一个异步的MySQL代理服务器,PHP应用服务器可以长连接到这台Server,既减轻MYSQL的连接压力,又使PHP保持长连接减 ...

  4. mysql异步扩展_基于Swoole扩展开发异步高性能的MySQL代理服务器

    MySQL数据库对每个客户端连接都会分配一个线程,所以连接非常宝贵.开发一个异步的MySQL代理服务器,PHP应用服务器可以长连接到这台Server,既减轻MYSQL的连接压力,又使PHP保持长连接减 ...

  5. 使用php开发,基于swoole扩展开发的工具 swoole-crontab

    2019独角兽企业重金招聘Python工程师标准>>> 使用php开发,基于swoole扩展开发的工具 swoole-crontab https://www.oschina.net/ ...

  6. PHP 接收 UDP包_php只能做网站?基于swoole+websocket开发双向通信应用

    前言 众所周知,PHP用于开发基于HTTP协议的网站应用非常便捷.而HTTP协议是一种单向的通信协议,只能接收客户端的请求,然后响应请求,不能主动向客户端推送信息.因此,一些实时性要求比较高的应用,如 ...

  7. 基于Mozilla Thunderbird的扩展开发(四)---修改Thunderbird源代码实现自动保存附件...

    <?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" /><?xml:namespace ...

  8. php7 定义变量,基于PHP7的PHP扩展开发之七(定义变量)

    目的:熟悉在PHP扩展里面如何定义变量 要实现的PHP代码如下: class lostphp{} $lng = 2; $str = "abc"; $arr = array(1,'a ...

  9. php 扩展 返回字符串,基于PHP7的PHP扩展开发之四(字符串的处理)

    目的:熟悉字符串在PHP扩展里面如何处理 要实现的PHP代码如下: 1.当字符串不包含指定前缀字符串时,把前缀字符串和被检测字符合并返回. 2.当字符串包含指定前缀字符串时,原样返回. 我们将使用PH ...

最新文章

  1. c#中嵌入echarts_利用c#+jquery+echarts生成统计报表(附源代码)
  2. python脚本怎么使用_如何使用Python脚本
  3. linux 分区 文件,Linux的分区与文件结构
  4. svg mysql_SVG 实例
  5. Vue 学习笔记 — css属性计算的问题
  6. C#正则的委托和lambda表达式用法
  7. 20145321 《Java程序设计》第4周学习总结
  8. iOS开发日记49-详解定位CLLocation
  9. 【报告分享】微信视频号新机遇白皮书.pdf
  10. Ubuntu系统中各种文件颜色的含义
  11. h2 mysql mode_H2 数据库快速入门
  12. 8代cpu能装linux 系统吗,Intel支持八九代酷睿的B365芯片组将登场亮相
  13. BAT54C不断电源保护电路
  14. 安卓手机通过抓包实现钉钉网课刷赞
  15. 通过后台事务来使单据提交工作流
  16. Java错误类型:Exception in thread main java.lang.Error: Unresolved compilation problem: Syntax error,
  17. css3简单实现页面中出现雪花飘落效果
  18. xampp php网站,xampp部署php网站
  19. 欧洲监管机构与银行合作开发区块链权证发行系统
  20. JavaScript中shift() 方法

热门文章

  1. Linux Ubuntu使用技巧
  2. Java 并发编程—有锁互斥机制及AQS理论
  3. 分布式系统保障—混沌工程—初识
  4. List类系列(一):list中各元素出现的次数
  5. JVM学习笔记之-运行时数据区概述及线程概述,程序计数器(PC寄存器),虚拟机栈(栈,局部变量表,操作数栈,动态连接,方法调用,方法返回地址等),本地方法接口,本地方法栈
  6. 浅谈Mybatis的一级缓存和二级缓存
  7. H.264(MPEG-4 AVC)级别(Level)、DPB 与 MaxDpbMbs 详解(转载)
  8. netty 为什么用nio 不用 aio
  9. SpringBoot使用Thymeleaf模板
  10. 51Nod 1050 循环数组最大子段和