PHP扩展开发C基础教程
PHP扩展是用C或C++写的动态库。扩展可以提升性能或调用底层库。今天说说PHP扩展开发的基础知识。
一个最简单的扩展函数。
```c
// hello.c
#include
PHP_FUNCTION(hello_from_c) {
RETURN_STRINGL("Hello from C!", 13);
}
const zend_function_entry hello_functions[] = {
PHP_FE(hello_from_c, NULL)
PHP_FE_END
};
zend_module_entry hello_module_entry = {
STANDARD_MODULE_HEADER,
"hello",
hello_functions,
NULL, NULL, NULL, NULL, NULL,
"1.0.0",
STANDARD_MODULE_PROPERTIES
};
ZEND_GET_MODULE(hello_module_entry)
```
编译安装后在PHP里调用。
```php
echo hello_from_c();
?>
用PHP-CPP扩展库更方便。
```cpp
#include
class Calculator : public Php::Base {
public:
Php::Value add(Php::Parameters& params) {
return params[0].numericValue() + params[1].numericValue();
}
Php::Value factorial(Php::Parameters& params) {
int n = params[0].numericValue();
long result = 1;
for (int i = 2; i <= n; i++) result *= i;
return result;
}
};
extern "C" {
PHPCPP_EXPORT void *get_module() {
static Php::Extension ext("calc", "1.0.0");
ext.add("Calculator");
ext.add("Calculator::add", &Calculator::add);
ext.add("Calculator::factorial", &Calculator::factorial);
return ext;
}
}
```
PHP端调用。
```php
$calc = new Calculator();
echo $calc->add(10, 20) . "\n";
echo $calc->factorial(10) . "\n";
?>
扩展开发需要了解PHP的zval和HashTable结构。
```c
// 操作PHP数组
PHP_FUNCTION(cpp_array_sum) {
zval *arr;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "a", &arr) == FAILURE) {
RETURN_FALSE;
}
double sum = 0.0;
HashTable *ht = Z_ARRVAL_P(arr);
zval *val;
ZEND_HASH_FOREACH_VAL(ht, val) {
switch (Z_TYPE_P(val)) {
case IS_LONG: sum += Z_LVAL_P(val); break;
case IS_DOUBLE: sum += Z_DVAL_P(val); break;
default: break;
}
} ZEND_HASH_FOREACH_END();
RETURN_DOUBLE(sum);
}
```
扩展开发的场景。性能关键的计算可以用C加速,调用已有的C/C++库,给PHP增加系统级能力。大部分PHP项目不需要写扩展,内置函数已经够用了。写扩展主要是为了理解PHP底层工作原理。
PHP扩展开发C基础教程
张小明
前端开发工程师
Linux进程(入门)个人笔记
冯诺依曼体系结构计算机大多遵守冯诺依曼体系结构各部件说明输入单元:键盘,摄像头,麦克风,磁盘等中央处理器(CPU):含有运算器和控制器等,运算器进行数据计算任务,运算又分为算术运算和逻辑运算&…
i.MX 6SoloX引脚分配与封装选型实战:规避硬件设计深坑
1. 项目概述:为什么引脚分配是嵌入式设计的“命门”在嵌入式硬件设计的江湖里,选型一颗功能强大的处理器只是第一步,真正的“硬仗”往往从看懂那颗芯片底部密密麻麻的焊球(BGA)开始。我见过不少项目,原理图…
5分钟快速上手:Translumo实时屏幕翻译工具完整指南
5分钟快速上手:Translumo实时屏幕翻译工具完整指南 【免费下载链接】Translumo Advanced real-time screen translator for games, hardcoded subtitles in videos, static text and etc. 项目地址: https://gitcode.com/gh_mirrors/tr/Translumo 还在为外语…
你的学术名片规范吗?聊聊LaTeX中ORCID标识的几种正确‘打开方式’与常见排版雷区
你的学术名片规范吗?聊聊LaTeX中ORCID标识的几种正确‘打开方式’与常见排版雷区在学术交流日益数字化的今天,ORCID(开放研究者与贡献者标识符)已成为研究者不可或缺的"学术身份证"。这个由16位数字组成的唯一标识符&am…
零基础5分钟搞定tts-vue离线语音配置:终极避坑指南与性能优化全攻略
零基础5分钟搞定tts-vue离线语音配置:终极避坑指南与性能优化全攻略 【免费下载链接】tts-vue 🎤 微软语音合成工具,使用 Electron Vue ElementPlus Vite 构建。 项目地址: https://gitcode.com/gh_mirrors/tt/tts-vue 想要在没有网…
MATLAB版平面连杆静力学求解工具集(RRR/RRP/RPR三类机构)
本文还有配套的精品资源,点击获取 简介:一套开箱即用的MATLAB静力学分析工具,包含fRRR.m、fRRP.m、fRPR.m三个核心函数,分别对应三类典型平面连杆机构:双曲柄(RRR)、曲柄滑块(RRP…