PHP 是大多数常见安装中的单线程应用程序。JavaScript 也是如此,这意味着应用程序将始终只运行一项任务。
然而,与 JavaScript 不同的是,在 PHP 8.1 之前我们没有类似 Promise 的概念,因为 PHP 使用 1 个调用堆栈和 1 个内存堆。
当我说“在最常见的安装中”时,我是什么意思?考虑一下,例如,一个请求将由 Apache HTTPD 提供服务。当 PHP (HTTP) 请求到达时,Apache 执行脚本并返回响应。虽然脚本本身无法启动新线程,但 Apache 很高兴地派生出全新的进程来同时为多个 HTTP 请求提供服务。这种行为也可以在其他网络服务器上看到。
所以现在我们知道可以配置 Web 服务器以使用 PHP 实现并行编程。
回到主要问题:我们如何使用 PHP 实现并行编程?
一般来说,为了实现这样的实现,我们必须使用以下三种主要方法之一:
为了直观地理解这些解释,请记住这里的“进程”类似于 PHP Storm 应用程序(当然也包括任何 PHP 应用程序)。
在多处理(第一个选项)中,我们有两种主要的实现方法:
- 叉子
- 执行
要分叉一个应用程序,您必须使用扩展pcntl
,在这种方法中,我们实际上创建了一个新进程(具有其父进程),就像在单独的选项卡中打开一个新的PHP Storm 项目一样。这是使用 pcntl 扩展分叉 PHP 应用程序的完整教程。
在执行应用程序时,我们在 process 中运行一个文件,我们将保留结果以将其提供给父级。它使用简单的方法exec()
,根本不需要非常复杂的教程,但是如果您想了解更多信息并查看一些示例,可以访问此链接。
剩下的唯一一点是多处理根本没有效率。
在多线程中(第二个选项):
您可以将线程想象成在进程中创建的一袋指令。
要使用多线程方法,您必须安装ZTS PHP,这是一个扩展pthreads。使用适用于 PHP 7.4 的 Zend 线程安全 (ZTS)。PHP Agent 与 ZTS 模式集成,这有助于在 PHP 上检测多线程应用程序。
Pthreads 是您问题中的关键字,也是您正在寻找的操作示例。你可以在这里和这里找到。
请注意,在这种方法中,如果一个线程失败,整个过程将失败。
在分布式编程(最后一个选项)中,这可以通过以下方式完成:
Zeromq 或 Gearman 有一些工作人员负责完成此功能的主要工作。
如果你只需要在 JavaScript 中实现类似 Promise 的东西,你还有一些额外的选择:
正如我一开始所说,PHP 使用 1 个调用堆栈和一个内存堆,但是这些库有它们的低级库,用于异步运行代码;他们的核心有一个事件循环。