【Rust扩展PHP函数注册全攻略】:掌握高性能PHP扩展开发核心技术

第一章:Rust扩展PHP函数注册概述

在现代Web开发中,PHP作为一门广泛使用的脚本语言,其性能瓶颈在高并发或计算密集型场景中逐渐显现。通过使用Rust编写PHP扩展,不仅可以利用Rust的内存安全与高性能特性,还能将关键函数以原生速度暴露给PHP调用,实现性能优化与系统稳定性的双重提升。

核心机制

Rust扩展通过PHP的C扩展接口与Zend引擎交互,将Rust编译为动态链接库(如.so文件),并在PHP启动时加载。函数注册的核心在于定义`zend_function_entry`结构数组,该数组声明了哪些Rust函数将被暴露为PHP可调用函数。

函数注册流程

  • 使用#[no_mangle]确保Rust函数符号不被混淆
  • 通过extern "C"声明C ABI兼容的函数接口
  • 在模块初始化函数中注册函数列表至Zend引擎
例如,一个简单的函数注册代码如下:

#[no_mangle]
pub extern "C" fn hello_rust() -> *const c_char {
    "Hello from Rust!".as_ptr() as *const c_char
}

// 函数条目定义(伪代码,实际需绑定Zend API)
static FUNCTIONS: [zend_function_entry; 2] = [
    zend_function_entry {
        name: b"hello_rust\0".as_ptr() as *const c_char,
        handler: Some(hello_rust_wrapper),
        ..std::mem::zeroed()
    },
    zend_function_entry { name: ptr::null() } // 结束标记
];
步骤说明
1. 编写Rust逻辑实现具体功能函数,确保无GC与异常处理
2. 绑定Zend接口使用FFI包装函数,适配PHP参数与返回值类型
3. 编译为共享库生成.so文件并配置php.ini加载
graph LR A[Rust Source] --> B[Compile to .so] B --> C[Load via php.ini] C --> D[Register Functions] D --> E[Call from PHP]

第二章:环境搭建与基础配置

2.1 理解PHP扩展机制与Zend引擎交互原理

PHP扩展是通过Zend引擎提供的C API与PHP内核深度集成的模块,能够在运行时动态增强语言功能。扩展在加载时通过`ZEND_MINIT_FUNCTION`完成初始化,注册函数、类、常量等资源。
扩展生命周期回调
  • ZEND_MINIT:模块初始化,注册资源
  • ZEND_RINIT:请求开始时执行
  • ZEND_MSHUTDOWN:模块关闭,释放全局资源
  • ZEND_RSHUTDOWN:请求结束清理
与Zend引擎交互示例

ZEND_FUNCTION(sample_hello) {
    char *name;
    size_t name_len;
    // 接收PHP层传入参数
    if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", &name, &name_len) == FAILURE) {
        RETURN_NULL();
    }
    // 拼接返回字符串
    RETURN_STRINGL(name, name_len);
}
该函数通过zend_parse_parameters解析PHP调用参数,利用RETURN_STRINGL宏将结果返回至Zend引擎,完成数据交互。整个过程由Zend虚拟机调度,确保类型安全与内存管理一致性。

2.2 配置Rust与C交叉编译环境实现PHP扩展对接

