Оптимизировать PHPExcel и скрипт для загрузки файла - PullRequest
1 голос
/ 14 марта 2019

Прежде всего, уточните, что я видел много тем по оптимизации чтения файла excel, но применил некоторые решения и не нашел того, который мне помогает.

У меня естьсистема, которая в определенный момент вызывает другой php, который вызывает библиотеку Excel.Эта система, которая выполняет чтение файла Excel и записывает его информацию в SQL, а затем генерирует PDF.

index.php

<?php   
    ....
    include("read_excel.php");
    ....
?>

У меня естьВидно, что загрузка моего индекса занимает приблизительно 20 секунд, поэтому я начал распределять части своего кода, чтобы увидеть, где была проблема, и определить, что это было в файле "read_excel.php"

* 1012.* read_excel.php

<?php

    $sql_host     = "127.0.0.1";      
    $sql_username = "root";    
    $sql_password = "";       
    $sql_database = "payment_locations"; 


    $mysqli = new mysqli($sql_host , $sql_username , $sql_password , $sql_database);

    $mysqli->set_charset("utf8");

    require_once("_library/PHPExcel/Classes/PHPExcel.php");

    $fileName = '_excel/locations.xlsx';

    if (!file_exists($fileName)){
        ?> 
            <script type="text/javascript"> 
            alertify.alert("No exists file");
            </script> 
        <?php 

    }else{
        $objPHPExcel = PHPExcel_IOFactory::load($fileName);

        $date = $objPHPExcel->getActiveSheet()->getCell('U11')->getValue();

        $dateFormat = date('d/m/Y', PHPExcel_Shared_Date::ExcelToPHP($date));

        // echo $dateFormat;

        // $dto = PHPExcel_Shared_Date::ExcelToPHPObject($objPHPExcel->getActiveSheet()->getCell('U11')->getCalculatedValue());

        // echo $dto->format('d-m-Y');

        for ($i = 11; $i <= 31; $i++) {
            if ((float) $objPHPExcel->getActiveSheet()->getCell('A' . $i)->getCalculatedValue() == 0) {
                break;
            }
            $dataExcel[$i]['id_locator'] = $objPHPExcel->getActiveSheet()->getCell('A' . $i)->getCalculatedValue();
            $dataExcel[$i]['payment'] = $objPHPExcel->getActiveSheet()->getCell('X' . $i)->getCalculatedValue();
            $dataExcel[$i]['period_to'] = PHPExcel_Shared_Date::ExcelToPHPObject($objPHPExcel->getActiveSheet()->getCell('AC' . $i)->getCalculatedValue());
            $dataExcel[$i]['period_from'] = PHPExcel_Shared_Date::ExcelToPHPObject($objPHPExcel->getActiveSheet()->getCell('AD' . $i)->getCalculatedValue());
            $dataExcel[$i]['support'] = $objPHPExcel->getActiveSheet()->getCell('J' . $i)->getCalculatedValue();
            $dataExcel[$i]['location'] = $objPHPExcel->getActiveSheet()->getCell('H' . $i)->getCalculatedValue();
            $dataExcel[$i]['comments'] = $objPHPExcel->getActiveSheet()->getCell('AF' . $i)->getCalculatedValue();
            $dataExcel[$i]['name_locator'] = $objPHPExcel->getActiveSheet()->getCell('E' . $i)->getCalculatedValue();
            $dataExcel[$i]['ci_locator'] = $objPHPExcel->getActiveSheet()->getCell('F' . $i)->getCalculatedValue();
            $dataExcel[$i]['tel_locator'] = $objPHPExcel->getActiveSheet()->getCell('G' . $i)->getCalculatedValue();
            $dataExcel[$i]['address_locator'] = $objPHPExcel->getActiveSheet()->getCell('I' . $i)->getCalculatedValue();
        }

        foreach ($dataExcel as $dataRow => $value) {
            $dateFormatPeriodTo   = $value['period_to']->format('d/m/Y');
            $dateFormatPeriodFrom = $value['period_from']->format('d/m/Y');
            // var_dump($dateFormatPeriodTo);
            //$dateFormatPeriodTo = date('d/m/Y', PHPExcel_Shared_Date::ExcelToPHP($value['period_to']));
            $sql = "REPLACE data_locator (id_locator, payment, period_to, period_from, support, location, comments, name_locator, ci_locator, tel_locator, address_locator) VALUES ({$value['id_locator']}, {$value['payment']}, '$dateFormatPeriodTo', '$dateFormatPeriodFrom', '{$value['support']}', '{$value['location']}', '{$value['comments']}', '{$value['name_locator']}', {$value['ci_locator']}, '{$value['tel_locator']}', '{$value['address_locator']}')";
            // echo $sql;
            $result = $mysqli->query($sql);
        }

        for ($j = 42; $j <= 55; $j++) {
            if ((float) $objPHPExcel->getActiveSheet()->getCell('A' . $j)->getCalculatedValue() == 0) {
                break;
            }
            $dataExcelTwo[$j]['id_locator'] = $objPHPExcel->getActiveSheet()->getCell('A' . $j)->getCalculatedValue();
            $dataExcelTwo[$j]['payment'] = $objPHPExcel->getActiveSheet()->getCell('X' . $j)->getCalculatedValue();
            $dataExcelTwo[$j]['period_to'] = PHPExcel_Shared_Date::ExcelToPHPObject($objPHPExcel->getActiveSheet()->getCell('AC' . $j)->getCalculatedValue());
            $dataExcelTwo[$j]['period_from'] = PHPExcel_Shared_Date::ExcelToPHPObject($objPHPExcel->getActiveSheet()->getCell('AD' . $j)->getCalculatedValue());
            $dataExcelTwo[$j]['support'] = $objPHPExcel->getActiveSheet()->getCell('J' . $j)->getCalculatedValue();
            $dataExcelTwo[$j]['location'] = $objPHPExcel->getActiveSheet()->getCell('H' . $j)->getCalculatedValue();
            $dataExcelTwo[$j]['comments'] = $objPHPExcel->getActiveSheet()->getCell('AF' . $j)->getCalculatedValue();
            $dataExcelTwo[$j]['name_locator'] = $objPHPExcel->getActiveSheet()->getCell('E' . $j)->getCalculatedValue();
            $dataExcelTwo[$j]['ci_locator'] = $objPHPExcel->getActiveSheet()->getCell('F' . $j)->getCalculatedValue();
            $dataExcelTwo[$j]['tel_locator'] = $objPHPExcel->getActiveSheet()->getCell('G' . $j)->getCalculatedValue();
            $dataExcelTwo[$j]['address_locator'] = $objPHPExcel->getActiveSheet()->getCell('I' . $j)->getCalculatedValue();
        }

        foreach ($dataExcelTwo as $dataRow => $value) {
            $dateFormatPeriodTo   = $value['period_to']->format('d/m/Y');
            $dateFormatPeriodFrom = $value['period_from']->format('d/m/Y');
            // var_dump($dateFormatPeriodTo);
            //$dateFormatPeriodTo = date('d/m/Y', PHPExcel_Shared_Date::ExcelToPHP($value['period_to']));
            $sql = "REPLACE data_locator (id_locator, payment, period_to, period_from, support, location, comments, name_locator, ci_locator, tel_locator, address_locator) VALUES ({$value['id_locator']}, {$value['payment']}, '$dateFormatPeriodTo', '$dateFormatPeriodFrom', '{$value['support']}', '{$value['location']}', '{$value['comments']}', '{$value['name_locator']}', {$value['ci_locator']}, '{$value['tel_locator']}', '{$value['address_locator']}')";
            // echo $sql;
            $result = $mysqli->query($sql);  
        }

    }

