我有一个Linux盒子,它捕获数据,创建文件,并在MySQL表中存储有关文件的数据。我需要能够选择性地开始修剪这些数据。
我计划使用php-cli脚本并通过cron每晚运行。
基本前提是选择符合删除条件的行,从匹配的行中删除文件,然后删除行。路径/文件名存储在行中。
我找到了以下查询来安全地选择,然后删除行,但我还需要从文件系统中删除结果中的文件:
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
START TRANSACTION;
SELECT foo FROM bar WHERE wee = 'yahoo!';
DELETE FROM bar WHERE wee = 'yahoo!';
COMMIT;
我知道如何使用php的unlink()函数删除文件。我只是不确定如何保留结果集,迭代删除文件,然后从表中删除结果集行...没有写入临时文本文件或其他东西的大丑陋。
任何帮助将不胜感激。谢谢!
编辑:PHP 5.3.6,MySQL 5.0.77
答案 0 :(得分:0)
如果您只是启动1个DELETE查询,我认为您不需要事务。
<?php
$pdo::prepare("SELECT [...]");
foreach($result as $pathname) {
unlink($pathname);
if (/*everything went good*/)
$pdo::prepare("DELETE [...]");
}
?>
答案 1 :(得分:0)
我认为你实际上没有问题。您可以只选择所有记录并迭代它们。执行查询后,即使使用第二个查询删除它们,也可以迭代结果集中的每个记录。迭代结果集时,结果集会保留在内存中。
因此,只需查询(在一个查询中,如果可能的话)所有要删除的记录。在每次迭代中,删除该文件并删除该记录。
唯一的“问题”是文件系统不在与SQL语句相同的事务中进行事务处理,因此如果在删除记录时出错,则文件可能仍会被删除,反之亦然。
由于我认为使用这些文件的应用程序应始终明确检查文件是否存在,因此最好先清理文件。如果首先删除该文件,请检查它是否已删除,然后只删除该记录,您可以确保始终删除该文件。如果在删除记录时发生错误,您可以再次查询它以再次尝试。如果您先删除该记录,您可能会得到一个意外未删除的文件树,不必要地占用磁盘空间。