gpt4 book ai didi

php - pcntl_fork 在 PHP 中如何工作?

转载 作者:IT王子 更新时间:2023-10-29 00:10:48 26 4
gpt4 key购买 nike

我对 pcntl_fork 感到困惑在 PHP 中。

我认为它是多线程的,但它是如何工作的以及我将如何在脚本中使用它?

最佳答案

PCNTL 无法创建线程。它只会“ fork ”当前的 PHP 进程。这是什么意思?当您调用 pcntl_fork() 时,当前进程被分成两个进程。父进程的整个命名空间被复制到子进程中,两个进程继续并行执行,只有一个区别:pcntl_fork() 在父进程中返回子进程的 PID,在子进程中返回 0

一些提示:

  • 默认禁用。如果您设法启用它,则仅对 CLI 执行此操作。永远不要在网络服务器上使用它!它将以不确定的方式运行。它还可以使整个机器停机。请将其禁用并继续阅读。
  • 进程之间的通信是可能的,但很糟糕(通过共享内存中的序列化对象)。
  • 文件描述符(和数据库连接)是共享的,这经常会导致问题。 您必须在 fork 后重新连接您的数据库,否则当所有 fork 进程中的第一个关闭连接时,您会收到诸如 MySQL server has gone away 之类的错误。
  • 父进程必须等待子进程完成,否则它将离开僵尸消耗系统资源的进程。

这是例子 from documentation :

<?php

$pid = pcntl_fork();
if ($pid == -1) {
die('could not fork');
} else if ($pid) {
// we are the parent
pcntl_wait($status); //Protect against Zombie children
} else {
// we are the child
}

但请记住,PHP 只是脚本语言。它不是为并行计算而设计的。根据您的需要,同时运行 CRON、消息队列或使用低级语言的程序,您可以做得更好。

fork 的 PHP 程序很难阅读、理解和调试。维护该程序将是一场噩梦。

不要犯错,避免 fork 。你不需要它。您真正需要的是异步任务运行程序。好消息,有RabbitMQnice tutorial ;-) 您也可以尝试名为 Bunny 的有前途的 RabbitMQ 库

PS:使用消息队列而不是 fork 会给您带来更多优势。您可以使用多台服务器处理队列,并随着流量的增长水平扩展。

编辑 2019-03-07

异步并发框架amphp玩了很多,这里不得不提一下。如果您真的需要在单个请求中运行异步非阻塞任务,我认为 amphp 是目前最好的解决方案。它使用 php 生成器 ($value = yield $promise) 的概念来执行人类可读的代码,而没有类似 reactphp 的 promise hell 。

https://amphp.org/

关于php - pcntl_fork 在 PHP 中如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10871293/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com