在我们的平台上,用户的库存中可能有不同的产品组合。有时候,用户会向我们报告列出这些产品的页面崩溃了。这种"崩溃"实际上是PHP无缘无故地停止呈现某个产品,然后不呈现页面的其余部分(例如,PHP不包含页脚文件,因此页面只在半渲染产品处结束)。
有时它在完全渲染后停在一个随机的产品上,有时它只渲染一个产品的图像,并在那里停止整个页面的渲染。
对代码看似随机的修改似乎会使崩溃停止。我的意思是什么?如果我在乘积循环中的任何地方添加以下代码:
第一个月
它会停止错误。就在今天我决定打开php.ini的显示错误,这就修复了一些家伙的错误。关闭它又回来了。当我改变循环的语法时,一些其他的用户被修复了<?php foreach ($inventory as $code) : ?>
到
<?php
foreach ($inventory as $code)
{
这是循环的当前代码:
<div class="myProductsList">
<?php
$inventory = GetUserInventory($user, $plan);
if ($inventory)
{
$evenOdd = false;
foreach ($inventory as $code)
{
$product = GetProductObject($code, $plan);
$product = $product[0]->ID;
if ($product)
{
$prdTitle = get_the_title($product);
$prdDate = get_the_date('F, Y', $product);
$prdImg = get_the_post_thumbnail_url($product);
$prdLink = str_replace('/offer/', '/product/', get_the_permalink($product));
$evenOdd = !$evenOdd;
$tagCloud = get_field("prd_tagcloud", $product);
$owner = false;
include 'parts/product-card.php';
}
}
}
?>
</div>
这是产品卡的当前代码
<div class="productCard altCard_<?=$evenOdd;?> <?=$owner;?>" stamp="<?=get_the_date('U', $product);?>">
<div class="productCardCont fullw fullh cont col">
<a href="<?=$prdLink;?>">
<img class="fullw" src="<?=$prdImg;?>">
</a>
<div class="productCardAbout fullw hcent cont col npad">
<h3 class="fullw fcent"><?=$prdTitle;?></h3>
<span class="fullw fcent"><?=$prdDate;?></span>
<div class="productCardWarp"></div>
<div class="ctaMain cont col hcent" id="#ctaMain">
<?=ctaMain($prdLink, "Select");?>
</div>
</div>
<span style="display:none!important;"><?=$tagCloud;?></span>
</div>
</div>
我完全不知道是什么原因造成的,特别是因为当我打开它们时没有出现错误,没有产品有任何无效或损坏的数据(如您所见,我只提取它们的图像,名称和日期),没有库存代码是错误的,与我们的虚拟机的规格功能相比,我们的用户非常少,页面加载速度总是非常快,正如我所说:
随机用户,似乎没有什么共同的经验,这些问题,和"修复"往往毫无意义。
最后一件事。有时候为了调查这些错误报告,我会复制用户的清单并将其设置到我自己的测试帐户(这样我们就有了相同的清单)。有时候我的帐户会遇到错误,有时候不会。
- 我所说的"库存"**是我们数据库中的一个表,每个用户都有一行,库存只是我们每个产品的内部代码的逗号分隔序列,代码是一个简单的数字和字母的组合。
导致我的帐户崩溃的库存示例:F2112S04E6B,F2105S03E05,FL21M03V2,F2106S03E06,F2107S04E01,FL20M03V1,F2109S04E03,F2110S04E04,F2111S04E05,F2202S05E02,F2006S1E00,F2208S06E02,F2209S06E03,
有时候,如果我从其中删除一个随机产品,它会停止崩溃。
PHP版本:PHP 8.0.18数据库:10.6.7-MariaDB
我正在Bitnami WordPress堆栈上运行
- 问题:是什么导致了这个错误?**我知道这是一个复杂的环境,可能有很多错误,但是看看我提供的代码,有什么看起来可能是错误的吗?
如果我所描述的错误不够清楚,请与我坦露,因为这是一个非常独特的情况,我从来没有遇到过,我会尽我所能,使它更清楚地为您。
编辑
Tim Morton在评论中提出了一些相关的主题,所以我将在这里回答他们,以改善这个问题的上下文。
- '您的第一个"修复"是打印javascript命令?'*
- 我打印了多个JS命令(console.log),只是为了看看PHP脚本在什么时候崩溃了。当我运行它时,我注意到这些console.log命令的简单存在,出于某种奇怪的原因,修复了崩溃本身。
- '然后改变了你的循环语法?这似乎是漫无目的的'*
- 是的,是的,它看起来确实漫无目的,但相信我,它起作用了。这就是为什么我目瞪口呆,因为它不应该。
- '是否打印所有php生成的内容,然后使某些javascript失败?'*
- 不,这里没有Javascript。唯一的JS是后来添加的(console.log),正如我解释的,为了查看PHP在什么时候崩溃。它通常打印PHP生成的product-card.php(包含在循环中),并在出现随机乘积时停止打印任何内容,即使是在循环之外。
- '还是在php循环的某个特定部分失败了?'*
- 我很肯定它在PHP循环中,但我还没有能够缩小它。
- '要进行诊断,您可以使用try/catch和error_log()来帮助将范围缩小到实际发生故障的地方。'*
- 会的!问题是,简单地添加一个try/catch可能会"修复它",因为正如我前面所说,对代码的随机更改似乎会暂时"修复"这个问题。
- '同一记录是否每次都失败(提示,它可能是实际失败的下一个记录)'*
- 到目前为止,这似乎是随机的。我试着修改库存记录,将不同的产品放在不同的订单上。这有时有效,有时无效。到目前为止,没有出现任何模式。
- 更新**
到目前为止,我已经注意到两种类型的崩溃:一种是在product-card.php迭代的中途打印出来,然后崩溃(所以它甚至没有到达其他迭代);另一种是在第二次迭代时崩溃。
在这个特定的例子中,我已经能够通过Chrome开发工具看到前端代码,我注意到它就在这里崩溃了,在product-card.php<a href="https://some-link.com/something/
正如你所看到的,它崩溃后的回声,因为它甚至没有把结束引号和'〉'。
在另一种崩溃类型中,它也会在随机迭代中崩溃,只有在最后一次迭代中,它才会完成渲染它所在的任何卡,然后崩溃,而不是中途崩溃。
我看到人们评论说,我应该只是更新或修改我的PHP安装,并完成它,老实说,我可能会这样做,因为这是发生在生产,但这个问题是针对为什么会发生这种情况。
3条答案
按热度按时间yr9zkbsy1#
什么包含
$prdLink
?什么包含$prdImg
?什么包含$prdTitle
?这些变量是否经过正确的清理?是否包含
"
,'
,>
或任何可能破坏你的dom的字符?如果有,恐怕你有更大的问题,安全问题(XSS等)。
tmb3ates2#
经过一个非常详尽的徒劳的追逐,我得出了这个问题的(可能的)根本原因的结论:
记录到
apache2/error.log
文件中的错误和警告太多。严重的是,这就像是数百警告日志每秒,文件有几GB大。我不知道为什么它会导致这种行为,但关闭所有日志但严重错误似乎解决了这个问题AFAIK(我们没有做任何其他事情,这是AFAIK,因为我们不能100%肯定这对我们所有的用户完全停止)。
也许是异常处理器本身的问题,就像前面提到的,也许是太多的异常需要处理,也许是PHP或Apache被太多的日志淹没了,我们永远不会知道。
wnrlj8wa3#
我不知道这是一个错别字或你复制粘贴它,但
<a href="https://some-link.com/something/
注意到你错过了一个"
(抱歉不评论,但没有足够的因果关系)