我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Rust如何开发PHP扩展

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Rust如何开发PHP扩展

本篇内容主要讲解“Rust如何开发PHP扩展”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Rust如何开发PHP扩展”吧!

为什么要使用php扩展?

优点:

php扩展是C开发的,那速度没得说。

耦合性高,它的出现就是用来增强php的。

安全性高,毕竟扩展是编译后的程序,代码不开源。

缺点:

需针对php版本及系统环境进行开发,那么就比较麻烦了。也就是说7.4版本的php,liunx环境下开发的扩展,只支持该php版本及系统。

需要会C、C++,当然本文是以rust进行开发,对C的数据类型进行了解,对rust FFI的操作及数据类型转换需精通。

调试相对麻烦。

为什么要用rust开发php扩展?

原因很简单,这还要说起rust的语言特性。

因“所有权”的特性使你的程序更安全,不会像C那样出现各种“玄学BUG”。

拥有C一样的性能。

毕竟是最受欢迎的语言,我很看好它的发展。

rust开发php扩展流程:

当然,rust目前是没有专门开发php扩展的骨架。所以我的逻辑也很简单,利用rust开发静态库暴露给C【涉及FFI的了解】。我们在php官方骨架中直接引入rust静态库调用其方法即可。

开发环境

宝塔【CentOS 7.6】、GCC【涉及php扩展骨架的编译,我这里系统内置就有,如果编译扩展报相关错了自行安装】、对应php版本源码、web环境【宝塔中安装对应php版本、nginx、mysql等等】

开发整体流程:

1、准备宝塔

Rust如何开发PHP扩展

Rust如何开发PHP扩展

这里我们以开发php7.4扩展为例。

2、下载php7.4 liunx版源码

php官网:PHP: Hypertext Preprocessor

Rust如何开发PHP扩展

Rust如何开发PHP扩展

注意!该源码版本必须与你环境php版本完全一致!!!

Rust如何开发PHP扩展

下载完毕:

Rust如何开发PHP扩展

3、上传php源码到宝塔

Rust如何开发PHP扩展

/usr/phper

在usr下创建一个phper文件夹,然后将源码压缩包上传到此处。

Rust如何开发PHP扩展

解压该压缩包

Rust如何开发PHP扩展

4、创建一个我们自己的扩展

Rust如何开发PHP扩展

/usr/phper/php-7.4.30/ext目录下有这么一个php文件,它可以创建扩展!

Rust如何开发PHP扩展

注意设置命令行版本,因为接下来利用php命令必须是版本一致的!

Rust如何开发PHP扩展

在刚刚的目录下,点击终端,输入创建扩展命令。

php ext_skel.php --ext 扩展名称

Rust如何开发PHP扩展

Rust如何开发PHP扩展

这里就多出了一个新的扩展源码文件。

Rust如何开发PHP扩展

Rust如何开发PHP扩展

在该目录下点击终端,输入:

phpize

Rust如何开发PHP扩展

Rust如何开发PHP扩展

接着输入:

./configure --with-php-config=/www/server/php/74/bin/php-config

注意这个参数php路径,如果是别的版本,请自行在宝塔里安装找到对应版本路径,它们都是放一起的。

Rust如何开发PHP扩展

回车开始进行检查了

Rust如何开发PHP扩展

最后输入:

make

进行编译。

Rust如何开发PHP扩展

Rust如何开发PHP扩展

这个目录下便是编译出来的so扩展最终文件了!

Rust如何开发PHP扩展

让我们看下默认生成的扩展有哪些功能

Rust如何开发PHP扩展

查看主文件【需了解php扩展骨架,这里以它默认给的为例】

Rust如何开发PHP扩展

也就是说,刚刚编译出来的扩展,是有这两个函数的,咱们测试一下玩玩。

注意!每次修改主文件,都需要重新按上述命令跑一遍,否则不生效,很奇怪!

