Оптимизация PHPExcel и скрипта для загрузки файла

#php #phpexcel

#php #phpexcel

Вопрос:

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

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

index.php

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

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

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) и 64-битной Windows 7. Может быть проблема?

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

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

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

Спасибо!

Комментарии:

1. Проверьте вкладку «сеть» в консоли и посмотрите, что происходит.

2. Для отладки или поиска оптимизации в ваших скриптах я рекомендую вам попробовать Blackfire.

3. Последняя версия PHPExcel, 1.8.1, была выпущена в 2015 году. Проект был официально признан устаревшим в 2017 году и окончательно заархивирован в 2019 году. Проект не поддерживался годами и больше не должен использоваться. Все пользователи должны перейти на его прямого преемника PhpSpreadsheet ( github.com/PHPOffice/PhpSpreadsheet ) или другой вариант.