Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP代码处理速度更快_Php_Mysql - Fatal编程技术网

PHP代码处理速度更快

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程序,可以处理供应品库存

我希望这段代码处理得更快,以便在打开页面时更新供应品的余额

供应品包含供应品库存及其余额

事务包含接收、返回和发出的事务

下面的程序检索表的供应和事务,并计算更新MYSQL供应表的所有事务的余额

<?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文件时总是会遇到错误。