PHP无理由地随机停止执行-代码的随机更改可以修复它

bf1o4zei  于 2023-01-04  发布在  PHP
关注(0)|答案(3)|浏览(127)

在我们的平台上,用户的库存中可能有不同的产品组合。有时候,用户会向我们报告列出这些产品的页面崩溃了。这种"崩溃"实际上是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安装,并完成它,老实说,我可能会这样做,因为这是发生在生产,但这个问题是针对为什么会发生这种情况。

yr9zkbsy

yr9zkbsy1#

什么包含$prdLink?什么包含$prdImg?什么包含$prdTitle
这些变量是否经过正确的清理?是否包含"'>或任何可能破坏你的dom的字符?
如果有,恐怕你有更大的问题,安全问题(XSS等)。

tmb3ates

tmb3ates2#

经过一个非常详尽的徒劳的追逐,我得出了这个问题的(可能的)根本原因的结论:

记录到apache2/error.log文件中的错误和警告太多。

严重的是,这就像是数百警告日志每秒,文件有几GB大。我不知道为什么它会导致这种行为,但关闭所有日志但严重错误似乎解决了这个问题AFAIK(我们没有做任何其他事情,这是AFAIK,因为我们不能100%肯定这对我们所有的用户完全停止)。
也许是异常处理器本身的问题,就像前面提到的,也许是太多的异常需要处理,也许是PHP或Apache被太多的日志淹没了,我们永远不会知道。

  • 感谢大家的帮助,评论和回答,明确指出我到正确的方向。我是如此绝望,我甚至bounded这,我想。希望这将帮助另一个一无所知的开发人员在那里。*
wnrlj8wa

wnrlj8wa3#

我不知道这是一个错别字或你复制粘贴它,但<a href="https://some-link.com/something/注意到你错过了一个"(抱歉不评论,但没有足够的因果关系)

相关问题