gpt4 book ai didi

php - 如何处理 pcntl_fork() : Error 35?

转载 作者:行者123 更新时间:2023-11-29 02:47:02 30 4
gpt4 key购买 nike

我有 php7 CLI 守护程序,它连续解析文件大小超过 50M 的 json。我正在尝试使用带有 pcntl_fork() 的单独进程将每 1000 个已解析数据条目保存到 mysql,并且对于 ~200k 行它工作正常。

然后我得到 pcntl_fork(): Error 35

我假设发生这种情况是因为 mysql 插入变得比解析慢,这导致生成越来越多的 fork,直到 CentOS 6.3 无法再处理它。

有没有办法捕获这个错误,求助于单进程解析和保存?或者有没有办法检查子进程数?

最佳答案

这是我根据@Sander Visser 评论所做的解决方案。关键部分是检查现有流程,如果流程过多,则采用相同的流程

class serialJsonReader{

const MAX_CHILD_PROCESSES = 50;
private $child_processes=[]; //will store alive child PIDs

private function flushCachedDataToStore() {

//resort to single process
if (count($this->child_processes) > self::MAX_CHILD_PROCESSES) {
$this->checkChildProcesses();

$this->storeCollectedData() //main work here
}

//use as much as possible
else {
$pid = pcntl_fork();
if (!$pid) {
$this->storeCollectedData(); //main work here
exit();
}
elseif ($pid == -1) {
die('could not fork');
}
else {
$this->child_processes[] = $pid;
$this->checkChildProcesses();
}
}
}

private function checkChildProcesses() {
if (count($this->child_processes) > self::MAX_CHILD_PROCESSES) {
foreach ($this->child_processes as $key => $pid) {
$res = pcntl_waitpid($pid, $status, WNOHANG);

// If the process has already exited
if ($res == -1 || $res > 0) {
unset($this->child_processes[$key]);
}
}
}
}
}

关于php - 如何处理 pcntl_fork() : Error 35?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40747472/

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