C++开发PHP扩展
前端时间用C开发PHP扩展,用C实现字符串和简单的cache不友好,因而有了用C++开发的想法。
相关环境初始化配置准备
1.用php源码提供的脚手架生成扩展名
php ext/ext_skel.php --ext yaoling_encrypt_plus
2.修改生成的config.m4
PHP_REQUIRE_CXX()
PHP_SUBST(YAOLING_ENCRYPT_PLUS_SHARED_LIBADD)
PHP_ADD_LIBRARY(stdc++, 1, YAOLING_ENCRYPT_PLUS_SHARED_LIBADD)
PHP_NEW_EXTENSION(yaoling_encrypt_plus, yaoling_encrypt_plus.cpp, $ext_shared)
3.修改yaoling_encrypt_plus.c 为 yaoling_encrypt_plus.cpp 修改源码
/* yaoling_encrypt_plus extension for PHP */
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
extern "C"
{
#include "php.h"
#include "ext/standard/info.h"
#include "php_yaoling_encrypt_plus.h"
#include "yaoling_encrypt_plus_arginfo.h"
}
#include <iostream>
/* For compatibility with older PHP versions */
#ifndef ZEND_PARSE_PARAMETERS_NONE
#define ZEND_PARSE_PARAMETERS_NONE() \
ZEND_PARSE_PARAMETERS_START(0, 0) \
ZEND_PARSE_PARAMETERS_END()
#endif
/* {{{ PHP_RINIT_FUNCTION Request initialization */
PHP_RINIT_FUNCTION(yaoling_encrypt_plus)
{
#if defined(ZTS) && defined(COMPILE_DL_YAOLING_ENCRYPT_PLUS)
ZEND_TSRMLS_CACHE_UPDATE();
#endif
std::cout << "yaoling_encrypt_plus request before..." << std::endl;
return SUCCESS;
}
/* }}} */
/* {{{ PHP_MINFO_FUNCTION */
PHP_MINFO_FUNCTION(yaoling_encrypt_plus)
{
php_info_print_table_start();
php_info_print_table_header(2, "yaoling_encrypt_plus support", "enabled");
php_info_print_table_end();
}
/* }}} */
/* {{{ yaoling_encrypt_plus_module_entry */
zend_module_entry yaoling_encrypt_plus_module_entry = {
STANDARD_MODULE_HEADER,
"yaoling_encrypt_plus", /* Extension name */
ext_functions, /* zend_function_entry */
NULL, /* PHP_MINIT - Module initialization */
NULL, /* PHP_MSHUTDOWN - Module shutdown */
PHP_RINIT(yaoling_encrypt_plus), /* PHP_RINIT - Request initialization */
NULL, /* PHP_RSHUTDOWN - Request shutdown */
PHP_MINFO(yaoling_encrypt_plus), /* PHP_MINFO - Module info */
PHP_YAOLING_ENCRYPT_PLUS_VERSION, /* Version */
STANDARD_MODULE_PROPERTIES};
/* }}} */
#ifdef COMPILE_DL_YAOLING_ENCRYPT_PLUS
#ifdef ZTS
ZEND_TSRMLS_CACHE_DEFINE()
#endif
extern "C"
{
ZEND_GET_MODULE(yaoling_encrypt_plus)
}
#endif
4.修改定义方法
<?php
/** @generate-class-entries */
function yaoling_encrypt_plus(): void {}
5.重新生成头文件
php /usr/local/src/php-src-php-8.1.11/build/gen_stub.php \
./yaoling_encrypt_plus.stub.php
6.执行编译
phpize
./confugure --with-php-config=/usr/local/php8.1.11/bin/php-config
make && make install
7.配置ini
extension=yaoling_encrypt_plus
8.验证
php -r "yaoling_encrypt_plus();"
看到以下输出即为成功
yaoling_encrypt_plus request before... #c++语法的输出
The extension php_hello is loaded and working!
C++开发PHP扩展的更多相关文章
- 手把手教你开发chrome扩展一:开发Chrome Extenstion其实很简单
手把手教你开发chrome扩展一:开发Chrome Extenstion其实很简单 手把手教你开发chrome扩展一:开发Chrome Extenstion其实很简单 手把手教你开发Chrome扩 ...
- Sublime Text 前端开发常用扩展插件推荐
Sublime Text 前端开发常用扩展插件推荐 Sublime Text Sublime Text 是程序员们公认的编码神奇,拥有漂亮的用户界面和强大的功能 更重要的是,Sublime Text ...
- 【翻译】我钟爱的Visual Studio前端开发工具/扩展
原文:[翻译]我钟爱的Visual Studio前端开发工具/扩展 怎么样让Visual Studio更好地编写HTML5, CSS3, JavaScript, jQuery,换句话说就是如何更好地做 ...
- 最锋利的Visual Studio Web开发工具扩展:Web Essentials详解
原文:最锋利的Visual Studio Web开发工具扩展:Web Essentials详解 Web Essentials是目前为止见过的最好用的VS扩展工具了,具体功能请待我一一道来. 首先,从E ...
- 开发 chrome 扩展 GitHub-Remarks 的一些想法以及遗憾
前文 对于单页应用中如何监听 URL 变化的思考 说到我在开发 chrome 扩展 GitHub Remarks 中遇到的一个问题,本文来聊聊开发这个扩展的前后心路历程. 为什么开发这个扩展?前文说到 ...
- 手把手教你开发chrome扩展
转载:http://www.cnblogs.com/walkingp/archive/2011/04/04/2003875.html 手把手教你开发chrome扩展一:开发Chrome Extenst ...
- 【逆向知识】开发WinDBG扩展DLL
如何开发WinDbg扩展DLL WinDbg扩展DLL是一组导出的回调函数,用于实现用户定义的命令.以便从内存转储中提取特定的信息.扩展dll由调试器引擎加载,可以在执行用户模式或内核模式调试时提供自 ...
- 如何开发 Laravel 扩展包并发布到 Composer
如何开发 Laravel 扩展包并发布到 Composer 发布于 2019-01-22 cxp1539 1074 Vie 开发扩展包 我们来做一个根据第一个字符或者汉字生成头像的larave ...
- windows下开发PHP扩展dll(无需Cygwin)
windows下开发php扩展网上很多资料都说需要Cygwin,其实完全可以不必安装该东东.没错,是可以在linux下生成骨架后拷到windos下来用,但是,如果没有linux环境呢?什么,装虚拟机? ...
- 手把手教你开发Chrome扩展三:关于本地存储数据
手把手教你开发chrome扩展一:开发Chrome Extenstion其实很简单 手把手教你开发Chrome扩展二:为html添加行为 手把手教你开发Chrome扩展三:关于本地存储数据 HTML5 ...
随机推荐
- 第三方登陆--QQ登陆--前后端分离版本
从零玩转第三方QQ登陆 下面有源码 第三方GITEE登陆 https://www.cnblogs.com/Yangbuyi/p/yangbuyi.html 在真正开始对接之前,我们先来聊一聊后台的方案 ...
- vscode快速配置汇编环境
微机原理的课程需要,简单快速记录环境的搭建 找到并安装插件masm. MASM/TASM的汇编工具默认是tasm这样就无法在vscode终端进行debug,打开插件设置如下修改: 测试代码实现小写字母 ...
- Dart 3.2 更新盘点
作者 / Kevin Moore 和 Michael Thomsen 我们隆重宣布推出 Dart 3.2,这一版本针对以下方面做出了改进: 新增了一项语言功能,可对私有 final 字段进行非空升级: ...
- GitHub OAuth2的授权指南
一.OAuth2简介 OAuth 2.0(开放授权 2.0)是一种用于授权的开放标准,旨在允许用户在不提供他们的用户名和密码的情况下,授权第三方应用访问其在另一网站上的信息.它是在网络服务之间安全地共 ...
- SSH默认端口从22修改为其他端口
1.在终端中使用root权限登录到您的Linux服务器. 2.打开终端,并使用适合您的文本编辑器(如vi.nano等)打开SSH配置文件.例如,通过运行以下命令之一: vi /etc/ssh/sshd ...
- MoE:LLM终身学习的可能性
本文分享自华为云社区<DTSE Tech Talk | 第47期:MoE:LLM终身学习的可能性>,作者:华为云社区精选. 在DTSE Tech Talk的第47期直播<MoE:LL ...
- 干货分享丨轻松玩转 Huawei LiteOS 传感框架
摘要:LiteOS传感框架将物联网终端设备上不同类型的传感器统一管理,通过抽象不同类型传感器接口,屏蔽其硬件细节,做到"硬件"无关性,非常方便于物联网设备的开发.维护和功能扩展. ...
- 即使不会node.js,拖拽就可完成数据的可视化展示
摘要:node-red是一款基于Node.js的开源可视化界面开发工具,不需要掌握node.js而通过拖拽即可完成数据的可视化展示. 1.首先看一下node-red对数据的渲染效果 你可能认为,必须熟 ...
- 这项评测,华为云GaussDB(for MySQL)顺利通过
摘要:近日,中国信息通信研究院(简称"中国信通院")公布了第十五批"可信数据库"评测结果.华为云GaussDB(for MySQL)凭借过硬的技术实力顺利通过& ...
- 使用 Python Poetry 进行依赖管理
摘要:在本教程中,您探索了如何创建新的 Python Poetry 项目以及如何将 Poetry 添加到现有项目中. 本文分享自华为云社区<使用 Python Poetry 进行依赖管理> ...