使用Yii2框架的Ajax请求太慢

时间:2018-07-01 15:08:39

标签: php jquery ajax performance yii2

<div class="clock">
  <div class="clock-face">
    <div class="hand hour-hand"><span id="hourspan">Stunde</span></div>
    <div class="hand min-hand"><span id="minspan">Minute</span></div>
    <div class="hand second-hand"><span id="secondspan">Sekunde</span></div>
  </div>
</div>

这是jQuery AJAX函数,运行良好,但耗时约2700毫秒,任何客户都不接受。

$(function () {
    $('#barcode-form').on('submit', function (e) {
      $.ajax({
        type: 'post',
        url: '<?= Url::to(['/sales/cart-barcode']) ?>',
        data: $('#barcode-form').serialize(),
        success: function () {
            $( '#barcode-form' ).each(function(){this.reset();});
            document.getElementById("pcode").focus();
        }
      });
    });
});

在后端,我将获取AJAX请求的数据并编辑我的表,如以下操作所示:

<form  id="barcode-form">
    <?php
    $a=array();
    foreach ($productsAvailable as $product){      
        array_push($a,$product->product_code);
    }

    echo TypeaheadBasic::widget([
        'name' => 'pcode',
         'id' => 'pcode',
        'data' =>  $a,
        'options' => ['placeholder' => 'Filter as you type ...'],
        'pluginOptions' => ['highlight'=>true],
    ]); 
    ?> 
    <input type="submit" hidden/>
</form>

有人有主意吗?

1 个答案:

答案 0 :(得分:1)

您需要执行一些profiling才能找到部分缓慢的代码。此时,您唯一能得到的就是盲目猜测。


但这是我的镜头:

$invoice = Invoice::find()->where(['status' => 1])->one();

您应该对此非常小心。 one()没有在查询中隐式设置任何限制。这意味着如果您有100万张发票,其中status等于1,这会将它们全部加载到PHP并仅选择第一个,而忽略其他所有内容。这会产生明显但不明显的开销,因为所有这些额外的999999记录必须由DBMS找到并发送到PHP进程。当您将one()用于其中的非唯一字段时,应明确设置限制:

$invoice = Invoice::find()->where(['status' => 1])->limit(1)->one();