PHP异常安全与资源清理模式
异常发生时资源清理很重要。PHP提供了try-finally和RAII模式确保资源释放。今天说说PHP中异常安全和资源清理的最佳实践。
try-finally确保清理。
```php
function processFile(string $path): string
{
$handle = fopen($path, 'r');
if ($handle === false) throw new RuntimeException("无法打开文件");
try {
$content = fread($handle, 1024);
if ($content === false) throw new RuntimeException("读取失败");
return $content;
} finally {
fclose($handle);
}
}
file_put_contents('/tmp/test.txt', 'Hello');
echo processFile('/tmp/test.txt') . "\n";
?>
事务清理。
```php
function withTransaction(PDO $pdo, callable $callback): mixed
{
$pdo->beginTransaction();
try {
$result = $callback($pdo);
$pdo->commit();
return $result;
} catch (Exception $e) {
$pdo->rollBack();
throw $e;
}
}
$pdo = new PDO('mysql:host=localhost;dbname=test', 'root', '');
try {
$result = withTransaction($pdo, function (PDO $pdo) {
$pdo->exec("UPDATE accounts SET balance = balance - 100 WHERE id = 1");
$pdo->exec("UPDATE accounts SET balance = balance + 100 WHERE id = 2");
return '转账成功';
});
echo $result . "\n";
} catch (Exception $e) {
echo "失败: {$e->getMessage()}\n";
}
?>
RAII模式。
```php
class ResourceGuard
{
private $resource;
private string $type;
public function __construct(string $type, $resource)
{
$this->type = $type;
$this->resource = $resource;
}
public function get(): mixed
{
return $this->resource;
}
public function __destruct()
{
if ($this->resource === null) return;
switch ($this->type) {
case 'file':
if (is_resource($this->resource)) fclose($this->resource);
break;
case 'curl':
if (is_resource($this->resource)) curl_close($this->resource);
break;
case 'stream':
if (is_resource($this->resource)) fclose($this->resource);
break;
}
$this->resource = null;
}
}
function readFileRAII(string $path): string
{
$handle = fopen($path, 'r');
if ($handle === false) throw new RuntimeException("打开失败");
$guard = new ResourceGuard('file', $handle);
$content = fread($guard->get(), 1024);
if ($content === false) throw new RuntimeException("读取失败");
return $content;
}
echo readFileRAII('/tmp/test.txt') . "\n";
?>
多个资源的清理。
```php
function processMultipleResources(string $file1, string $file2): array
{
$h1 = fopen($file1, 'r');
$h2 = fopen($file2, 'r');
if ($h1 === false || $h2 === false) {
if ($h1) fclose($h1);
if ($h2) fclose($h2);
throw new RuntimeException("打开文件失败");
}
try {
return [fread($h1, 1024), fread($h2, 1024)];
} finally {
fclose($h1);
fclose($h2);
}
}
?>
异常安全的资源清理是系统稳定性的基础。try-finally确保代码无论是否异常都执行清理。事务在异常时自动回滚。RAII模式将资源绑定到对象生命周期。delete关键字自动处理资源释放。
PHP异常安全与资源清理模式
张小明
前端开发工程师
别再手动改Excel了!用Python的openpyxl批量处理单元格,5分钟搞定报表整理
告别Excel手工劳动:用Python的openpyxl实现智能报表自动化每个月的月初,市场部的李婷都要面对几十份销售报表的整理工作。合并表头、清洗异常数据、调整格式……这些重复操作往往要耗费她整整两天时间。直到上个月,她发现同事用十几行Python代…
HumanEgo——从半小时人类第一视角视频中进行零样本学习的4大关键点:对人类手臂进行图像修补、将每只手和每个物体编码为一个交互中心 Token、流匹配策略、稠密辅助目标
前言我个人之所以关注到本文要介绍的HumanEgo,纯粹就是因为其数采设备就一副眼镜,手上啥东西都没有..如原论文所说,人类第一视角视频无需任何机器人硬件即可捕获大量丰富的操控示范,但由于人在视觉外观与运动学(运动结构)上都与机…
REST 接口规范
REST 接口规范一、命名规范1. 文件命名规则: 小写字母 下划线(snake_case)示例: ui_train_online_request.go2. 结构体命名请求结构体: {业务模块}Request示例: TrainOnlineRequest, TrainPlanRequest响应结构体: {业务模块}Result示例: TrainOnlineRes…
QQ音乐加密文件解密终极指南:qmcdump让音乐回归自由
QQ音乐加密文件解密终极指南:qmcdump让音乐回归自由 【免费下载链接】qmcdump 一个简单的QQ音乐解码(qmcflac/qmc0/qmc3 转 flac/mp3),仅为个人学习参考用。 项目地址: https://gitcode.com/gh_mirrors/qm/qmcdump 你是否曾…
稳增6.6%!跻身TOP10智慧农业赛道,全球牲畜记录保存软件市场行业调研报告
一、全球牲畜记录保存软件市场规模及增长趋势根据恒州诚思最新行业调研统计数据,2025年全球牲畜记录保存软件市场规模达14.97亿元。作为智慧农业与农牧数字化领域的TOP10优质成长赛道,该行业依托全球畜牧业规模化、标准化转型浪潮,整体呈现平…
MATLAB 2021b连接USRP X310保姆级教程:从UHD版本匹配到固件烧写(含Win11避坑)
MATLAB 2021b与USRP X310深度集成指南:从版本匹配到实战调优在无线通信系统开发领域,USRP X310配合MATLAB的组合堪称黄金搭档。但初次接触这套工具链的开发者,往往会在环境配置阶段耗费大量时间处理版本兼容性问题。本文将系统性地梳理从硬件…