文档章节

Swoole C++扩展已支持php-fpm环境

matyhtf
 matyhtf
发布于 2017/03/24 17:15
字数 537
阅读 1272
收藏 8

今天对Swoole的C++扩展模块做了2项改进。

函数调用优化

现在在C++模块中可以直接传参调用PHP的函数和对象方法了。不再需要使用Array来做中介容器。

调用PHP函数:

exec("test", "hello world", 1234, 12345.678, false);

调用PHP的test函数,一共传入了4个不同的参数,注意如果函数不存在将会报致命错误

调用对象方法:

Object redis = PHP::create("redis");
auto ret1 = redis.exec("connect", "127.0.0.1", 6379);
auto ret2 = redis.exec("get", "key");
printf("value=%s\n", ret2.toCString());

这个程序连接了Redis服务器,并执行get从Redis服务器中获取了一个Key为"key"的数据。C++函数中只用了几行代码就实现了像PHP代码一样的功能。大大简化了开发的工作。

启动自动加载模块

现在C++模块可以配置到php.ini在swoole扩展初始化时就加载到PHP中。现在C++扩展模块提供的函数和类可以支持在php-fpm和cli等环境中调用。

目录结构

/stdext.cpp #C++源文件
/Makefile #make编译配置文件

编写代码

#include <string>
#include <iostream>

#include "PHP_API.hpp"
#include "swoole.h"
#include "module.h"

using namespace std;
using namespace PHP;

extern "C"
{
    int swModule_init(swModule *);
    void swModule_destory(swModule *);
}

void String_construct(Object &_this, Args &args, Variant &retval)
{
    _this.set("string", args[0].toString());
}

int swModule_init(swModule *module)
{
    module->name = (char *) "stdext";

    Class *c = new Class("Spl\\String");
    c->addMethod("__construct", String_construct, CONSTRUCT);
    c->addProperty("string", "");
    PHP::registerClass(c);
    return SW_OK;
}

void swModule_destory(swModule *module)
{
    PHP::destory();
}

编译

Makefile文件:

SWOOLE_SRC = "/home/htf/workspace/swoole"
PHP_INCLUDE = `php-config --includes`
PHP_LIBS = `php-config --libs`
PHP_LDFLAGS = `php-config --ldflags`
PHP_EXTENSION_DIR = `php-config --extension-dir`

all: stdext.cpp
	c++ -DHAVE_CONFIG_H -g -o stdext.so -O2 -fPIC -shared stdext.cpp ${PHP_INCLUDE} -std=c++11 -I${SWOOLE_SRC}/include -I${SWOOLE_SRC}
clean: stdext.so
	rm stdext.so
install: stdext.so
	cp stdext.so ${PHP_EXTENSION_DIR}

编译安装:

make install

编译好的stdext.so会自动安装到PHP的扩展路径。但它不是一个PHP扩展而是Swoole的C++模块,需要配置php.ini,增加配置,并重启php-fpm即可。

swoole.modules = "stdext.so, test.so" 

加载多个C++扩展模块时,需要使用逗号分割

执行程序

<?php
$r = new Spl\String("hello world");
var_dump($r);

可以将此脚本放到php-fpm网站的目录中,用浏览器访问。也可以直接使用php命令行来执行。

© 著作权归作者所有

matyhtf

matyhtf

粉丝 442
博文 14
码字总数 8615
作品 8
深圳
程序员
私信 提问
加载中

评论(6)

i岁月无声
i岁月无声
没太看明白, 解决什么场景呢
MrMyj
MrMyj
继续尝试
NILYANG
NILYANG
贼啦有意思,晚点试试
海诺者
海诺者
乍一看以为PHP8.0
ClownFish
ClownFish
厉害了
Mc2
Mc2
顶顶顶
2017 年 PHP 程序员未来路在何方

PHP 从诞生到现在已经有20多年历史,从Web时代兴起到移动互联网退潮,互联网领域各种编程语言和技术层出不穷, Node.js 、 GO 、 Python 不断地在挑战 PHP 的地位。这些技术的推动者非常热衷...

王练
2017/03/31
10.4K
43
2017 年 PHP 程序员未来路在何方?

原文出处:韩天峰 PHP 从诞生到现在已经有20多年历史,从Web时代兴起到移动互联网退潮,互联网领域各种编程语言和技术层出不穷, Node.js 、 GO 、 Python 不断地在挑战 PHP 的地位。这些技术...

韩天峰
2017/04/02
0
0
PHP 是最好的语言?关于 PHP 开发未来的 6 点建议

PHP 为什么是最好的语言?你肯定听过这个段子: 女孩:“你能让这个论坛的人都吵起来, 我今晚就跟你走。” 程序员: “PHP是最好的语言!” 论坛炸锅了, 各种吵架… 女孩:“ 服了你了, 我...

OSC源创君
2018/05/16
10.6K
156
我为什么不看好 PHP ?

讲道理来说对 php 还是蛮有感情的,从第一次看到 HHVM,swoole , PHP7,再到后来 laravel reactphp php-pm 等项目,php 社区有着源源不断的潜力,和一群热爱开发的人来给它续命。 糟心的设计...

左华栋
2018/08/29
11.3K
73
PHPCon 2018 第六届中国 PHP 开发者峰会

一年一度的 PHPCON 马上就要开始了,今年的这个周末,除了鸟哥、韩天峰两个常驻嘉宾外,在活动现场还能看到徐汉彬、范圣佑 等往年很受欢迎的老面孔,也能看到 陈雷、梁晨、郭新华、周晶、廖强...

码云Gitee
2018/05/10
1K
5

没有更多内容

加载失败,请刷新页面

加载更多

sync.Mutex 互斥锁

说明: 互斥锁用来保证在任一时刻,只能有一个例程访问某对象。Mutex 的初始值为解锁状态。Mutex 通常作为其它结构体的匿名字段使用,使该结构体具有 Lock 和 Unlock 方法。Mutex 可...

李琼涛
13分钟前
3
0
自建redis笔记

自建redis笔记 最近在linux安装了一下redis,特做一些笔记! 本文先单节点启动redis,然后再进行持久化配置,在次基础上,再分享搭建主从模式的配置以及Sentinel 哨兵模式及集群的搭建 单节点...

北极之北
15分钟前
2
0
扛住阿里双十一高并发流量,Sentinel是怎么做到的?

Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景 本文介绍阿里开源限流熔断方案Sentinel功能、原理、架构、快速入门以及相关框架比较 基本介绍 1 名词解释 服务限流 :当系统资源...

分布式系统架构
17分钟前
2
0
事假杨晨龙(Z16021)月薪请假单

svn co URL --username xxx-- password yyy ./

桃花飞舞
41分钟前
3
0
当Activity关闭后,网络请求回调的处理

当我们在使用网络请求的时候,一般都是通过回调来获取请求到的数据。对于网络请求的回调需要注意的几个点 比如我们的回调在Activity中处理数据,当我们把Activity关闭后,如果获取到数据时,...

shzwork
41分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部