我遇到了同样的问题并在没有 XDebug 的情况下解决了。不幸的是,我找不到 XDebug 的方法。就像它不关心任何分叉的进程一样。
我通过使用Xhprof来分析和Xhgui来检查日志来解决。Xhprof 是一个很棒的工具,由 Facebook 内部开发,然后开源发布。很酷的是,您可以准确地决定何时开始分析以及何时停止。这使您能够解决我们的问题。
所以首先让我们安装它!
sudo pecl install xhprof-beta
如果您使用的是基于 debian 的发行版,请确保您也安装了 graphviz。
sudo apt-get install graphviz
现在让我们看一下代码。
$children = [];
do {
if (count($children) < $maxConsumers) {
$pid = pcntl_fork();
$children[] = $pid;
if ($pid == -1) {
throw new \RuntimeException('Could not fork process');
} else if ($pid === 0) {
// we are the child
if ($verbose) {
$output->writeln(sprintf('Child here (PID = %s)', posix_getpid()));
}
if ($xhProf) {
// here we enable xhprof thus the profiling starts
xhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY);
}
// DO YOUR MAGIC HERE!
if ($xhProf) {
// and here we call the xhgui header file that will
// stop xhprof and write all the gathered data into
// mongo or into a dedicated file
require_once('/var/www/xhgui/external/header.php');
}
exit;
} else {
// we are the parent
if ($verbose) {
$output->writeln(sprintf('Parent here (PID = %s) spawned a new child (PID = %s)', posix_getpid(), $pid));
}
}
} else {
if ($verbose) {
$output->writeln(sprintf("Parent - spawned enough children, let's wait them..."));
}
$deadPID = pcntl_wait($status);
$children = array_diff($children, [$deadPID]);
} while (true);
// Waits for all remaining children
while (($pid = pcntl_waitpid(0, $status)) != -1) {
if ($verbose) {
$status = pcntl_wexitstatus($status);
$output->writeln(sprintf("Child (PID %d) terminated. Status is %s.", $pid, $status));
}
}
为了检查您的日志,您还需要正确配置 Xhgui。您可能还需要一个虚拟主机。
对于所有需要的配置和参考: