pcntl_fork如何在PHP中工作?
我对PHP中的pcntl_fork
感到困惑。
我认为它具有多线程功能,但是它是如何工作的,我该如何在脚本中使用它?
我对PHP中的pcntl_fork
感到困惑。
我认为它具有多线程功能,但是它是如何工作的,我该如何在脚本中使用它?
PCNTL 不能创建线程。它只“分叉”当前的PHP进程。这是什么意思?调用 时,当前进程被拆分为两个进程。父进程的整个命名空间被复制到子进程中,并且两个进程继续并行执行,只有一个区别:返回父进程和子进程中的子进程的 PID。pcntl_fork()
pcntl_fork()
0
一些提示:
MySQL server has gone away
以下是文档中的示例:
<?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和漂亮的教程;-)你也可以尝试有前途的兔子MQ库,叫做兔子
PS:使用消息队列而不是分叉会给您带来另一个优势。您可以使用多个服务器处理队列,并随着流量的增长而水平扩展。
编辑 2019-03-07
我玩过很多异步并发框架,我必须在这里提到它。如果您确实需要在单个请求中运行异步非阻塞任务,我认为是当今的最佳解决方案。它使用php生成器()的概念来执行人类可读的代码,而无需类似reactphp的承诺地狱。amphp
amphp
$value = yield $promise