gpt4 book ai didi

php - 使用 Yii2 框架 Ajax 请求太慢

转载 作者:行者123 更新时间:2023-12-01 08:38:06 26 4
gpt4 key购买 nike

$(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();
}
}

有人有想法吗?

最佳答案

你需要做一些profiling找到速度慢的部分代码。此时,您唯一能做的就是盲目猜测。

<小时/>

但这是我的镜头:

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

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

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

关于php - 使用 Yii2 框架 Ajax 请求太慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51124493/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com