PHP-CPP开发扩展(一)
PHP-CPP是一个用于开发PHP扩展的C++库。PHP-CPP提供了一系列完善的文档、易于使用和扩展的类,让你可以相对快速的创建PHP的原生扩展。
系列笔记:
- PHP-CPP开发扩展(七)
- PHP-CPP开发扩展(六)
- PHP-CPP开发扩展(五)
- PHP-CPP开发扩展(四)
- PHP-CPP开发扩展(三)
- PHP-CPP开发扩展(二)
- PHP-CPP开发扩展(一)
为什么使用PHP-CPP
- 很快
用C++编写的代码很快:比用PHP编写的代码快得多。 - 简单
用C++编写的算法看起来几乎与用PHP编写的算法相同。如果你知道如何用PHP编程,你可以很容易地学习如何在C++中做同样的事情。实际上,PHP和大多数PHP函数名的语法都直接来自C和C++语法。 - 无需Zend引擎知识
Zend引擎的内部结构过于复杂,Zend引擎的代码很乱,而且大部分都没有记录。 - 完善的文档
- 支持所有重要的PHP功能
使用PHP-CPP,你可以像使用普通的PHP脚本一样轻松地处理变量、数组、函数、对象、类、接口、异常和命名空间。除此之外,你还可以使用C++的所有功能,包括线程,lambdas和异步编程。 - 免费的
PHP-CPP是一种开源技术,可供你免费使用。
环境准备
GCC版本不能太低,因为需要支持c++11特性。我使用的版本:
gcc version 7.2.0
如果你是CentOS的系统,可能GCC版本最高就是4.4.7,这时候只能通过手动编译重新安装了。
官方文档:http://www.php-cpp.com/documentation/
安装PHP-CPP
PHP-CPP区分PHP5和7系列,但是对外提供的API是一样的。
PHP5:
$ git clone https://github.com/CopernicaMarketingSoftware/PHP-CPP-LEGACY.git
PHP7:
$ git clone https://github.com/CopernicaMarketingSoftware/PHP-CPP.git
然后编译安装:
$ make
$ sudo make install
Hello World
可以先clone下面这个例子来尝鲜:
git clone https://github.com/elvisszhang/phpcpp_helloworld.git
进入helloworld源码目录,打开main.cpp,可以看到如下代码结构:
/**
* User: 公众号: 飞鸿影的博客(fhyblog)
* Date: 2018/7
*/
#include <phpcpp.h>
#include <iostream>
//这是PHP里面可以调用的接口函数
void say_hello()
{
//输出一段欢迎文字
Php::out << "hello world from my first extension" << std::endl;
}
/**
* 告诉编译器get_module是个纯C函数
*/
extern "C" {
/**
* 本函数在PHP进程一打开就会被访问,并返回一个描述扩展信息的PHP结构指针
*/
PHPCPP_EXPORT void *get_module()
{
// 必须是static类型,因为扩展对象需要在PHP进程内常驻内存
static Php::Extension extension("helloworld", "1.0.0");
//这里可以添加你要暴露给PHP调用的函数
extension.add<say_hello>("say_hello");
// 返回扩展对象指针
return extension;
}
}
PHP-CPP库定义了一个PHPCPP_EXPORT
宏,它应该放在get_module()
函数的前面。此宏确保get_module()
函数是公共导出的,因此可由PHP调用。宏具有基于编译器和操作系统的不同实现。
编译这个扩展很简单,在终端命令行下输入make命令即可:
$ make
g++ -Wall -c -O2 -std=c++11 -fpic -o main.o main.cpp
g++ -shared -o helloworld.so main.o -lphpcpp
$ sudo make install
编译完成会在源码目录下看到 helloworld.so 这个扩展文件。然后在php.ini文件添加扩展:
extension = helloworld.so
输入:
php -m | grep helloworld
就可以看到扩展。
测试源码目录下有个test.php,执行:
$ php test.php
hello world from my first extension
(未完待续)
想第一时间获取最新动态,欢迎关注关注飞鸿影的博客(fhyblog)
,不定期为您呈现技术干货。
PHP-CPP开发扩展(一)的更多相关文章
- Java学习-039-源码 jar 包的二次开发扩展实例(源码修改)
最近在使用已有的一些 jar 包时,发现有些 jar 包中的一些方法无法满足自己的一些需求,例如返回固定的格式,字符串处理等等,因而需要对原有 jar 文件中对应的 class 文件进行二次开发扩展, ...
- EditPlus 配置 Java & C/CPP 开发环境
0.1安装EditPlus 0.2安装Java 0.3安装MinGW 0.4配置Java和MinGW环境变量 1.配置Java开发环境 1.1 Tool-->Preferences 1.2 Ja ...
- 【前端工具】Chrome 扩展程序的开发与发布 -- 手把手教你开发扩展程序
关于 chrome 扩展的文章,很久之前也写过一篇.清除页面广告?身为前端,自己做一款简易的chrome扩展吧. 本篇文章重在分享一些制作扩展的过程中比较重要的知识及难点. 什么是 chrome 扩展 ...
- ----转载----【前端工具】Chrome 扩展程序的开发与发布 -- 手把手教你开发扩展程序
关于 chrome 扩展的文章,很久之前也写过一篇.清除页面广告?身为前端,自己做一款简易的chrome扩展吧. 本篇文章重在分享一些制作扩展的过程中比较重要的知识及难点. 什么是 chrome 扩展 ...
- 搭配 VS Code Remote 远程开发扩展在 WSL 下开发
❗ 注意:远程开发扩展需要在 Visual Studio Code Insiders 上使用. Visual Studio Code Remote - WSL 扩展允许你直接借助 VS Code 令 ...
- php开发扩展环境的搭建(Windows)
php开发扩展环境的搭建(Windows) 前期准备: (1) 下载php-5.3.10源码包(php-5.3.10.tar.bz2)并解压到C:\php-5.3.10:下载二进制包php-5.3.1 ...
- PHP-CPP开发扩展(五)
PHP-CPP是一个用于开发PHP扩展的C++库.本节讲解如何在C++中实现PHP类. 类和对象 类和对象 怎样在PHP-CPP里写出PHP的类呢?很简单,看下面的例子: main.cpp /** * ...
- eclipse mingw cpp开发环境
Eclipse开发c++ 对比:微软的VC++6.0:太老了,对win7兼容不好, 现在微软的Visual Studio:安装包太大,好几个G,装了一堆你不需要的东西,要钱,教 育版申请麻烦 DOS下 ...
- PHP-CPP开发扩展(六)
PHP-CPP是一个用于开发PHP扩展的C++库.本节讲解在C++中PHP异常.变量.常量的实现相关知识. 异常 PHP和C++都支持异常,而PHP-CPP库这两种语言之间的异常处理是完全透明的.你在 ...
随机推荐
- 在当前目录打开DOS命令窗口
Windows7系统:Shift + 鼠标右键 Windows10系统:Shift + 鼠标右键打开Power shell,在Power shell的命令窗口中输入:start cmd
- JAVA中内部类(匿名内部类)访问的局部变量为什么要用final修饰?
本文主要记录:在JAVA中,(局部)内部类访问某个局部变量,为什么这个局部变量一定需要用final 关键字修饰? 首先,什么是局部变量?这里的局部是:在方法里面定义的变量. 因此,内部类能够访问某局部 ...
- 移动端web兼容各种分辨率写法
移动端web开发最好用rem单位,再设置以下js,以iphone6 750*1334为基准 <script> var size = document.documentElement.cli ...
- 2019.02.26 bzoj4311: 向量(线段树分治+凸包)
传送门 题意: 支持插入一个向量,删去某一个现有的向量,查询现有的所有向量与给出的一个向量的点积的最大值. 思路: 考虑线段树分治. 先对于每个向量处理出其有效时间放到线段树上面,然后考虑查询:对于两 ...
- Centos7通过yum安装最新MySQL
一:去官网查看最新安装包 https://dev.mysql.com/downloads/repo/yum/ 二:下载MySQL源安装包 wget http://dev.mysql.com/get/m ...
- overlay fs挂载及操作测试
overlayfs是目前使用比较广泛的层次文件系统,实现简单,性能较好,可以充分利用不同或则相同overlay文件系统的page cache,具有 上下合并 同名遮盖 写时拷贝 等特点. 一个 ove ...
- Linux 线程编程1.0
在编译多线程程序的时候,需要连接libpthread文件: gcc pthread.c -o pthread -lpthread: 所有线程一律平等,没有父子关系,线程属于进程. 创建线程用 p ...
- C++ lamba使用
Moderm Effective C++ 条款31 第206提到了按引用捕获局部变量和函数形参时,如果lambda式的生命期依赖于局部变量和函数形参的生命期,需注意空悬引用的问题. 原书的例子不够直观 ...
- Python自动化编程-树莓派GPIO编程(二)
树莓派我们编程一般都直接用高效的python,针对于GPIO编程,python也是有这一方面的库的,这里最有名也是最常用的就是RPI.GPIO了.这个库是专门为树莓派GPIO编程所设计的,利用它你可以 ...
- poj1149构图题
引题解: 这道题目的大意是这样的:⦁ 有 M 个猪圈(M ≤ 1000),每个猪圈里初始时有若干头猪.⦁ 一开始所有猪圈都是关闭的.⦁ 依次来了 N 个顾客(N ≤ 100),每个顾客分别会打开指定 ...