设计PHP程序架构

时间:2016-02-20 05:33:58

标签: php multithreading architecture

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

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

我有两个问题:

  1. 我可以并行运行30个不同的脚本以节省总体执行时间吗?如果是,那么我应该在php中使用pthread库进行多线程吗?我在一篇文章中读到多线程在Web应用程序中没有帮助以节省执行时间。文章说尽管所有线程都会并行运行,但它们会花费相同的时间,就好像它们按顺序运行一样。

  2. 我怎么知道所有线程都结束了?如果我继续检查所有线程的执行情况,那么它不会成为系统资源的开销吗?

2 个答案:

答案 0 :(得分:0)

使用多个线程可能会提高整体执行时间的速度,但它也可能使你想要实现的目标变得更加复杂,所以通常应该避免它,除非速度改进真的值得你

此外,如果有人在加载网页时触发(我怀疑),那么使用线程几乎肯定是一个糟糕的计划。这将更详细地讨论here。如果它是从命令行触发的,例如:

<form name="form"> <input type="text" ng-model="name"><br /> <input type="text" ng-model="description"><br /> <input type="file" ng-file-model="image" name="image" /> <button type="submit" ng-click="submit()">submit</button> </form>

然后它可能会对你有所帮助。

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

从你如何说出你的问题,你可能会尝试做两件事:

  1. 在文本文件上运行任务管道。在此上下文中,在运行第一个任务后收到的数据与初始数据不同,然后您将通过第二个任务运行此新数据。 (例如,您可能有一个JSON编码对象,第一个任务是将其解码为数组)。如果您这样做,那么多线程将无法帮助您,因为每个线程都需要在您初始化线程时需要使用的数据。

  2. 在原始文件上执行单​​独的任务,然后返回已处理的数据以返回结果。在这种情况下,多线程可以工作。

  3. 如果多线程对您的用例仍然有效,那么:

    • 您可以并行运行30个脚本。您可能会在只有多个处理器或多个核心的盒子上看到性能提升,因为它允许计算机同时使用这两个处理器
    • 您可以使用pthread实现此目的(95%肯定,this thread支持该视图)
    • 要弄清楚如何实际使用它,您可能需要查看实现的GitHub项目中的示例

答案 1 :(得分:0)

  

有些人在面对问题时会思考,“我知道,我会使用线程,&#34;然后两个他们有问题。

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

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

尽管如此,如果不知道具体细节,很难给出任何非模糊的建议:(