我对PHP中的pcntl_fork
感到困惑。
我认为它支持多线程,但是它是如何工作的,我该如何在脚本中使用它呢?
发布于 2012-10-28 08:25:29
PCNTL无法创建线程。它只“分叉”当前的PHP进程。什么意思?当您调用pcntl_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、消息队列或低级语言程序可以做得更好。
派生的PHP程序很难阅读,理解和调试。维护这个程序将是一场噩梦。
不要犯错,避免分叉。你不需要它。你真正需要的是异步任务运行器。好消息是,有RabbitMQ和nice tutorial ;-)您也可以尝试使用名为Bunny的RabbitMQ库
PS:使用消息队列而不是forking会给你带来更多的好处。您可以使用多个服务器处理队列,并随着流量的增长进行水平扩展。
编辑2019-03-07
我使用过很多异步并发框架amphp
,在这里我不得不提一下。如果你真的需要在单个请求中运行异步非阻塞任务,我认为amphp
是目前最好的解决方案。它使用php生成器($value = yield $promise
)的概念来执行人类可读的代码,而无需使用类似于php的promise地狱。
https://stackoverflow.com/questions/10871293
复制相似问题