Тайм-аут запроса PHP для простой функции - PullRequest
0 голосов
/ 30 августа 2018

У меня есть эта функция, которая вычисляет «Балансовую стоимость» основных средств, используя данные из таблицы амортизации, Ii работает нормально на локальном хосте, но когда я пытался перейти к производству, я получаю «время ожидания запроса» после долгого времени загрузите, я думаю, что я испортил цикл или что-то в этом роде, и было бы здорово, если бы кто-нибудь предложил оптимизацию кода или взлом, чтобы сделать эту функцию быстрее.

Я пытался ограничить количество записей для цикла, и это сработало, но, к сожалению, у меня есть более 20 000 данных для обработки.

    $cat = null;
    $total_a = null;
    $assets = $this->Depreciation->get_all();

    if (!empty($assets)) {
        foreach ($assets as $asset) {

            $cost = $asset->cost + $asset->add_cost + $asset->adj_cost;
            $salve = $asset->salvage_value;
            $life = $asset->life;
            $life_t = 0;
            $counter = 0;
            $date1 = date('Y-12-31');
            $date2 = $asset->in_service;

            $diff = abs(strtotime($date2) - strtotime($date1));

            $years = floor($diff / (365 * 60 * 60 * 24));
            $months = floor(($diff - $years * 365 * 60 * 60 * 24) / (30 * 60 * 60 * 24));

            $in_service_d = date('Y-12-31');


            if ($asset->rev > 0) {
                $cost = $asset->rev;
            }


            $dep1 = ($cost - $salve) / $life * ($months / 12);
            $dep = ($cost - $salve) / $life;


            $total = 0;
            $year = 1;


            for (; $cost > $salve;) {
                if ($year == 1 && $months < 12) {
                    $life_t++;
                    $year++;
                    $cost = $cost - $dep1;
                    $counter++;
                    $total = $dep1 + $total;

                    if($in_service_d == date('Y-12-31')){
                        $total_a = $total_a + $cost;
                    }

                    $in_service_d = date('Y-12-31', strtotime("+12 months", strtotime($in_service_d)));


                } elseif ($year != 1) {
                    $life_t++;
                    if ($life_t > $life) {
                        $dep = $dep - $dep1;
                    }
                    $cost = $cost - $dep;
                    $counter++;
                    $total = $dep + $total;

                    if($in_service_d == date('Y-12-31')){
                        $total_a = $total_a + $cost;
                    }

                    $in_service_d = date('Y-12-31', strtotime("+12 months", strtotime($in_service_d)));

                }

            }

        }

    }

     return $total_a;

1 Ответ

0 голосов
/ 30 августа 2018

Ваш друг - функция set_time_limit().

У меня был похожий скрипт экспорта отформатированного файла Excel из большой базы данных. Сценарий всегда заканчивался временем, когда он превышал 1000 строк.

В разделе loop моей логики я настроил следующее:

set_time_limit(30);

Что продлит разрешенное время для запуска еще на 30 секунд с этого момента.

...