phpize./configure --with-php-config=/www/server/php/74/bin/php-configmake

5、使用扩展

Rust如何开发PHP扩展

复制刚刚生成的扩展文件到我们php环境的扩展里

Rust如何开发PHP扩展

Rust如何开发PHP扩展

配置php.ini加载hello.so扩展

Rust如何开发PHP扩展

extension = hello.so

保存后记得重新启动下php,否则不生效的!

Rust如何开发PHP扩展

Rust如何开发PHP扩展

在文件管理中点击终端,输入:

php -m

可以看到我们的扩展在列表中了。

创建一个站点,测试下扩展中两个函数。

Rust如何开发PHP扩展

看好,php版本是7.4

Rust如何开发PHP扩展

Rust如何开发PHP扩展

访问站点

Rust如何开发PHP扩展

没有问题哦!

当然也可以通过命令行运行php脚本查看结果【前提是网站那里php命令行版本设置的7.4】

Rust如何开发PHP扩展

php index.php

OK!从创建到生成到使用扩展的流程结束,接下来才进入正题,开始用rust开发扩展。

6、rust与php扩展的整合开发

开发工具:CLion

需要rust环境与CLion中rust插件的安装与配置,这个自行去百度,比我想象中的全!

Rust如何开发PHP扩展

创建一个hello命名的库项目

Rust如何开发PHP扩展

我们写两个导出函数,分别是加法功能和base64字符串解析功能。

Rust如何开发PHP扩展

lib.rs

#![crate_type = "staticlib"]extern crate libc;//使用C类型约束use std::ffi::{CStr, CString};use libc::{c_char, c_int};//add_int【参数:两个c语言的int类型】:对两个int类型数值进行相加#[no_mangle]pub extern "C" fn add_int(x:c_int, y:c_int) -> c_int{    //两个数相加    return x + y;}//base64_decode函数【参数:c语言的*char类型】:对字符串进行base64解码#[no_mangle]pub extern "C" fn base64_decode(s:*const c_char) -> *mut c_char {    //c char类型转&str    let h = unsafe{CStr::from_ptr(s).to_str().unwrap()};    //base64 解码    let s = base64::decode(h.to_string());    if let Err(_s) = s {        panic!("类型错误!");    }    let n = String::from_utf8(s.unwrap().clone()).unwrap();    //String 转 C CString    let a = CString::new(n.as_str()).unwrap();    //C CString 转 C char    //这里实属无奈,因为rust ffi中阐述,对字符串返回只能是该字符串地址,所以需要该方法进行返回C才能接收到!    let r = a.into_raw();    return r;}

Rust如何开发PHP扩展

Cargo.toml

[package]name = "hello"version = "0.1.0"edition = "2021"# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html[lib]name = "hello"crate-type = ["staticlib"][dependencies]libc = "*"base64 = "0.12.1"

注意在编译过程中涉及系统类型,不然在引入该静态库编译扩展可能报错,提示不支持。

编译64位静态库

rustup target add x86_64-unknown-linux-muslcargo build --target x86_64-unknown-linux-musl --release

编译32位静态库

rustup target add i686-unknown-linux-muslcargo build --target i686-unknown-linux-musl --release

这里我们是64位系统。

Rust如何开发PHP扩展

会生成一个.a文件,该文件便是liunx支持的静态库文件。

生成支持C语言的胶水头文件【用于C调用该库需要写的函数声明,很方便】

创建cbindgen.toml文件

内容:

language = "C"

Rust如何开发PHP扩展

安装cbindgen,创建头文件。

cargo install --force cbindgencbindgen --config cbindgen.toml --crate 项目名称 --output 头文件名称.h

Rust如何开发PHP扩展

Rust如何开发PHP扩展

自动生成了C语言的函数声明hello.h文件,用于调用。

Rust如何开发PHP扩展

回到之前我们创建的hello扩展

创建lib文件夹

