2016-02-20 185 views
1

我有一个Web应用程序,用户可以上传文本文件。应用程序读取文本文件并根据文件数据执行30个不同的任务,并在几秒钟后向用户显示输出。设计PHP程序体系结构

我的方法是编写一个php程序,它将接受文本文件,然后调用不同的脚本(php和unix脚本)来执行30个不同的任务。

我有两个疑问:

  1. 我可以并行运行,以节省总执行时间30个不同的脚本?如果是的话,我应该在php中使用pthread库进行多线程?我读过一篇文章,指出多线程无助于Web应用程序节省执行时间。文章说,尽管所有的线程都可以并行运行,但是它们将需要相同的时间,就像它们按顺序运行一样。

  2. 我怎么知道所有的线程是否结束?如果我继续检查所有线程的执行情况,是不是会对系统资源造成负担?

回答

0

使用多个线程可以潜在地提高你的整体执行时间的速度,但它也可以潜在地使你想实现更加复杂的东西,所以一般应避免,除非速度的改进是真的值得你。另外,如果有人在加载网页时触发(如我怀疑的那样),那么使用线程几乎肯定是一个糟糕的计划。这更详细地讨论here。如果它被命令行触发,例如:

php processTextFile.php

然后,它可能是一些可能对你有益。

至于在这个特定的情况下,它会加快你的处理,这将取决于你在做什么。

从你如何你一句话的问题,你可以尝试做两件事情:

  1. 运行任务的一个文本文件管道。在这种情况下,运行第一个任务后收到的数据将与初始数据不同,然后您将通过第二个任务运行这些新数据。 (例如,也许你有一个JSON编码对象,第一个任务是将它解码成一个数组)。如果你这样做,那么多线程将不会帮助你,因为每个线程都需要你初始化线程时需要使用的数据。

  2. 在原始文件中执行所有单独的任务,然后返回处理后的数据以返回您的结果。在这种情况下,多线程将起作用。

如果多线程仍然有效为您的使用情况下,则:

  • 您可以同时运行30个脚本。你会发现只有在你有多个处理器或多个核心的盒子上才会有性能提升,因为它可以让电脑同时使用两者
  • 你可以使用pthread来达到这个目的(95%肯定,this thread支持这种看法)
  • 工作如何实际使用它,你可能想看看在实施GitHub的项目的例子
0

一些人,当遇到一个问题,想:“我知道,我会使用线程,“然后他们有两个具有错误。

与其试图并行化这30个脚本,我反而会建议专注于提高性能。当然,这取决于您尝试执行的具体任务以及这些上传文件的大小。

阻塞点之一通常是变频器的I/O。所以,如果你能找到一个合理的方式来使用ramFS的缓存(用于php脚本)(对于php和shell脚本),它可能会提高执行这些任务的速度。

这就是说,实际上不知道具体情况,真的很难给出任何非模糊的建议:(