【发布时间】:2021-04-01 15:26:18
【问题描述】:
我有一个以 Laravel 作为后端的预订系统 web 应用程序(一切正常,授权、请求、编辑用户详细信息和其他对象也是如此)。
我有编辑营业时间的特殊设置。我创建了一个名为 Intervals 的特殊类,它可以帮助我计算可用小时数,如果给定时间戳可用,则根据用户设置返回所有不可用天数等。
问题
当我尝试初始化 Intervals 类时,问题就来了,例如:
Log::info("before Intervals"); // gets logged
$opened = new Intervals();
Log::info("after Intervals"); // doesn't get logged
正如你在这里看到的,它有一个非常简单的构造函数,没有昂贵的计算和函数调用(除了 Laravel 日志函数 - 日志不是导致问题的原因):
public function __construct (array $from = [], array $to = []) {
Log::info("__construct: $from, $to"); // doesn't get logged
if (count($from) !== count($to)) {
$this->from = [];
$this->to = [];
} else {
$this->from = $from;
$this->to = $to;
}
Log::info("__construct: $this->from, $this->to"); // doesn't get logged either
}
我尝试记录请求执行的每个步骤。 Intervals 点之前的所有内容都会毫无问题地记录下来,但是当它到达 new Intervals(); 时,它会将我的 VPS 的 CPU 峰值提高到 90%,并且它甚至不记录构造函数中的文本! 我试着等了几分钟,结果还是卡住了!
注意:完全相同的代码在我的 PC 上运行没有问题(两台计算机从同一个 git 存储库运行相同的代码)。
我试图解决的问题:
- 将 vCPU 数量增加到 2 并且不共享 - 现在它会飙升到 50%,可能是因为它只运行一个单核 - 一半 => 50%
- 将 RAM 增加到 4GB - 之前和之后完全没有峰值
见鬼是什么问题?为什么用这么简单的构造函数初始化那个类会有问题?
编辑:我反复查看所有 apache2、mysql、Laravel 错误日志,但没有任何相关内容。
【问题讨论】:
-
"__construct: $from, $to"应该生成警告,因为您不能只在字符串中打印数组(数组不能自动转换为字符串)。不确定这与您遇到的问题有什么关系,但以防万一。 -
你能分享更多细节吗?如果您从该构造函数中删除行,会发生什么?哪一行导致了问题?
-
会不会有一个不同的类
Intervals在某个地方被调用?您是否使用了正确的命名空间?除了记录,您可以尝试dd('test');并查看执行是否停止? -
其他人怎么知道你班里发生了什么?如果您分享了更多详细信息,其他人可以查看此内容
-
@SenTisso 如果您使用的是自动加载器,那么您的类会在您第一次引用/实例化它时包含在内。类的源文件是否包含类定义本身以外的代码?也可能是自动加载器本身以某种方式崩溃/进入无限循环。
标签: php laravel oop google-compute-engine vps