Rust如何开发PHP扩展

将刚刚编译出来的静态库.a文件上传到lib目录下

Rust如何开发PHP扩展

将刚刚创建的.h头文件上传到扩展目录下

Rust如何开发PHP扩展

配置.m4预编译文件【关键】

Rust如何开发PHP扩展

设置引入lib文件夹中的静态库文件Rust如何开发PHP扩展

  PHP_ADD_LIBRARY_WITH_PATH(hello, /usr/phper/php-7.4.30/ext/hello/lib, HELLO_SHARED_LIBADD)  PHP_SUBST(HELLO_SHARED_LIBADD)

Rust如何开发PHP扩展

保存.m4

Rust如何开发PHP扩展

编写主文件

Rust如何开发PHP扩展

#ifdef HAVE_CONFIG_H# include "config.h"#endif#include "php.h"#include "ext/standard/info.h"#include "php_hello.h"#include "hello.h"//引入头文件#ifndef ZEND_PARSE_PARAMETERS_NONE#define ZEND_PARSE_PARAMETERS_NONE() \ZEND_PARSE_PARAMETERS_START(0, 0) \ZEND_PARSE_PARAMETERS_END()#endifPHP_FUNCTION(hello_test1){ZEND_PARSE_PARAMETERS_NONE();    int num = add_int(1,2);//rust中两个数相加函数并返回。    php_printf("The extension %d is loaded and working!\r\n", num);}PHP_FUNCTION(hello_test2){char *var = "World";size_t var_len = sizeof("World") - 1;zend_string *retval;ZEND_PARSE_PARAMETERS_START(0, 1)Z_PARAM_OPTIONALZ_PARAM_STRING(var, var_len)ZEND_PARSE_PARAMETERS_END();    char *newstr = base64_decode(var);//rust中解析base64字符串并返回。    retval = strpprintf(0, "Hello %s", newstr);RETURN_STR(retval);}PHP_RINIT_FUNCTION(hello){#if defined(ZTS) && defined(COMPILE_DL_HELLO)ZEND_TSRMLS_CACHE_UPDATE();#endifreturn SUCCESS;}PHP_MINFO_FUNCTION(hello){php_info_print_table_start();php_info_print_table_header(2, "hello support", "enabled");php_info_print_table_end();}ZEND_BEGIN_ARG_INFO(arginfo_hello_test1, 0)ZEND_END_ARG_INFO()ZEND_BEGIN_ARG_INFO(arginfo_hello_test2, 0)ZEND_ARG_INFO(0, str)ZEND_END_ARG_INFO()static const zend_function_entry hello_functions[] = {PHP_FE(hello_test1,arginfo_hello_test1)PHP_FE(hello_test2,arginfo_hello_test2)PHP_FE_END};zend_module_entry hello_module_entry = {STANDARD_MODULE_HEADER,"hello",hello_functions,NULL,NULL,PHP_RINIT(hello),NULL,PHP_MINFO(hello),PHP_HELLO_VERSION,STANDARD_MODULE_PROPERTIES};#ifdef COMPILE_DL_HELLO# ifdef ZTSZEND_TSRMLS_CACHE_DEFINE()# endifZEND_GET_MODULE(hello)#endif

删除之前生成的扩展文件

Rust如何开发PHP扩展

重新生成扩展Rust如何开发PHP扩展

phpize./configure --with-php-config=/www/server/php/74/bin/php-configmake

Rust如何开发PHP扩展

大小都变了,说明我们的静态库在里面了哈哈。

按上述使用扩展流程替换扩展

Rust如何开发PHP扩展

注意!替换扩展文件后要重启PHP哦,不然不生效!

7、测试rust开发的php扩展

Rust如何开发PHP扩展

网页测试

Rust如何开发PHP扩展

命令行测试

Rust如何开发PHP扩展

也可以通过php扩展骨架直接进行测试

Rust如何开发PHP扩展

