cakePHP: проблема с большим отставанием - PullRequest
0 голосов
/ 03 мая 2018

У нас возникли серьезные проблемы с запаздыванием при обновлении статуса производства и количестве продукции. Мы используем метод постов JQUERY AJAX для этой работы. Все работает разумно и с хорошей скоростью, когда мы закомментируем функцию «recalculateProduction ()» внутри файла «AppController.php» как для обновления статуса, так и для количества обновления.

Опыт пользователя: Приложение собирает заказы готовых пищевых продуктов из файла с разделителями табуляции на сервере, а затем вычисляет, сколько сырья требуется для производства продукта, на основе данных рецепта. Особая часть системы, которая отстает, - это то, где администратор может вручную регулировать количество заказов клиентов. Так, например, администратор может решить уменьшить количество заказа салата из макарон с Acme с 50 до 40 фунтов. Затем приложение пересчитывает все необходимое сырье в результате этого изменения количества. В настоящее время требуется всего две минуты для пересчета всего, когда изменяется одно количество.

Функция «recalculateProduction ()» состоит из огромных вычислений, обновления записей разных таблиц БД и удаления записей из разных таблиц.

public function recalculateProduction($production_id, $action_performed_by){
$this->loadModel(‘Production’);
$this->loadModel(‘ProductionItem’);
$this->loadModel(‘ProductionOrder’);
$this->loadModel(‘ProductionRecipe’);
$this->loadModel(‘ProductionIngredient’);
$this->loadModel(‘ProductionRawMaterial’);
$this->loadModel(‘ProductionOrderProductionRecipe’);
$this->loadModel(‘ProductionOrderProductionIngredient’);
$this->loadModel(‘ProductionOrderProductionRawMaterial’);

$production = $this->Production->read(null, $production_id);

$this->ProductionItem->updateAll(array('order_case_qty'=>0, 'quantity_lbs'=>0, 'production_case_qty'=>0), array('ProductionItem.production_id'=>$production_id));
$this->ProductionRecipe->updateAll(array('qty_lbs'=>0, 'batch_qty_lbs'=>0, 'batches'=>0, 'batch_size'=>0, 'actual_lbs'=>0, 'percent_yield'=>0), array('ProductionRecipe.production_id'=>$production_id));
$this->ProductionIngredient->updateAll(array('qty_lbs'=>0), array('ProductionIngredient.production_id'=>$production_id));
$this->ProductionRawMaterial->updateAll(array('qty_lbs'=>0), array('ProductionRawMaterial.production_id'=>$production_id));

$this->ProductionOrderProductionRecipe->deleteAll(array('ProductionOrderProductionRecipe.production_order_id IN (SELECT id FROM imrp_production_order ProductionOrder WHERE ProductionOrder.production_id='.$production_id.')'));
$this->ProductionOrderProductionIngredient->deleteAll(array('ProductionOrderProductionIngredient.production_order_id IN (SELECT id FROM imrp_production_order ProductionOrder WHERE ProductionOrder.production_id='.$production_id.')'));
$this->ProductionOrderProductionRawMaterial->deleteAll(array('ProductionOrderProductionRawMaterial.production_order_id IN (SELECT id FROM imrp_production_order ProductionOrder WHERE ProductionOrder.production_id='.$production_id.')'));

$this->ProductionOrder->recursive = 0;
$production_orders = $this->ProductionOrder->find('all', array('conditions'=>array('ProductionOrder.status IN (0, 1)', 'ProductionOrder.production_id'=>$production_id)));
if(count($production_orders)>0){
    foreach($production_orders as $production_order){
        $this->processOrderDetails($production_id, $production_order['ProductionOrder']['item_id'], $production_order['ProductionOrder']['id'], $production['Production']['production_date'], $production_order['ProductionOrder']['quantity_lbs'], $production_order['ProductionOrder']['quantity_cases'], $action_performed_by);
    }
}

$this->ProductionItem->deleteAll(array('ProductionItem.production_id'=>$production_id, 'ProductionItem.order_case_qty'=>0.00, 'ProductionItem.quantity_lbs'=>0.00, 'ProductionItem.production_case_qty'=>0.00));
$this->ProductionRecipe->deleteAll(array('ProductionRecipe.production_id'=>$production_id, 'ProductionRecipe.qty_lbs'=>0.00, 'ProductionRecipe.batch_qty_lbs'=>0.00000, 'ProductionRecipe.batches'=>0.00000, 'ProductionRecipe.batch_size'=>0, 'ProductionRecipe.actual_lbs'=>0.00, 'ProductionRecipe.percent_yield'=>0.000));
$this->ProductionIngredient->deleteAll(array('ProductionIngredient.production_id'=>$production_id, 'ProductionIngredient.qty_lbs'=>0.00));
$this->ProductionRawMaterial->deleteAll(array('ProductionRawMaterial.production_id'=>$production_id, 'ProductionRawMaterial.qty_lbs'=>0.00));

$this->processProductionRecipes($production_id, $action_performed_by);
}

Я могу расследовать, используя хранимые процедуры, но я надеялся, что смогу спасти работу, которую я уже проделал. Я думаю, что потому, что фреймворк PHP запрашивает все данные отношений в одном запросе. Чтобы прекратить получать данные отношений, мы применили «recursive = 0», но это не устранило проблему. Есть предложения?

ПРИМЕЧАНИЕ: Мы имеем дело только с несколькими сотнями записей. Самое большее, однажды в производстве, мы можем иметь дело с несколькими тысячами записей максимум. Мы используем версию PHP: 5.6.35 и версию CakePHP: 2.5.7.

Спасибо.

...