MySQL — PHP код для обработки быстрее

У меня есть работающая PHP-программа, которая обрабатывает инвентарь расходных материалов.

Я хочу, чтобы этот код обрабатывался быстрее для обновления баланса расходных материалов при открытии страницы.

ПОСТАВКИ содержит инвентарь расходных материалов и их остатки.

TRANSACTIONS содержит транзакции получения, возврата и выдачи.

Приведенная ниже программа извлекает таблицы SUPPLIES и 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
?>

0

Решение

Как уже говорилось, @Pylogenesis изменение в транзакции должно вызвать обновление поставок.

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

Другие решения

Я сделал то, что @Phylogenesis предложил включить обновление $balanceпрямо в базу данных $supplies основанный на $ транзакциях.

Чтобы избежать задержек на стороне клиента обновить все $balance из `$ supplies ‘, я использовал задания cron для запуска скриптов в соответствии с желаемым расписанием.

Установил cronjob для Centos 7, выполнив следующие действия по этой ссылке:

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.

Это оно! Надеюсь, это поможет другим!

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector