我必须在 cron 作业中使用 api 下载 1000 张图像。代码工作正常,但我想优化它。我想,如果我必须下载 1000 张图片。主文件将作业分为 10 个部分(每个部分下载 100 个图像)并将作业分配给 10 个文件(可能是同一文件的 10 个实例)10*100 = 1000 个图像(如多线程)。我可以用 curl 但它在同一台服务器上,所以应该有更快的方法来运行文件吗?我想做多线程。主文件将被cron作业调用,其余工作应该像多线程一样。是 $pid = pcntl_fork(); 是好又安全的方法吗?
问问题
205 次
1 回答
1
编写高性能的 HTTP 爬虫/下载器并非易事。我会描述,我会怎么做。请记住,有很多解决方案,因此如果您想更深入地研究这个主题,您可能需要阅读Andrew S. Tanenbaum 的 Modern Operating Systems。
- 将所有需要下载的 URL 放入数据库。
- 主进程连接数据库并确定有多少下载,并使用此参数设置工作人员的下载量。然后它关闭数据库连接。
- 主进程用于
pcntl_fork()
启动您希望运行的工作人员数量。(是的,它是安全的,但它并不容易使用。) - 每个工作人员应该单独连接到数据库并在它希望处理的 URL 上建立一个读写锁。如果是 MySQL,您将使用
SELECT... FOR UPDATE
. - worker 应该用它的 PID将它处理的记录标记为在数据库中进行,然后释放数据库锁。
- 工作人员处理下载,然后更新已完成的数据库。
- 一旦所有工作人员都完成了他们的共享并退出(请参阅 参考资料
pcntl_wait()
),主进程将打开一个数据库连接并清除任何崩溃的工作人员可能留下的所有正在进行的标志。然后它关闭数据库连接。 - 重复该过程,直到所有下载完成。
这是一条相对安全的旅行路线。但是,请记住,您正在玩的东西超出了普通(甚至经验丰富的)PHP 编码人员的知识水平。您必须阅读 Linux(或 Windows)进程模型的工作原理,否则您手中的应用程序将非常糟糕。
于 2013-05-21T09:24:51.907 回答