使用api下载1000张图像

时间:2013-05-17 13:20:27

标签: php cron fork

我必须在cron作业中使用api下载1000张图像。代码工作正常,但我想优化它。我想要,如果我必须下载1000张图片。主文件将作业分为10个部分(每个100个图像下载)并将作业分配给10个文件(可能是同一文件的10个实例)10 * 100 = 1000个图像(如多线程)。我可以用curl但它在同一台服务器上,那么是否应该有更快的方式来运行文件?我想做多线程。主文件将由cron job调用,其余工作应该像多线程一样。是$ pid = pcntl_fork();是好的和安全的方式?

1 个答案:

答案 0 :(得分:1)

编写高性能HTTP爬虫/下载器并非易事。我会描述,我是怎么做的。请注意,有很多解决方案,因此如果您想深入了解此主题,可能需要阅读Modern Operating Systems by Andrew S. Tanenbaum

  1. 将需要下载的所有网址放入数据库。
  2. 主进程连接数据库并确定有多少下载,并使用此参数设置工作程序的下载量。 然后关闭数据库连接。
  3. 主进程使用pcntl_fork()来启动您希望运行的工作量。 (是的,这是安全的,但使用起来并不容易。)
  4. 每个工作人员应分别连接到数据库 ,并对其希望处理的URL建立读写锁定。如果是MySQL,您可以使用SELECT... FOR UPDATE
  5. 工作人员应使用其在数据库中正在进行的PID标记其处理的记录,然后释放数据库锁。
  6. 工作人员处理下载,然后更新已完成的数据库。
  7. 一旦所有工作人员完成了他们的共享并退出(参见pcntl_wait()),主进程将打开一个数据库连接并清除所有崩溃的工作人员可能已离开的所有正在进行的标记。然后它关闭数据库连接。
  8. 重复此过程,直到所有下载完成。
  9. 这是相对安全的旅行路径。但是,请记住,您正在使用超出普通(甚至经验丰富的)PHP编码器知识水平的方法。您必须了解Linux(或Windows)流程模型的工作原理,否则您手中会有一个非常破碎的应用程序。