文件上传完内存没有得到释放, 导致一致累计, 最后崩溃自动重启
报错时的泄漏点(位置有点飘忽不定,这附近的代码都有概率报错): https://github.com/walkor/Workerman/blob/6614873e22d88f7eb761c39afcaf8301b4084283/Protocols/Http.php#L551
尝试了手动释放掉$_cache并没能解决问题
$_cache
附件为strace信息
strace
内存报错不一定是内存泄漏吧,可能上传的文件过大超过内存限制。还有可能是同一个进程同时在接收几个用户上传的文件,所有文件加一起导致内存超过限制。
上传完文件,运行 php start.php status 看下内存释放没。
找到一个曲线救国的方法: https://github.com/walkor/Workerman/issues/401#issuecomment-462043161 稍微优化了一下重启策略
Timer::add(5, function() use ($worker){ $memoryUsage = memory_get_usage(true); if (count($worker->connections) !== 0 && $memoryUsage < $this->memoryUsageLimit[1]) { return; } if ($memoryUsage > $this->memoryUsageLimit[0] || static::$requestCount > 10000) { static::$requestCount = 0; // Restart current process. Worker::stopAll(); } });
还有一点要注意: 最好是和前端沟通一下请求时在header中设置Connection: close, 或者服务端调用close()不保持链接, 增加触发的概率
Connection: close
close()
内存报错不一定是内存泄漏吧,可能上传的文件过大超过内存限制。还有可能是同一个进程同时在接收几个用户上传的文件,所有文件加一起导致内存超过限制。
上传完文件,运行 php start.php status 看下内存释放没。
找到一个曲线救国的方法: https://github.com/walkor/Workerman/issues/401#issuecomment-462043161
稍微优化了一下重启策略
还有一点要注意: 最好是和前端沟通一下请求时在header中设置
Connection: close
, 或者服务端调用close()
不保持链接, 增加触发的概率