文档章节

使用纯Rust开发PHP扩展

__JM_Joy__
 __JM_Joy__
发布于 2019/12/22 00:05
字数 742
阅读 649
收藏 0

「深度学习福利」大神带你进阶工程师,立即查看>>>

背景

最近由于工作需要使用某个开源的PHP扩展,发现扩展并不成熟,在某些情况下会产生内存段错误使php-fpm退出,从而产生502错误。联想到PHP源码和PHP扩展都是用C语言写的,虽然C语言在性能和内存精细控制等方面很强大,但是需要手动处理内存对程序员要求也很高,即使再牛叉的程序员也可能有疏忽的时候,导致内存问题。而我最近的时间在研究Rust这门新兴的现代化语言,深深被它的零开销抽象、内存安全、并发安全等理念所吸引,而且性能上可以和C/C++媲美,并且可以和C语言做FFI,所以就萌生了用纯Rust写PHP扩展的想法。

目前很多文章都提到过用Rust编写PHP扩展,但思路大致有两个:

  1. 使用PHP7.4的FFI功能,用Rust编写代码生成.so文件供PHP FFI调用。这个方法受限于PHP的版本必须大于7.4,而且据说PHP FFI的性能损耗较大,特别是字符串方面。
  2. 使用C语言编写PHP扩展,在某些地方比如函数逻辑等使用Rust做FFI,然后link Rust生成的静态链接库。这个方法可以使用到Rust的生态,也可以减少一部分手动管理内存的麻烦,但是还是无法避免地需要使用PHP内置的C函数/宏等。

所以并没有真正使用纯Rust写PHP扩展的方法,那么我就想尝试自己搞一套。

目标

使用纯Rust并且尽可能使用safe Rust写PHP扩展。

进展

目前基本的轮廓已经写好了,发布了0.1版本,可以看作是一个预览的版本。使用纯Rust编写是可以的,但是离尽可能使用safe Rust,保证内存安全方面还有很长的距离,基本思路是用Rust的struct, trait等去封装裸指针,封装不安全函数等等,这将涉及到API设计和实现等等繁重的工作。

仓库地址:https://github.com/jmjoy/phper

会PHP和Rust或者有兴趣的的朋友可以尝试使用一下。:)

题外话

发现phalcon搞了一门专门编译到PHP扩展的语言zephir,用于简化PHP扩展的开发,挺有意思的,对于某些PHP扩展的场景应该挺适用。仓库地址:https://github.com/phalcon/zephir

__JM_Joy__

__JM_Joy__

粉丝 32
博文 34
码字总数 8021
作品 0
江门
程序员
私信 提问
加载中
请先登录后再评论。
CDH5: 使用parcels配置lzo

一、Parcel 部署步骤 1 下载: 首先需要下载 Parcel。下载完成后,Parcel 将驻留在 Cloudera Manager 主机的本地目录中。 2 分配: Parcel 下载后,将分配到群集中的所有主机上并解压缩。 3 激...

cloud-coder
2014/07/01
6.9K
1
beego API开发以及自动化文档

beego API开发以及自动化文档 beego1.3版本已经在上个星期发布了,但是还是有很多人不了解如何来进行开发,也是在一步一步的测试中开发,期间QQ群里面很多人都问我如何开发,我的业余时间实在...

astaxie
2014/06/25
2.7W
22
程序猿媛一:Android滑动翻页+区域点击事件

滑动翻页+区域点击事件 ViewPager+GrideView 声明:博文为原创,文章内容为,效果展示,思路阐述,及代码片段。文尾附注源码获取途径。 转载请保留原文出处“http://my.oschina.net/gluoyer...

花佟林雨月
2013/11/09
4.3K
1
表单验证插件--Jquery表单验证插件

目前支持对以下格式的值进行验证: cnum-(纯数字), char-(纯字母), zwen-(中文), bysc-(字母开头), mail(邮箱), yzbm(邮政编码) 其中的‘’表示长度,比如“zwen1-5”表示中文1-5位的长度。同...

huanganiu
2013/01/23
4.4K
0
NSSplitView 扩展--DMSplitView

DMSplitView 对标准的 OS X 的 NSSplitView 控件进行改造,可满足更复杂的要求: 子视图的大小和约束 分隔条位置 可收缩伸展的子视图 动画变换效果 可控制分隔条的粗细和样式 可保存和恢复分...

匿名
2013/01/24
371
0

没有更多内容

加载失败,请刷新页面

加载更多

大数据研发学习之路--Hadoop集群搭建

阅读编译文档 准备一个hadoop源码包,我选择的hadoop版本是:hadoop-2.7.7-src.tar.gz,在hadoop-2.7.7的源码 包的根目录下有一个文档叫做BUILDING.txt,这其中说明了编译hadoop所需要的一些...

DSJ-shitou
35分钟前
8
0
OSChina 周五乱弹 —— 特么是别的公司派来的特洛伊木马吧?

Osc乱弹歌单(2020)请戳(这里) 【今日歌曲】 小小编辑推荐:《我会守在这里》- 毛不易 《我会守在这里》- 毛不易 手机党少年们想听歌,请使劲儿戳(这里) @FalconChen :股市连跪了五天,...

小小编辑
36分钟前
36
2
如何在find中排除目录。命令 - How to exclude a directory in find . command

问题: I'm trying to run a find command for all JavaScript files, but how do I exclude a specific directory? 我正在尝试为所有JavaScript文件运行find命令,但是如何排除特定目录? ......

法国红酒甜
今天
69
0
《Java8实战》笔记(02):通过行为参数传递代码

本文源码 应对不断变化的需求 通过筛选苹果阐述通过行为参数传递代码 初试牛刀:筛选绿苹果 public static List<Apple> filterGreenApples(List<Apple> inventory){List<Apple> result = ......

巨輪
今天
19
0
JeeSite 4 架构特点、安全方面、为什么好、工匠精神、不忘初心

1、底层架构 以 Spring Boot 2 为基础,Maven 多项目依赖,模块分项目,松耦合,方便模块升级、增减模块。 模块化的数据库自动升级程序,当模块升级代码需要更新数据库时,自动执行对应版本 ...

ThinkGem
昨天
13
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部