我有一个正在运行的PHP程序来处理耗材库存。
我希望此代码能够更快地处理更新耗材'打开页面时保持平衡。
SUPPLIES包含耗材及其余额的清单。
TRANSACTIONS包含接收,退货和已发行的交易。
下面的程序检索表格' SUPPLIES和TRANSACTIONS并计算更新MYSQL SUPPLIES表的所有TRANSACTIONS的余额。
<?php
//Update supplies balance starts here
$supplies = DB::getInstance()->query("SELECT * FROM supplies ORDER BY id DESC");
foreach($supplies->results() as $supply) {
$balance = 0;
$transactions = DB::getInstance()->query("SELECT * FROM transactions ORDER BY id ASC");
foreach($transactions->results() as $transaction) {
if($transaction->code === $supply->id){
if($transaction->transaction_type === "1"){
$balance = $balance + $transaction->quantity;
} else if($transaction->transaction_type === "2"){
$balance = $balance - $transaction->quantity;
} else if($transaction->transaction_type === "3"){
$balance = $balance + $transaction->quantity;
}
}
}
$supplied = new Supply();
$supplied->find($supply->id);
try {
$supplied->update(array(
'balance' => $balance,
));
} catch (Exception $e) {
die($e->getMessage());
}
}
//Update supplies balance ends here
?>
答案 0 :(得分:1)
如上所述,交易中的@Phylogenesis更改应触发供应的更新。
BEGIN TRANSACTION;
UPDATE transactions SET quantity = ..., code = ..., ....;
UPDATE supplies SET balance = balance +/- ....;
COMMIT;
因此,每次打开页面时都不需要更新耗材,也不需要重新计算整个表。在一次交易中执行此操作非常重要。理想情况下,如果可能的话,它应该放在事务表功能TRIGGER ON UPDATE的数据库中。
如果您不能,请尝试在数据库端计算耗材的更新值,例如:
UPDATE supplies s
SET balance =
(SELECT SUM(quantity) FROM transactions t WHERE t.code = s.id AND transaction_type IN (1, 3)) -
(SELECT SUM(quantity) FROM transactions t WHERE t.code = s.id AND transaction_type = 2);
它仍然比PHP更慢但速度更快。
已编辑:我更新了查询示例以满足问题。
答案 1 :(得分:0)
我做了@Phylogenesis建议包括更新$balance
的内容,直接根据&#39; $ transactions&#39;直接访问$supplies
数据库。
为避免客户端延迟更新所有{$ 1}的'$ supplies},我使用cron作业根据所需的时间表运行脚本。
通过以下步骤安装Centos 7的cronjob:
https://www.rosehosting.com/blog/automate-system-tasks-using-cron-on-centos-7/
要检查是否安装了cron,请输入:$balance
然后使用systemctl status crond.service
生成表达式来安排自动运行PHP脚本。
如果仍然对其工作方式感到困惑,请查看此链接以获取示例:
https://crontab.guru/
安装或创建或编辑自己的cron作业:
键入https://www.cyberciti.biz/faq/how-do-i-add-jobs-to-cron-under-linux-or-unix-oses/
,然后按ENTER
按crontab -e
,然后开始输入您的表达
键入i
,然后按ENTER键保存您的cron作业。
键入:wq!
以检查运行的cron作业。
那就是它!希望这会对别人有所帮助!