【问题标题】:Calculate MD5 of 90,000+ files and store to a database计算 90,000 多个文件的 MD5 并存储到数据库
【发布时间】:2023-11-25 14:27:02
【问题描述】:

我正在编写一个脚本来下载我的所有图像,计算 MD5 哈希,然后将该哈希存储在数据库的新列中。我有一个脚本,可以从数据库中选择图像并将它们保存在本地。图像的唯一 ID 成为文件名。

我的问题是,虽然cURLQueue 非常适合快速下载许多文件,但在回调中计算每个文件的 MD5 哈希会减慢下载速度。那是我的第一次尝试。对于我的下一次尝试,我想将我的代码的下载和散列部分分开。做这个的最好方式是什么?我更喜欢使用 PHP,因为这是我最熟悉的,也是我们的服务器运行的,但 PHP 的线程支持至少可以说是缺乏。

想法是有一个父进程建立 SQLite 连接,然后产生许多选择图像的子进程,计算它的哈希值,将其存储在数据库中,然后删除图像。我走的是正确的道路吗?

【问题讨论】:

标签: php multithreading md5


【解决方案1】:

有很多方法可以解决这个问题,但您选择哪种方法实际上取决于您项目的具体情况。

一种简单的方法是使用一个 PHP 下载图像,然后将它们放在文件系统上,并将一个条目添加到队列数据库中。然后第二个 PHP 程序会读取队列,并处理那些等待的。

对于第二个 PHP 程序,您可以设置一个 cron 作业来定期检查并处理所有正在等待的内容。第二种方法是每次下载完成时在后台生成 PHP 程序。第二种方法更优化,但涉及更多一点。查看下面的帖子,了解如何在后台运行 PHP 脚本。

Is there a way to use shell_exec without waiting for the command to complete?

【讨论】:

  • 最终以不同的方式解决了问题,但这是一个很好的答案。
【解决方案2】:

我在工作中遇到过类似的问题,但它需要像 rabbitmq 这样的 amqp 服务器。

假设有 3 个 php 脚本:

  • 首先:将 url 添加到队列中
  • 第二个:从队列中获取url,下载文件并将下载的文件名添加到队列中
  • 第三个:获取文件名到队列,并将md5设置到数据库中

我们使用这种方式来处理使用python脚本的多个图像下载/处理(php不是那么远)。

您可以查看一些 php 库 here 和一些基本示例 here

通过这种方式,我们可以根据每个队列长度扩展每个工作人员。因此,如果您要下载大量 url,您只需启动另一个脚本 #2,如果您有很多未处理的文件,您只需启动一个新脚本 #3,依此类推。

【讨论】:

    最近更新 更多