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

Abd*_*rai 3 php php-pthread

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

它说

考虑使用并行代替。

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

beh*_*ehi 9

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

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

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

回到主要问题:如何用PHP实现并行编程

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

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

为了直观地理解这些解释,请记住这里的“进程”类似于 PHP Storm 应用程序(当然也包括任何 PHP 应用程序)。


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

  1. 执行

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

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

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


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

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

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

Pthreads 是您问题中的关键字以及您正在寻找的操作示例。您可以在这里这里找到它。

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


分布式编程最后一个选项)中,可以通过以下方式完成:

  • 社会编程

  • Zeromq / gearman

Zeromq 或 Gearman 有一些工作人员来完成实现此功能的主要工作。


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

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

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