PHP 中的并行扩展是什么?如何使用它?

What is the parallel extension in PHP and how do I use it?

我一直在尝试为我的应用程序使用 PHP 中的线程,但找不到 Windows 的支持 DLL for PHP VC15 7.4。当我在 PHP 中寻找有关线程的更多详细信息和教程时,我发现 PHP 文档指向使用并行扩展而不是 pthreads 扩展,如您在 https://www.php.net/manual/en/intro.pthreads.php 中所见

它说

Consider using parallel instead.

我找不到任何代码示例或教程,也无法真正理解这个“并行”是什么,但我相信它一定很特别,因为 PHP 文档本身建议我考虑它.

PHP 是大多数常见安装中的单线程应用程序。 JavaScript 也是,这意味着应用程序将始终只 运行 一项任务。
然而,与JavaScript相反,我们在PHP中没有像promise这样的概念,直到8.1版本,因为PHP使用1个调用堆栈和1个内存堆。

我说“在最常见的安装中”是什么意思?例如,考虑一个请求将由 Apache HTTPD 提供服务。当 PHP (HTTP) 请求到达时,Apache 执行脚本并 returns 响应。虽然脚本本身无法启动新线程,但 Apache 乐于分叉出全新的进程来同时为多个 HTTP 请求提供服务。这种行为也可以在其他网络服务器上看到。

所以现在我们知道可以配置 Web 服务器以使用 PHP 实现并行编程。

回到正题:如何用PHP实现并行编程?

一般来说,为了实现这样的实现,我们必须使用以下3种主要方法之一:

  • 多处理
  • 多线程
  • 分布式处理

为了从视觉上理解解释,请记住这里的“进程”类似于 PHP Storm 应用程序(当然还有任何 PHP 应用程序)。


在多处理第一个选项)中,我们有两种主要的实现方法:

  1. 分叉
  2. 执行

要分叉应用程序,您必须使用像 pcntl 这样的扩展,在这种方法中,我们实际上创建了一个新进程(它有它的父进程),就像 打开一个新进程 PHP Storm 项目在单独的选项卡中。 here 是使用 pcntl 扩展分叉 PHP 应用程序的完整教程。

在执行一个应用程序时,我们运行一个文件正在处理,我们将保留结果以将其提供给父级。它使用简单的方法 exec() 并且根本不需要非常复杂的教程,但是如果您想了解更多信息并查看一些示例,您可以访问 this link.

唯一剩下的一点是多处理根本没有效率。


多线程中(第二个选项):

您可以将线程想象成在进程内部创建的一些指令包。

要使用多线程方法,您必须安装 ZTS PHP,它是 pthreads 的扩展。与 PHP 7.4 的 Zend 线程安全 (ZTS)。 PHP Agent 集成了 ZTS 模式,这有助于在 PHP.

上检测多线程应用程序

Pthreads 是您问题中的关键字,也是您正在寻找的操作示例。你可以发现 here and here.

请注意,在这种方法中,如果一个线程失败,整个过程将失败。


分布式编程中(最后一个选项),这可以通过:

  • socet编程

  • zeromq / gearman

Zeromq 或 Gearman 有一些 worker 负责完成此功能的主要工作。


如果您只需要在 JavaScript 中实现类似 promises 的东西,您还有一些额外的选择:

  • 在 PHP 8.1 及更高版本中:使用纤程并阅读 this 文档
  • 在 PHP < 8.1 中:将 Reactphp 与 this git 存储库
  • 一起使用

正如我在开头所说的,PHP 使用 1 个调用堆栈和一个内存堆,但是这些库具有用于 运行ning 代码异步的低级库;他们的核心有一个事件循环。