news 2026/6/20 1:37:08

PHP异常安全与资源清理模式

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
PHP异常安全与资源清理模式

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关键字自动处理资源释放。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/20 1:35:40

别再手动改Excel了!用Python的openpyxl批量处理单元格,5分钟搞定报表整理

告别Excel手工劳动:用Python的openpyxl实现智能报表自动化每个月的月初,市场部的李婷都要面对几十份销售报表的整理工作。合并表头、清洗异常数据、调整格式……这些重复操作往往要耗费她整整两天时间。直到上个月,她发现同事用十几行Python代…

作者头像 李华
网站建设 2026/6/20 1:36:45

HumanEgo——从半小时人类第一视角视频中进行零样本学习的4大关键点:对人类手臂进行图像修补、将每只手和每个物体编码为一个交互中心 Token、流匹配策略、稠密辅助目标

前言我个人之所以关注到本文要介绍的HumanEgo,纯粹就是因为其数采设备就一副眼镜,手上啥东西都没有..如原论文所说,人类第一视角视频无需任何机器人硬件即可捕获大量丰富的操控示范,但由于人在视觉外观与运动学(运动结构)上都与机…

作者头像 李华
网站建设 2026/6/20 1:30:04

REST 接口规范

REST 接口规范一、命名规范1. 文件命名规则: 小写字母 下划线(snake_case)示例: ui_train_online_request.go2. 结构体命名请求结构体: {业务模块}Request示例: TrainOnlineRequest, TrainPlanRequest响应结构体: {业务模块}Result示例: TrainOnlineRes…

作者头像 李华
网站建设 2026/6/9 8:50:40

QQ音乐加密文件解密终极指南:qmcdump让音乐回归自由

QQ音乐加密文件解密终极指南:qmcdump让音乐回归自由 【免费下载链接】qmcdump 一个简单的QQ音乐解码(qmcflac/qmc0/qmc3 转 flac/mp3),仅为个人学习参考用。 项目地址: https://gitcode.com/gh_mirrors/qm/qmcdump 你是否曾…

作者头像 李华