Rust如何开发PHP扩展

Rust如何开发PHP扩展

编写要执行测试的扩展函数

--TEST--hello_test2() Basic test--SKIPIF--<?phpif (!extension_loaded('hello')) {echo 'skip';}?>--FILE--<?phphello_test1();var_dump(hello_test2('5LiA56CB6LaF5Lq6'));?>--EXPECT--string(11) "Hello World"string(9) "Hello PHP"

Rust如何开发PHP扩展

扩展目录下直接输入:

make test

Rust如何开发PHP扩展

执行后 tests目录下输出了一个.out文件

Rust如何开发PHP扩展

到此,相信大家对“Rust如何开发PHP扩展”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Rust如何开发PHP扩展

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Rust如何开发PHP扩展

本篇内容主要讲解“Rust如何开发PHP扩展”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Rust如何开发PHP扩展”吧!为什么要使用php扩展?优点:1、php扩展是C开发的,那速度没得说。2
2023-07-04

如何在 Rust中创建 PHP 扩展

这期内容当中小编将会给大家带来有关如何在 Rust中创建 PHP 扩展,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。可以编译的Rust代码到一个库里面,并写为它一些C的头文件,在C中为被调用的PHP做一个
2023-06-17

如何通过PHP扩展开发提升扩展性

《PHP扩展开发怎样提升扩展性》在当今的Web开发环境中,PHP作为一门强大的编程语言,其广泛的应用使得开发者需要不断地提高代码的性能和可维护性。其中,PHP扩展的开发是一个重要的方向,它不仅可以提供额外的功能,还可以增强应用程序的性能和灵活性。本文将深入探讨如何通过优化PHP
如何通过PHP扩展开发提升扩展性
PHP2024-12-22

如何使用 CLion 开发调试 PHP 扩展

本文主要介绍如何使用 IDE Clion 来开发调试PHP扩展。一、 创建PHP扩展php 扩展的创建这里就不再赘述,使用ext_skel 生成一个框架,然后编辑相应的文件,编译安装,最后在php.ini 配置文件中加入生成的扩展 例如 m
如何使用 CLion 开发调试 PHP 扩展
2024-02-27

如何优化PHP扩展开发的性能

PHP扩展开发如何优化性能在PHP开发中,扩展是提高应用程序性能的关键。然而,扩展的开发和优化需要一些技巧和策略。本文将介绍如何优化PHP扩展的性能,包括代码优化、资源管理、错误处理等方面。首先,代码优化是提高扩展性能的首要步骤。以下是一些优化代码的技巧:
如何优化PHP扩展开发的性能
PHP2024-12-22

php如何开启ssl扩展

要开启PHP的SSL扩展,可以按照以下步骤进行:1. 打开php.ini文件。可以在PHP安装目录下找到该文件。2. 在php.ini文件中搜索"extension=",找到相应的ssl扩展的行。3. 去掉该行前面的注释符号";",使其生效
2023-09-01

php如何开启ssl扩展

本文详细指导了在PHP中开启SSL扩展的步骤,包括检查当前SSL状态、编译PHP时启用SSL支持、安装OpenSSL库、配置PHP.ini文件以及重启Web服务器。概述了故障排除技巧,并强调了开启SSL扩展对保护敏感数据和增强网站安全性的重要性。
php如何开启ssl扩展
2024-04-10

PHP扩展开发:如何自定义函数与其他扩展交互?

回答:可通过使用 zend api 自定义函数与其他 php 扩展交互。详细描述:定义自定义函数并用 zend api 注册。通过扩展加载函数或使用 zend_call_function() 与其他扩展交互。提供一个与 mysqli 扩展交
PHP扩展开发:如何自定义函数与其他扩展交互?
2024-05-15

PHP扩展开发深度探索:揭开PHP扩展开发的幕后秘密

