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 应用程序)。
在多处理(第一个选项)中,我们有两种主要的实现方法:
- 分叉
- 执行
要分叉应用程序,您必须使用像 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 使用 1 个调用堆栈和一个内存堆,但是这些库具有用于 运行ning 代码异步的低级库;他们的核心有一个事件循环。
我一直在尝试为我的应用程序使用 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 应用程序)。
在多处理(第一个选项)中,我们有两种主要的实现方法:
- 分叉
- 执行
要分叉应用程序,您必须使用像 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 使用 1 个调用堆栈和一个内存堆,但是这些库具有用于 运行ning 代码异步的低级库;他们的核心有一个事件循环。