为了实现Rust与PHP的高效集成,需构建稳定的交叉编译环境,使Rust编写的逻辑能以C兼容接口被PHP扩展调用。
环境依赖准备
确保系统安装了PHP开发头文件、Rust工具链及bindgen工具:
  • php-dev 或 php-devel(取决于发行版)
  • Rust nightly toolchain(支持#[no_mangle]和裸函数导出)
  • clang 和 pkg-config 用于生成C绑定
生成C兼容接口
使用cbindgen自动生成头文件:
cbindgen src/lib.rs -l c --output php_rust_ext.h
该命令解析Rust源码中的pub extern "C"函数,生成标准C头文件,供PHP扩展通过Zend Engine调用。
编译与链接流程
步骤操作
1rustc 编译为静态库 librust.a
2gcc 编译PHP扩展并链接 -l:librust.a

2.3 使用php-config与phpize生成必要构建文件

在编译PHP扩展时,`php-config` 与 `phpize` 是两个关键工具。它们用于获取PHP的构建配置信息并初始化扩展的编译环境。
phpize:准备扩展编译结构
执行 `phpize` 可为PHP扩展生成必要的构建脚本和配置文件。它会创建 `configure` 脚本所需的支持文件。

phpize
# 输出:Configuring for:
# PHP Api Version:         20210902
# Zend Module Api No:      20210902
# Zend Extension Api No:   420210902
该命令自动检测当前PHP环境,并生成适配的构建框架,是扩展编译的第一步。
php-config:获取PHP配置参数
`php-config` 提供了PHP安装路径、API版本等关键信息。
  • --prefix:PHP安装根目录
  • --includes:编译时所需的包含路径
  • --version:PHP版本号
这些信息可用于自动化构建流程,确保扩展与目标PHP版本兼容。

2.4 编写首个Rust实现的PHP函数桩代码

在集成Rust与PHP的初期阶段,编写函数桩(stub)是验证跨语言调用机制的关键步骤。通过定义清晰的接口契约,可确保后续功能扩展的稳定性。
基础桩代码结构
#[no_mangle]
pub extern "C" fn php_rust_hello() -> *const u8 {
    b"Hello from Rust\0".as_ptr() as *const u8
}
该函数使用 #[no_mangle] 禁止符号名混淆,确保PHP可通过dlopen动态链接调用;extern "C" 指定C ABI兼容,返回C风格空终止字符串指针。
参数传递约定
  • 所有数据需通过值或裸指针传递,避免Rust特有类型
  • 内存管理责任应明确:通常由调用方释放
  • 字符串建议采用*const c_char格式交互

2.5 构建与加载扩展验证运行环境正确性

在构建可信执行环境(TEE)时,扩展的正确构建与安全加载是保障运行环境完整性的关键步骤。需通过签名验证、哈希校验等机制确保扩展未被篡改。
构建流程
  • 编译扩展模块并生成唯一哈希值
  • 使用私钥对扩展进行数字签名
  • 将签名与元数据打包为可加载镜像
代码示例:签名验证逻辑
func VerifyExtension(image []byte, signature []byte, pubKey crypto.PublicKey) error {
    hash := sha256.Sum256(image)
    return rsa.VerifyPKCS1v15(pubKey.(*rsa.PublicKey), crypto.SHA256, hash[:], signature)
}
该函数首先计算镜像的 SHA-256 哈希值,再调用 RSA 签名验证算法比对签名。仅当哈希匹配且签名有效时,才允许加载扩展。
加载阶段校验表
阶段验证项作用
预加载签名有效性防止伪造模块
加载中内存完整性防御注入攻击
运行前依赖兼容性确保接口一致

第三章:Rust与PHP的数据类型映射

3.1 PHP用户空间类型在Rust中的安全表示

在跨语言互操作场景中,将PHP用户空间类型安全地映射到Rust至关重要。Rust的类型系统提供了内存安全和线程安全的强保证,而PHP的动态类型需通过静态封装实现兼容。
类型映射策略
通过定义枚举和结构体,可将PHP变量(如字符串、数组、对象)转换为Rust中具备所有权语义的安全类型:

#[repr(C)]
pub enum PhpValue {
    Null,
    Bool(bool),
    Long(i64),
    Double(f64),
    String(*mut c_char),
    Array(HashMap),
}
上述PhpValue枚举使用repr(C)确保与C ABI兼容,便于与PHP内核交互。字符串和数组类型采用指针或智能指针管理生命周期,防止内存泄漏。
内存安全机制
  • 利用Rust的Drop trait自动释放PHP资源
  • 通过Box和Arc控制数据所有权与共享
  • 使用std::ffi::CString安全构造C风格字符串

3.2 实现Zval到Rust原生类型的转换逻辑

在PHP扩展开发中,Zval是存储变量的核心结构。将其转换为Rust原生类型需解析其类型标记并提取对应值。
类型映射设计
建立Zval类型与Rust类型的映射关系:
  • IS_LONG → i64
  • IS_DOUBLE → f64
  • IS_TRUE/IS_FALSE → bool
  • IS_STRING → String
转换代码实现

fn zval_to_rust(zval: &Zval) -> Option<RustValue> {
    match zval.get_type() {
        IS_LONG => Some(RustValue::Int(zval.value.lval)),
        IS_DOUBLE => Some(RustValue::Float(zval.value.dval)),
        IS_TRUE => Some(RustValue::Bool(true)),
        IS_FALSE => Some(RustValue::Bool(false)),
        _ => None, // 其他类型暂不支持
    }
}
该函数通过匹配Zval的类型标识符,安全提取底层联合体中的数值,并封装为Rust枚举类型。参数zval为只读引用,避免所有权转移。

3.3 处理字符串、数组与资源类型的跨语言传递

在跨语言调用中,字符串、数组和资源类型的传递需解决内存布局与生命周期管理问题。不同语言对数据的表示方式存在差异,需通过中间层进行转换。
字符串编码与内存共享
字符串通常以 UTF-8 编码在 C/C++ 与 Go 之间传递,使用指针与长度组合避免拷贝:

type CString struct {
    Data *C.char
    Len  C.size_t
}
该结构体封装 C 字符串指针,在 Go 中通过 C.GoString 转换为 Go 字符串,确保编码一致性。
数组与切片的双向映射
Go 切片可转换为 C 兼容数组:

data := make([]int32, 10)
ptr := (*C.int)(&data[0])
通过取首元素地址获得连续内存指针,实现零拷贝传递。需保证切片不被 GC 回收。
资源句柄的安全传递
文件描述符或数据库连接等资源,应封装为整型句柄传递,并在目标语言侧注册关闭回调,防止泄漏。

第四章:函数注册与导出机制深度解析

4.1 理解PHP函数注册表(function_entry)结构设计

在PHP内核中,`function_entry` 是用于注册扩展函数的核心数据结构。它定义了函数名称、对应C实现指针及参数信息,供Zend引擎在运行时解析调用。
结构体定义与字段解析

struct _zend_function_entry {
    const char *fname;               // 函数名
    void (*handler)(INTERNAL_FUNCTION_PARAMETERS); // C处理函数指针
    const struct _zend_arg_info *arg_info; // 参数信息数组
    zend_uint num_args;              // 参数数量
    zend_uint flags;                 // 函数标志位(如 ZEND_ACC_PUBLIC)
};
该结构允许PHP将用户空间的函数调用映射到底层C函数。`handler` 是执行主体,`arg_info` 提供类型提示与返回值验证。
注册流程示例
使用静态数组定义函数映射:
  • 每个扩展声明 zend_function_entry 数组
  • 模块初始化时由 zend_register_functions() 批量注册
  • 函数名作为key存入全局函数符号表

4.2 在Rust中构造兼容Zend引擎的函数注册接口

为了使Rust编写的扩展能被PHP的Zend引擎识别,必须按照C ABI规范暴露函数注册接口。核心在于实现`zend_function_entry`结构数组,并通过`#[no_mangle]`确保符号正确导出。
函数注册表的定义
// C侧期望的函数条目结构
typedef struct _zend_function_entry {
    const char *fname;
    void (*handler)(/* ... */);
    const struct _zend_arg_info *arg_info;
    uint32_t num_args;
    uint32_t flags;
} zend_function_entry;
该结构描述了PHP用户空间可调用的函数名及其底层C调用入口。
Rust中的绑定实现
#[no_mangle]
pub extern "C" fn my_rust_function() {
    // 实现逻辑
}

#[no_mangle]
pub static mut my_functions: [zend_function_entry; 2] = [
    zend_function_entry {
        fname: b"hello_rust\0".as_ptr() as *const i8,
        handler: Some(my_rust_function),
        arg_info: std::ptr::null(),
        num_args: 0,
        flags: 0,
    },
    zend_function_entry { fname: std::ptr::null(), handler: None, arg_info: std::ptr::null(), num_args: 0, flags: 0 } // 终止项
];
其中最后一项为全空结构,标识函数列表结束,符合Zend引擎遍历要求。

4.3 支持参数解析与返回值封装的自动化流程

在现代服务框架中,自动化处理接口参数与返回值是提升开发效率的关键环节。通过反射与结构体标签(struct tag),系统可自动解析 HTTP 请求中的查询参数、表单数据及 JSON 载荷。
参数绑定示例

type UserRequest struct {
    ID   int    `json:"id" query:"id"`
    Name string `json:"name" form:"name"`
}

func Bind(req *http.Request, target interface{}) error {
    // 自动根据请求类型填充 target 字段
}
上述代码利用结构体标签映射请求字段,query 对应 URL 参数,form 处理表单提交,json 解析请求体。
统一响应封装
状态码消息数据
200OK{...}
400Invalid Parameternull
返回值经中间件统一包装为标准格式,前端可一致性处理响应。

4.4 注册变参函数与静态方法至PHP运行时

在扩展开发中,将变参函数和静态方法注册到PHP运行时是实现功能暴露的关键步骤。通过Zend Engine提供的API,开发者可将C函数映射为PHP可用的接口。
注册变参函数
使用 zend_register_function 可注册支持可变参数的函数。需定义 zend_function_entry 数组:

const zend_function_entry my_functions[] = {
    PHP_FE(my_variadic_func, arginfo_my_variadic_func)
    PHP_FE_END
};
其中 my_variadic_func 函数体内通过 zend_parse_parameters 获取参数列表,支持 ZEND_PARSE_PARAMETERS_START 宏处理不定长参数。
静态方法注册
静态方法需绑定至类条目(zend_class_entry):
  • 使用 zend_declare_class_constant 注册常量
  • 通过 zend_register_method 绑定静态方法指针
方法实现需符合 zval *return_value 返回规范,并正确管理引用计数。

第五章:性能优化与未来发展方向

数据库查询优化实战
在高并发场景下,慢查询是系统瓶颈的常见来源。通过添加复合索引并重写低效 SQL 可显著提升响应速度。例如,以下查询未使用索引:

-- 低效查询
SELECT user_id, action FROM logs 
WHERE DATE(created_at) = '2023-10-01';
应改写为:

-- 高效查询(支持索引)
SELECT user_id, action FROM logs 
WHERE created_at >= '2023-10-01 00:00:00' 
  AND created_at < '2023-10-02 00:00:00';
前端资源加载策略
现代 Web 应用可通过以下方式减少首屏加载时间:
  • 启用 Gzip 压缩静态资源
  • 使用懒加载(Lazy Load)加载非关键 JS 模块
  • 预加载关键请求:<link rel="preload">
  • 设置合理的缓存头(Cache-Control: max-age=31536000)
微服务间通信优化
在 Kubernetes 环境中,gRPC 替代传统 REST API 可降低延迟。某电商平台将订单服务从 HTTP/JSON 迁移至 gRPC/Protobuf 后,P99 延迟由 180ms 降至 67ms。
指标迁移前 (REST)迁移后 (gRPC)
P99 延迟180ms67ms
吞吐量 (QPS)1,2002,900
边缘计算的应用前景
随着 5G 普及,将推理任务下沉至边缘节点成为趋势。某智能安防系统利用边缘网关运行轻量化 YOLOv5s 模型,实现人脸识别本地化处理,带宽消耗下降 70%。
WSL2+Docker实战:在Windows上部署MinerU 2.5.3,解锁媲美Demo的VLM PDF解析能力 本文详细介绍了如何在Windows系统上通过WSL2+Docker部署MinerU 2.5.3,实现媲美Demo的VLM PDF解析能力。文章涵盖环境准备、Docker部署实战技巧及高级使用技巧,特别针对PDF识别中的复杂排版、公式和图表处理提供了优化方案,帮助用户高效处理学术论文和技术文档。 阅读详情

相关推荐

【WireShark】WireShark windows平台编译 问题解决

最近工作中需要基于wireshark做二次开发,在windows平台构建过程中 遇到了找不到Glib库的问题,具体报错如下: Working in D:\WorkSpace\WIRESHARK\wiresharksource\wireshark-win64-libs Tag 2021-08-14 not found. Refreshing. Downloading https://anonsvn.wireshark.org/wireshark-win64-libs/tags/2021-08-14/pac

qq_35456540的博客 1545

Rust开发PHP扩展Liunx版【必须收藏】

众所周知,作为一名phper,对php有限的功能感到尴尬,比如:调用ffmpeg视频处理工具。也就是说7.4版本的php,liunx环境下开发的扩展,只支持该php版本及系统。2、需要会C、C++,当然本文是以rust进行开发,对C的数据类型进行了解,对rust FFI的操作及数据类型转换需精通。这个时候作为深资的phper会考虑开发php扩展,在扩展中实现对ffmpeg的操作。也就是说,刚刚编译出来的扩展,是有这两个函数的,咱们测试一下玩玩。3、安全性高,毕竟扩展是编译后的程序,代码不开源。...

爪哇盘古 2447

Jetson Nano 【1】入手开箱、烧系统

类似于半开箱哈哈 怀着小期待的心情,屁颠屁颠跑到村口领快递,拿到了这个香喷喷的Jetson Nano 开发板 开箱: 由于太激动了忘记拍点啥,于是在最后留了张全家福 板子的结构: 我觉得这个有必要记录一下,于是去官方文档拿了张图来:官方文档传送 1=SD card 的卡槽,位于第二层板子的背部,也就是大风扇屁股位置 2=40针扩展接头(还没开用) 3=USB的供电口,根据大佬测试(某哩...

椰子奶糖的博客 4194

使用Rust构建PHP扩展的极简之路:ext-php-rs

**ext-php-rs** 是一个极具创新性的开源项目,它允许开发者使用Rust语言直接构建PHP扩展,使得在C语言之外有了新的选择。通过Rust的强大功能和安全性,这个库为PHP扩展开发带来了全新的体验。 ## 项目介绍 该项目的核心是一个简洁的API,用于绑定和抽象Zend引擎,从而实现以Rust编写PHP扩展。借助其内置的宏和轻量级特性,你可以轻松地将Rust函数导出到PHP世界中。同

gitblog_00055的博客 581

HDMI2.1接口保护指南:从浪涌损坏案例看RK3588板子的ESD设计要点

本文深入探讨了HDMI2.1接口在RK3588板子上的ESD防护设计要点,通过真实案例分析了浪涌损坏的原因及解决方案。重点介绍了TMDS信号链路的四级防护体系、TVS管选型误区以及连接器与PCB的协同设计策略,帮助工程师有效避免静电放电导致的HDMI无输出故障。

weixin_29305337的博客 446

深入解析ChangeFormer:基于Transformer的孪生网络在遥感变化检测中的创新应用

本文深入解析了ChangeFormer这一基于Transformer的孪生网络在遥感变化检测中的创新应用。通过分层Transformer编码器、特征差异计算模块和轻量级MLP解码器的设计,ChangeFormer在LEVIR-CD数据集上取得了90.4%的F1分数,显著优于传统卷积网络。文章还详细探讨了工程化实现、训练调参和模型部署的优化策略,为遥感变化检测领域提供了新的技术范式。

weixin_29051811的博客 731

Vorssaint 功能全景图:7大模块覆盖Mac使用全场景

Vorssaint 是一款免费开源的 **macOS 菜单栏工具集**,把音量混音器、系统监控、窗口切换器、剪贴板历史等通常需要单独购买的功能整合进一个菜单栏图标:无需账号、没有遥测、没有订阅,所有功能都在本机运行。本文带你一图看懂 Vorssaint 的 7 大功能模块,找到最适合你的工作流组合。 它仅支持 Apple Silicon 的 Mac,要求 macOS 14 Sonoma 及以上版

gitblog_00820的博客 378

深入MoveIt与OMPL集成开发:从源码编译到自定义规划算法实战

本文详细介绍了如何从源码编译集成MoveIt与OMPL,并实现自定义规划算法的完整流程。通过清理环境、获取源码、解决编译依赖与错误,最终指导开发者创建并集成名为MyRRT的自定义规划算法,从而实现对机器人运动规划栈的深度定制与优化。

h0i1j2k3l的博客 467

rust php 扩展,在PHP程序中使用Rust扩展的方法_PHP

C或PHP中的Rust我的基本出发点就是写一些可以编译的Rust代码到一个库里面,并写为它一些C的头文件,在C中为被调用的PHP做一个拓展。虽然并不是很简单,但是很有趣。Rust FFI(foreign function interface)我所做的第一件事情就是摆弄Rust与C连接的Rust的外部函数接口。我曾用简单的方法(hello_from_rust)写过一个灵活的库,伴有单一的声明(a p...

weixin_36048512的博客 335

SIMPLIS仿真软件2.2-SIMPLIS快速入门2

SIMPLIS仿真软件2.2-SIMPLIS快速入门2导读 导读 本文承接上一篇文章。开始介绍SIMPLIS仿真部分。正如上一篇所讲的快速入门的定位,该文对SIMPLIS的三种分析模式不会很深入的讲解,只会记录下一些重要的设置和操作。对于SIMPLIS的三种分析模式的详细讲解,后面会专门撰写。如果读者还没有搭建上一篇文章中讲述的电路,那你可以点击这个链接免费下载所需的电路SIMPLIS_tutorial_buck_converter ,然后在这个电路的基础上继续进行以下操作。 ...

qq_44677482的博客 2万+

手把手教你用6轴IMU跑通LIO-SAM:参数配置与代码修改保姆级教程

本文提供了一套完整的6轴IMU适配LIO-SAM的解决方案,包括参数配置与代码修改的详细步骤。从理解6轴与9轴IMU的关键差异入手,逐步指导如何调整核心配置文件params.yaml、重构utility.h关键函数、优化mapOptimization.cpp的位姿融合逻辑,并给出编译验证与性能调优建议,帮助开发者快速实现6轴IMU在LIO-SAM中的稳定运行。

weixin_28717807的博客 357

【Rust扩展PHP调试全攻略】:手把手教你定位与解决函数调用异常

掌握Rust扩展的PHP函数调试技巧,快速定位与解决跨语言调用异常。适用于高性能PHP扩展开发场景,结合GDB与日志追踪实现精准排错,提升稳定性与开发效率。方法实用,值得收藏

simcode的专栏 1046

机器学习预测股票收益(一)之随机森林模型

机器学习预测股票收益(一)前言一、导入库和数据二、处理数据以及计算特征变量三、使用随机森林回归预测股票收益1.构建训练集和测试集2.查看预测结果四、根据预测结果构建long-short投资组合1.定义投资组合函数2.定义绩效分析函数五、引入Fama-French Factor六、投资组合表现1.超额收益表现2.多因子回归总结 前言 本文将使用Python整理1927-2020年所有美国上市公司股票数据。根据历史收益以及交易量,使用随机森林,支持向量机以及神经网络等机器学习方法预测股票收益。最优结果构建的资产

weixin_47174968的博客 1万+

零样板代码:Oxyde生态解析——Oxyde Admin自动生成管理后台完全指南

Oxyde 是一款类型安全、基于 Pydantic 的异步 Python ORM,内置高性能 Rust 内核;而 Oxyde Admin 正是它生态中的"杀手级"组件——一个能从 Model 定义自动生成完整管理后台的工具。本文将带你系统了解 Oxyde 生态的构成,并手把手走完"定义模型 → 自动生成管理后台"的完整流程,最后用真实基准数据看看这套组合的性能表现。 ## 什么是 Oxyde:为

gitblog_00391的博客 343

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

boss-show-time 安装使用指南:在 Boss直聘 搜索结果展示岗位发布时间

boss-show-time 是一款 Chrome 插件,在 Boss直聘、智联招聘、前程无忧、拉勾招聘的搜索结果页展示岗位发布时间。它在每个职位右上方加上带颜色的时间标签,并本地记录职位浏览数据,适合想优先投递较新岗位的求职者。 ## 解决什么痛点 招聘网站的职位卡片通常只显示"最新""招聘中"这类模糊状态,看不出岗位到底发布几天了。投简历时先挑新岗位,机会更大。 但列表里新旧岗位混在一起

gitblog_01181的博客 140

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

深入解析 @blockly/dev-scripts:Blockly 插件的开发、构建与测试一体化脚本工具

`@blockly/dev-scripts` 是 Blockly 插件生态中的标准化开发工具链:它把 webpack、webpack-dev-server、TypeScript 类型检查、Mocha 单元测试等能力封装为一条 `blockly-scripts` CLI,让插件作者无需手写构建配置,即可一键完成「启动测试 playground → 热重载调试 → 运行 mocha 测试 → 构建发布

gitblog_00994的博客 968

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Dolibarr 发布打包全流程实战指南:从 BETA 冻结到正式版 tgz / deb / rpm / DoliWamp 构建与发布

> 本篇指南以 Dolibarr 官方打包文档([dev/build/makepack-howto.md](https://link.gitcode.com/i/27953537d91cb9a1577dca135c25d643))为骨架,结合当前仓库中真实的打包脚本([dev/build/makepack-dolibarr.php](https://link.gitcode.com/i/6eb6c

gitblog_00601的博客 398

douyin-downloader:抖音无水印批量下载工具指南

douyin-downloader 是一个 Python 编写的抖音无水印批量下载工具,完全由 YAML 配置与 CLI 命令驱动:指定一个作者主页或单条视频链接,它自动挑选无水印视频源,并发下载视频、图文、合集与音乐,SQLite 去重与指数退避重试默认开启。 它适合两类人:需要把某个作者主页作品完整归档到本地磁盘的开发者与内容管理者,以及想把下载流程嵌进脚本或定时任务的自动化场景。明显不匹配

gitblog_00753的博客 262

Xberg C FFI 提取独立 DOCX 文档:xberg_extract 与 ExtractInput 实战解析

本篇技术指南围绕 Xberg 开源仓库中的 C 语言独立 DOCX 提取示例展开,讲解如何通过 C FFI 的 `xberg_extract` 入口与 `ExtractInput` JSON 输入规范,从 URI 提取 Word 文档(`.docx`)正文内容。读完本文,你将掌握 Xberg C 绑定中 `xberg_extract_input_from_json` / `xberg_extrac

gitblog_00885的博客 295

php 函数调用完,php自定义函数调用和执行过程详解

函数被调用需要一些基本的信息,比如函数的名称,参数以及函数的定义(也就是函数的具体执行内容), 从我们开发者的角度来看,定义了一个函数我们在执行的时候自然知道这个函数叫什么名字, 以及调用的时候给传递了什么参数、函数的操作内容。但是对于Zend引擎不能像我们这样能“看懂”php源代码, 它需要对代码进行处理以后才能执行。我们还是从以下两个小例子开始:...

weixin_33450988的博客 480

从dl('xxx.so');函数分析PHP模块开发

从dl('xxx.so');函数分析PHP模块开发 author: selfimprblog: http://blog.youkuaiyun.com/lgg201mail: lgg860911@yahoo.com.cn转载请声明出处.最近在学习PHP模块开发相关的知识, 再看了dl()函数的流程之后, 对模块加载的处理流程做一个总结, 希望可以在PHP模块开发上帮助到大家.进入正题. PHP的代码架构 上图...

yuanlanxiaup 286

PHP内核分析(一)

从宏观上来看,PHP内核的实现与世界上绝大多数的程序一样,接收输入数据, 做相应处理然后输出(返回)结果。 我们编写的代码就是PHP接收的输入数据,PHP内核对我们编写的代码进行解释和运算, 最后返回相应的运算结果。 然而,PHP与我们自己平时写的一般的C程序有所不同的是, 我们的程序一般用来解决某个具体问题, 而PHP本身实现了把用户的逻辑“翻译”为机器语言来执行的功能, 这也是各种编译语言与承

魏亚恒的博客 7448

开发PHP扩展-提供一个可以被PHP使用的类

· 作者:laruence(http://www.laruence.com/) · 本文地址: http://www.laruence.com/2008/04/16/19.html · 转载请注明出处    还是那个关于开发安全签名的PHP模块, 今天将它包装成一个PHP的CLASS,也同样,网上的资料少之甚少,于是我想将经验写一篇,关于如何在Extension Mod

雪候鸟的专栏 3583

rust php 扩展,使用纯Rust开发PHP扩展

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

weixin_39553805的博客 531

63-函数调用与执行

63-函数调用与执行前面对函数的内部表示以及参数的传递,返回值都有了介绍,那函数是怎么被调用的呢?内置函数和用户定义函数在调用时会有什么不一样呢? 下面将介绍函数调用和执行的过程。 函数的调用函数被调用需要一些基本的信息,比如函数的名称,参数以及函数的定义(也就是最终函数是怎么执行的), 从我们开发者的角度来看, 定义了一个函数我们在执行的时候自然知道这个函数叫什么名字,以及调用的时候给传递了什么

phantom66的博客 1078

php源码之路第四章第三节(函数的调用和执行)

前面小节中对函数的内部表示以及参数的传递,返回值都有了介绍,那函数是怎么被调用的呢?内置函数和用户定义函数在调用时会有什么不一样呢?下面将介绍函数调用和执行的过程。函数的调用函数被调用需要一些基本的信息,比如函数的名称,参数以及函数的定义(也就是函数的具体执行内容),从我们开发者的角度来看,定义了一个函数我们在执行的时候自然知道这个函数叫什么名字,以及调用的时候给传递了什么参数、函数的操作内容。但是

Leslie 1367
上一篇: 如何利用聚合函数将传感器数据价值最大化?答案在这里!
下一篇: 医疗数据PHP脱敏规则更新全解析(2024最新权威版)
CodeVibe
博客等级 码龄1年 139粉丝 2123原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值