PHP扩展开发的世界令人着迷,它允许您创建自定义功能,扩展PHP核心功能并构建更强大的应用程序。本文将引导您深入了解PHP扩展开发的幕后秘密,为您提供全面的知识和实践指南。
PHP扩展开发深度探索:揭开PHP扩展开发的幕后秘密
2024-02-11

如何确保PHP扩展开发的安全性

PHP扩展开发的安全性问题一直是开发者们关注的焦点。在这篇文章中,我将详细介绍如何保证PHP扩展开发的安全性。首先,我们需要了解什么是PHP扩展。PHP扩展是PHP程序的一部分,它可以提供额外的功能和特性,例如数据库连接、文件操作等。然而,这些扩展可能会带来安全风险,因为它们可
如何确保PHP扩展开发的安全性
PHP2024-12-22

PHP扩展开发指南:深入研究PHP扩展开发的方方面面

PHP扩展开发指南提供了全面的指导,帮助您深入了解PHP扩展开发的方方面面,从基本概念、开发环境搭建,到扩展编写、编译和安装,以及故障排除和扩展维护。
PHP扩展开发指南:深入研究PHP扩展开发的方方面面
2024-02-11

PHP扩展:从零到英雄,征服PHP扩展开发领域

PHP扩展开发是一项有趣且富有挑战性的任务。它可以帮助您扩展PHP的功能,使其能够处理更广泛的任务。本文将带领您逐步学习如何开发PHP扩展,从零基础到英雄。
PHP扩展:从零到英雄,征服PHP扩展开发领域
2024-02-11

PHP扩展开发的最佳实践

PHP扩展开发的最佳实践在PHP的世界中,扩展是一种强大的工具,可以让开发者创建自己的功能模块,以增强应用程序的性能和灵活性。然而,如何开发一个既安全又高效的扩展呢?本文将为你提供一些最佳实践。使用面向对象的设计面向对象
PHP扩展开发的最佳实践
PHP2024-12-22

如何简化PHP扩展开发流程:SEO优化技巧

PHP扩展开发简化流程在PHP的开发过程中,扩展的编写和实现是一项重要的任务。然而,这个过程可能会变得复杂,尤其是当涉及到大量的代码和复杂的功能时。本文将为你提供一个简化PHP扩展开发的流程,帮助你更高效地完成你的工作。首先,你需要理解PHP扩展的基本概念。PH
如何简化PHP扩展开发流程:SEO优化技巧
PHP2024-12-22

PHP扩展开发中如何有效避免常见错误

PHP扩展开发避免错误的技巧在PHP的扩展开发过程中,错误是不可避免的。然而,通过一些有效的策略和实践,我们可以大大减少这些错误,提高代码的质量和稳定性。本文将详细介绍如何避免PHP扩展开发中的错误,并提供一些实用的技巧和建议。理解PHP扩展的基本概
PHP扩展开发中如何有效避免常见错误
PHP2024-12-22

php如何安装扩展

小编给大家分享一下php如何安装扩展,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!php安装扩展的方法:1、使用apt或者yum命令安装扩展;2、使用pecl install命令安装扩展;3、通过源码编译安装;4、通过ph
2023-06-06

PHP 函数如何扩展?

php 提供了一种函数扩展机制,允许开发人员创建自定义函数。具体步骤包括:使用 function 关键字创建自定义函数。使用 function_exists() 检查函数是否存在,若不存在则注册。扩展内置函数参数,实现带有新参数的同名函数。
PHP 函数如何扩展?
2024-04-18

PHP扩展开发——ext_skel 工具的使用

如何快速的搭建一个PHP扩展骨架?其实PHP源码中自带了一个工具 ext_skel,可以快速的创建PHP扩展的骨架,从而使开发者可以快速进入扩展的实现。 下面就来说一说ext_skel的使用。我们以php5.6为例。并且下载PHP源码:/h
PHP扩展开发——ext_skel 工具的使用
2024-02-27

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录