2017-08-10 128 views
0

我有一个正在运行的PHP程序来处理耗材库存。快速处理PHP代码

我希望此代码在打开页面时更快处理耗材的余额。

SUPPLIES包含耗材及其余额的库存。

交易包含接收,退货和发行的交易。

下面的程序检索表的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

请正确缩进代码,以便阅读。然后想想当你在彼此内部有这么多循环时会发生什么,以及为什么你需要它们。为什么不根据条件从数据库中选择而不是在PHP代码中循环? –

+4

您正在为'supplies'表中的每个条目选择整个'transactions'表。你最大的提升速度是在'$ supplies-> results()'循环之外设置'$ transactions'。 – Phylogenesis

+0

@Sami Kuhmonen我知道如何根据条件从数据库中进行选择。我的问题在于如何在用户打开页面时使用TRANSACTIONS表中的日期定期更新SUPPLIES表。 :( – chuybenchuy

回答

0

我做了什么@Phylogenesis建议包括更新$balance,直接基于'$ transactions'的$supplies数据库。

为了避免客户端延迟更新`$ supplies'的所有$balance,我使用cron作业来根据所需的计划运行脚本。

通过从该链路以下步骤为CentOS 7

安装的cronjob:

https://www.rosehosting.com/blog/automate-system-tasks-using-cron-on-centos-7/

要检查的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作业:

  1. 类型crontab -e然后按ENTER

  2. i,然后开始输入您的表情

  3. 键入:wq!然后按ENTER保存您的cron作业。

  4. 输入crontab -l检查运行的cron作业。

就是这样!希望这会帮助别人!

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。

编辑:我更新查询示例以满足问题。

+0

不知道如何编码:'UPDATE supplies s SET balance =(SELECT SUM(...)FROM transactions t WHERE t.code = s.id);' – chuybenchuy

+0

我编辑了查询以提供与问题代码相同的结果 –

+0

非常感谢你的努力,非常感谢,但是我还不知道如何在数据库端运行代码,我的程序在localhost上本地运行,无论我输入什么代码,都可以直接由用户访问和管理员 – chuybenchuy