首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >pcntl_fork在PHP中是如何工作的?

pcntl_fork在PHP中是如何工作的?
EN

Stack Overflow用户
提问于 2012-06-03 22:49:54
回答 1查看 23.9K关注 0票数 27

我对PHP中的pcntl_fork感到困惑。

我认为它支持多线程,但是它是如何工作的,我该如何在脚本中使用它呢?

EN

回答 1

Stack Overflow用户

发布于 2012-10-28 08:25:29

PCNTL无法创建线程。它只“分叉”当前的PHP进程。什么意思?当您调用pcntl_fork()时,当前进程被拆分为两个进程。

一些提示:

  • 它在默认情况下是禁用的。如果您设法启用了它,则仅为CLI启用它。永远不要将它与web服务器一起使用!它将以不确定的方式运行。它还可以使整个机器停机。请将其禁用,并且可以在进程之间读取on.
  • Communication,但这很可怕(通过共享内存中的序列化对象)。
  • 文件描述符(和数据库连接)是共享的,这经常会导致问题。您必须在派生之后重新连接数据库,否则当第一个派生进程关闭时,所有派生进程都会出现类似MySQL server has gone away的错误。

下面是from documentation示例

代码语言:javascript
复制
<?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、消息队列或低级语言程序可以做得更好。

派生的PHP程序很难阅读,理解和调试。维护这个程序将是一场噩梦。

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

PS:使用消息队列而不是forking会给你带来更多的好处。您可以使用多个服务器处理队列,并随着流量的增长进行水平扩展。

编辑2019-03-07

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

https://amphp.org/

票数 54
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10871293

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档