?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <title></title>
        <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0">

        <link rel="stylesheet" href="_css/datepicker.css">

        <script src="_js/alertify.min.js"></script>

        <link rel="stylesheet" href="//cdn.jsdelivr.net/bootstrap/3.2.0/css/bootstrap.min.css"/>


        <link rel="stylesheet" href="_css/style.css">

        <link rel="stylesheet" href="_css/alertify.default.css">
        <link rel="stylesheet" href="_css/alertify.core.css">
        <link rel="stylesheet" href="_css/alertify.bootstrap3.css">

        <link href='https://fonts.googleapis.com/css?family=Roboto:400,700,300,900' rel='stylesheet' type='text/css'>

        <link rel="icon" href="_images/favicon.png" type="image/gif" sizes="16x16">

        <link rel="stylesheet" href="alertify.default.css">
        <link rel="stylesheet" href="alertify.core.css">
        <link rel="stylesheet" href="alertify.bootstrap3.css">
    </head>
</html>

После стирания почти всех блоков кода в моем файле чтения "read_excel.php" я увидел, что строка, которая задержала выполнение моего индекса (который вызывает read_excel.php)

$objPHPExcel = PHPExcel_IOFactory::load($fileName);

Как только я удалю эту строку, мой индекс загружается в миллисекундах.

Итак, мой вопрос - неправильный мой способ вызова файла Excel, который я хочу прочитать?

Размер моего Excel составляет всего 110 КБ, я не думаю, что это проблема, не так ли?

Я запускаю свое программное обеспечение на локальном сервере (wamp server 2.5) и Windows 7 64bit.Может быть проблема?

Я видел темы, где предлагается оптимизация для файлов, где обрабатывается много информации, но в моем случае это небольшой файл, и я использую только блоки Excel (для условия), и этоКажется, это не проблема, потому что скорость загрузки моего индекса меняется, когда я исключаю строку:

$objPHPExcel = PHPExcel_IOFactory::load($fileName);

Может ли это быть версия библиотеки Excel, которую я использую?

Спасибо!

...