跟踪图像文件的链接或引用并删除未使用的文件(PHP/数据库)

Posted

技术标签:

【中文标题】跟踪图像文件的链接或引用并删除未使用的文件(PHP/数据库)【英文标题】:Keeping track of links or references to image files and deleting unused ones (PHP/Database) 【发布时间】:2011-02-28 21:22:06 【问题描述】:

我需要一种从我的文件系统中删除“未使用”图像的方法,即从未从 我的 网站中的任何位置访问的图像(如果我断开外部链接也没关系。我可能会禁用完全外部盗链)。解决这个问题的最佳方法是什么?普通用户可以向主题/帖子添加多个附件,内容贡献者可以批量上传大量图片,这些图片可用于文章或图片库。

问题是可以通过以下任何方式引用图像:

    来自存储在数据库中的用户内容(文本/html,可能是 Markdown 或 BBCode) 硬编码到 HTML 页面中 硬编码到 php 文件中 硬编码到 CSS 文件中 作为数据库表中的“附件”字段,通常只包含文件名本身而没有路径,因为应用程序假定它位于某个文件夹中。

最重要的是,图像的路径可以是绝对或相对 HTTP 或 PHP 路径,并且可能会或可能不会在 PHP 中使用字符串连接构建。

所以显然查找/替换或正则表达式数据库或文件系统是不可能的。但对你和我来说幸运的是,这个系统还没有完全实现,我不需要任何处理现有图像的东西。我只需要建立一些有效的结构,以便在未来实现这一点。

我想到的一些想法:

使用 PHP 拦截图像的 HTTP 请求,并跟踪 HTTP_REFERER。这样做的问题是,在检查时没有人点击链接并不意味着该链接不存在。 使用极端的数据库规范化 - 即为图像创建一个表,并为引用它的任何内容使用外键。但是,这会导致多对多关系(和交叉表)的度量标准变得复杂,而且对于任何普通用户来说都是不切实际的。 备份所有图像并将其删除,并检查每个 404 请求并在每次尝试从备份文件夹中找到图像并将其放入“真实”文件夹时运行脚本。问题是必须经常清除此缓存,并且在重建缓存时服务器可能会紧张。

想法/建议?即使您正在制作一个包含大量图像的网站,这只是您必须忽略和忍受的东西吗?即使不值得,仅用于概念验证的东西如何工作(我添加垃圾收集标签只是因为这可能在概念上进入该领域)。

【问题讨论】:

【参考方案1】:

我承认我在这方面的经验比你的简单。可以这么说,我没有“用户生成的内容”,我的图像都在只有模板或具有完整路径的数据库中。但我所做的是创建一个 perl 脚本,

分析了我的 HTML 模板、数据库 表,并且 CSS 生成了一个列表 文件 它在 HTML 中寻找 <img> 标签 它在 CSS 中查找任何 .png、.jp*g 或 .gif 正则表达式字符串 表格很简单,因为我有一个用于图像数据的 Image 表格 当时的文件列表是 下令删除重复项 脚本遍历列表并 写了一个类似的csv: 文件名,(CSS 文件名|HTML 文件名|DBTABLE),(exists|notexists) for 审计 在另一个迭代中 将不在列表中的所有文件重命名为 将 .del 附加到文件名 回归测试后,我调用了 带有 -docleanup 标签的脚本 告诉它通过并删除所有 .del 附加文件。 如果出于某种原因标记了图像 作为 .del 并且不应该是,我 只需手动将其重命名为 原始形式。

几点说明:我意识到我可以让这个脚本“更顺畅”,并在多个步骤中完成多项任务,但它的使用随着时间的推移而增长,我希望清楚地描述处理步骤,这样它就不会乱跑。我使用 CSV 返回并清理图像不存在的信息。

【讨论】:

以上是关于跟踪图像文件的链接或引用并删除未使用的文件(PHP/数据库)的主要内容,如果未能解决你的问题,请参考以下文章

运行“npm runeject”时出错。错误“删除未跟踪的文件,存储或提交任何更改,然后重试。”

Git添加所有修改,删除和未跟踪的文件?

使用 Git 检查脏索引或未跟踪文件

.gitignore立即生效

PHP删除链接从文件夹中取消链接文件但不从MSSQL表中删除行

git 使用操作