PHP代码处理速度更快

时间:2017-08-10 07:36:36

标签: php mysql

我有一个正在运行的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
?>

2 个答案:

答案 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作业:

  1. 键入https://www.cyberciti.biz/faq/how-do-i-add-jobs-to-cron-under-linux-or-unix-oses/,然后按ENTER

  2. crontab -e,然后开始输入您的表达

  3. 键入i,然后按ENTER键保存您的cron作业。

  4. 键入:wq!以检查运行的cron作业。

  5. 那就是它!希望这会对别人有所帮助!