设计 PHP 程序体系结构


Designing PHP program architecture

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

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

我有两个疑问:

  1. 我可以并行运行 30 个不同的脚本以节省整体执行时间吗?如果是,那么我应该在 php 中使用 pthread 库进行多线程处理吗?我在一篇文章中读到,多线程在 Web 应用程序中无助于节省执行时间。文章说,虽然所有线程都将并行运行,但需要的时间与按顺序运行的时间相同。

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

使用多个线程可能会提高整体执行时间的速度,但它也可能使您尝试实现的目标变得更加复杂,因此通常应避免使用,除非速度改进对您来说真的值得。

此外,如果这是由加载网页的人触发的(正如我怀疑的那样),那么使用线程几乎可以肯定是一个糟糕的计划。这里对此进行了更详细的讨论。如果从命令行触发,例如:

php processTextFile.php

那么它可能会使您受益。

至于在这种特定情况下它是否会加快您的处理速度,这将取决于您到底在做什么。

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

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

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

如果多线程对您的使用案例仍然有效,则:

  • 您可以并行运行 30 个脚本。您倾向于仅在具有多个处理器或多个内核的机箱上看到性能提升,因为它将允许计算机同时使用两者
  • 您可以使用 pthread 来实现此目的(95% 确定,此线程支持该视图)
  • 要弄清楚如何实际使用它,您可能需要查看实现的GitHub项目上的示例

有些人在遇到问题时会想,"我知道,我会用线",然后他们有两个线程。

与其尝试并行化这 30 个脚本,我建议专注于提高性能。当然,这取决于您尝试执行的特定任务以及上传的文件有多大。

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

也就是说,在不知道具体细节的情况下,真的很难给出任何含糊不清的建议:(