Ajax-запрос слишком медленный, используя Yii2 Framework - PullRequest
0 голосов
/ 01 июля 2018
$(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();
        }
      });
    });
});

Это функция jQuery AJAX, и она работает хорошо, но занимает около 2700 мс, что неприемлемо для любого клиента.

<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>

В бэкэнде я получаю данные запроса AJAX и редактирую свою таблицу, как показано в этом действии:

public function actionCartBarcode() {
    $request = Yii::$app->request;

    $productCode = $request->getBodyParam('pcode');



    $invoice = Invoice::find()->where(['status' => 1])->one();
    $invoiceId = $invoice->invoice_id;
    $product = AppProduct::find()->where(['product_code' => $productCode])->one();
    $productId = $product->product_id;
    //first see if product exist (change sales to cart after you create the cart table)
    $model = Sales::find()->where(['r_product_id' => $productId])->andWhere(['r_invoice_id' => $invoiceId])->one();
    if ($model) {
        $model->sold_product_qty += 1;
    } else {

        $model = new Sales();
        $model->r_invoice_id = $invoiceId;
        $model->r_product_id = $productId;
        $model->sold_product_qty = 1;
        $model->discount = 0;
        $model->price_per_unit = $product->product_price;
        $model->total_price = $product->product_price;
        $model->profit = $product->product_price - $product->product_cost;
    }
    if ($model->save()) {
        return 1;
    } else {
        VarDumper::dump($productId, 10, true);
        die();
    }
}

У кого-нибудь есть идея?

1 Ответ

0 голосов
/ 01 июля 2018

Вам нужно выполнить некоторое профилирование , чтобы найти часть кода, которая работает медленно. На данный момент единственное, что вы можете получить здесь, это слепое предположение.


Но вот мой выстрел:

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

Вы должны быть очень осторожны с этим. one() не устанавливает никаких ограничений в запросе неявно. Это означает, что если у вас есть 1 миллион счетов с status, равным 1, это загрузит их все в PHP, выберет только первый и проигнорирует все остальное. Это может создать заметные, но не очевидные накладные расходы, поскольку все эти дополнительные записи 999999 должны быть найдены СУБД и отправлены в процесс PHP. Когда вы используете one() с неуникальными полями в where, вы должны явно установить ограничение:

$invoice = Invoice::find()->where(['status' => 1])->limit(1)->one();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...