PHP代码处理速度更快
我有一个正在运行的PHP程序,可以处理供应品库存 我希望这段代码处理得更快,以便在打开页面时更新供应品的余额 供应品包含供应品库存及其余额 事务包含接收、返回和发出的事务 下面的程序检索表的供应和事务,并计算更新MYSQL供应表的所有事务的余额PHP代码处理速度更快,php,mysql,Php,Mysql,我有一个正在运行的PHP程序,可以处理供应品库存 我希望这段代码处理得更快,以便在打开页面时更新供应品的余额 供应品包含供应品库存及其余额 事务包含接收、返回和发出的事务 下面的程序检索表的供应和事务,并计算更新MYSQL供应表的所有事务的余额 <?php //Update supplies balance starts here $supplies = DB::getInstance()->query("SELECT * FROM supplies ORDER BY id DESC
<?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
?>
如前所述,交易中的@Phylogenesis变化应触发供应更新
BEGIN TRANSACTION;
UPDATE transactions SET quantity = ..., code = ..., ....;
UPDATE supplies SET balance = balance +/- ....;
COMMIT;
因此,您不需要在每次打开页面时更新耗材,也不需要重新计算整个表。在一次交易中做到这一点很重要。理想情况下,如果可能的话,它应该放在事务表特性触发器更新时的数据库中
如果不能,请尝试在数据库端计算补给的更新值,例如:
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慢,但速度要快得多
编辑:我更新了查询示例以解决问题。我按照@Phylogenesis的建议,包括更新$balance,直接根据“$transactions”更新$supplies数据库 为了避免客户端延迟更新“$supplies”的所有$balance,我使用cron作业根据所需的时间表运行脚本 通过此链接中的以下步骤安装Centos 7的cronjob: 要检查是否安装了cron,请键入:systemctl status crond.service 然后使用https://crontab.guru/ 生成表达式以计划PHP脚本的自动运行 如果仍然对其工作原理感到困惑,请查看此链接以获取示例: https://www.cyberciti.biz/faq/how-do-i-add-jobs-to-cron-under-linux-or-unix-oses/ 要安装、创建或编辑自己的cron作业,请执行以下操作: 键入crontab-e,然后输入 按i键,然后开始键入表达式 类型:wq!然后输入以保存cron作业 键入crontab-l以检查是否正在运行cron作业
就这样!希望这能帮助别人 请正确缩进代码以便阅读。然后想一想,当彼此之间有这么多循环时会发生什么,以及为什么需要它们。为什么不根据条件从数据库中进行选择,而不是在PHP代码中循环呢?对于supplies表中的每个条目,您将选择整个transactions表一次。您最大的速度改进是在$supplies->results循环之外设置$transactions。@Sami Kuhmonen我知道如何根据条件从数据库中进行选择。我这里的问题是,每当用户打开页面时,如何使用事务表中的日期定期更新SUPPLIES表:为什么不加入这两个表呢?如前所述,您的问题是查询。添加一个条件以正确运行它。这将产生巨大的变化。也就是说,目前如果你有1000个供应和1000个事务,你将运行1000000个循环和2000个查询。在这种情况下,您可以运行1000个循环和2000个查询,返回的数据要少得多。不知道如何编码:UPDATE supplies s SET balance=SELECT SUM。。。来自事务t,其中t.code=s.id;我对查询进行了编辑,得到了与问题代码相同的结果。非常感谢您的努力。非常感谢。但我还不知道如何在数据库端运行代码。我的程序在本地主机上本地运行。无论我输入什么代码,用户和管理员都可以直接访问。我已经成功地完成了@Phylogenesis的建议。每当有事务更新时。然后立即更新余额。但我有一个与此相关的新问题。我的程序创建了一个包含期初余额的供应表,然后是交易,然后是基于所选期间的期末余额,例如2017年7月1日至2017年7月31日。即使用户进入2017年6月1日至2017年6月30日这一期间,它仍然可以通过计算指定期间的$transactions数据来生成表。但问题是生成表需要太长的时间,而且我在创建表的PDF文件时总是会遇到错误。