计算90,000+文件的MD5并存储到数据库

时间:2012-11-19 20:14:37

标签: php multithreading md5

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

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

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

2 个答案:

答案 0 :(得分:1)

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

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

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

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

答案 1 :(得分:0)

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

想象一下有3个php脚本:

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

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

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

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