У меня есть работающая 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
?>
Как уже говорилось, @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.
Редакция: Я обновляю пример запроса, чтобы удовлетворить вопрос.
Я сделал то, что @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:
Тип crontab -e
затем ENTER
Нажмите i
, затем начните печатать свое выражение
Тип :wq!
затем нажмите ENTER, чтобы сохранить работу cron.
Тип crontab -l
проверить выполнение заданий cron.
Это оно! Надеюсь, это поможет другим!