0

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

它说

考虑改用并行。

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

4

1 回答 1

5

PHP 是大多数常见安装中的单线程应用程序。JavaScript 也是如此,这意味着应用程序将始终只运行一项任务。
然而,与 JavaScript 不同的是,在 PHP 8.1 之前我们没有类似 Promise 的概念,因为 PHP 使用 1 个调用堆栈和 1 个内存堆。

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

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

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

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

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

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


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

  1. 叉子
  2. 执行

要分叉一个应用程序,您必须使用扩展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 使用 1 个调用堆栈和一个内存堆,但是这些库有它们的低级库,用于异步运行代码;他们的核心有一个事件循环。

于 2022-01-01T06:52:38.747 回答