簡體   English   中英

PHP代碼可以更快地處理

[英]PHP Code to Process Faster

我有一個正在運行的PHP程序,可以處理耗材庫存。

我希望此代碼在打開頁面時能更快地處理以更新耗材的余額。

物料包含物料清單及其余額。

交易包含接收,退貨和發行的交易。

下面的程序檢索表的SUPPLIES和TRANSACTIONS,並從所有TRANSACTIONS計算余額,這將更新SUPPLIES的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;

因此,您無需在每次打開頁面時都更新耗材,也不需要重新計算整個表。 在一次交易中做到這一點很重要。 理想情況下,應盡可能將其放在事務表功能“ 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慢,但快得多。

編輯:我更新查詢示例以滿足問題。

我做了@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然后回車

  2. i ,然后開始輸入您的表情

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

  4. 鍵入crontab -l來檢查正在運行的cron作業。

而已! 希望這對別人有幫助!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM