如何解决初始化类时PHP执行卡住使用简单的构造函数 问题
我有一个以 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 错误日志,但没有任何相关内容。
解决方法
我简直不敢相信......当 for 循环条件减少时,整个服务器只会变得像 sh*t。
我在 Intervals
类的一个方法中拥有这部分代码。它应该合并重叠的“从到”间隔,其中 $from
和 $to
都是整数数组:
$f = count($from);
$t = count($to);
if ($f !== $t || $f <= 0) return [$from,$to];
array_multisort($from,$to); // sort those arrs,so it can check those arrs gradually
for ($i = 0; $i < $f; $i++) {
for ($j = $i+1; $j < $f; $j++) { // continue from the next interval
if ($to[$i] >= $from[$j]) { // if the next interval overlaps the current one
$to[$i] = max([$to[$i],$to[$j]]);
// delete the next interval,because it merged with the current one
array_splice($from,$j,1);
array_splice($to,1);
$f--; // decrement the array count,because one item got removed
$j--;
}
}
}
为了修复“错误”,我不得不将其修改为一个版本,其中 for 循环条件(变量 $f
)未被修改(递减):
$f = count($from);
$t = count($to);
if ($f !== $t || $f <= 0) return [$from,$to);
for ($i = 0; $i < count($from); $i++) { // count instead of $f
for ($j = $i+1; $j < count($from); $j++) { // count instead of $f
if ($to[$i] >= $from[$j]) {
$to[$i] = max([$to[$i],$to[$j]]);
array_splice($from,1);
/* the $f--; part is no longer here */
$j--; // <-- weirdly,it has no problems with this part
}
}
}
我这样编码第一部分,因为我想提高性能,在每次循环迭代时不调用 count()
并且只是在数组更改时递减“静态”计数(项目被删除) .
我完全不知道为什么这是一个专门针对我的 VPS 的问题(ubuntu、apache2、PHP 7.4.3)。它只使用 100% 的 CPU (或 100% 的一个内核),没有错误,没有警告,没有 PHP 超时,什么都没有......当我运行我的 PC 上的代码完全相同(Windows 10、xampp、PHP 7.4.3),一切正常。
另一个奇怪的事情是,执行问题发生在之前构造函数中的任何内容被执行并且之前方法本身甚至被调用!或者,也许所有这些都先秘密执行,然后“返回结果”,例如日志、打印等?
也许 VPS 只是在跟我玩愚人节,我不知道...
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。