За последние 24 часа нас посетили 20252 программиста и 1009 роботов. Сейчас ищут 363 программиста ...

Maximum execution time of 900 seconds exceeded on line 15

Тема в разделе "PHP для новичков", создана пользователем Pablo, 31 июл 2020.

  1. Pablo

    Pablo Новичок

    С нами с:
    31 июл 2020
    Сообщения:
    4
    Симпатии:
    0
    Привет! Скрипт читает n строк из текстового файла, собирает запрос и загоняет его в базу данных MySQL. Процесс повторяется до достижения конца файла.

    При обработке большого (3GB) файла вылетает ошибка: Maximum execution time of 900 seconds exceeded on line 15. Строка где:
    PHP:
    1. if ($s = fgets($file)){
    Причем такого таймаута ни в php.ini ни в настройках апача. Пробовал несколько раз переписать функцию Read_filе(), но никакого успеха за неделю не добился. :(

    Буду благодарен любым советам для решения данной проблемы или вообще по скрипту. Спасибо!

    PS. использую XAMPP 7.1

    PHP:
    1. <?php
    2. ini_set('default_socket_timeout',12000);
    3. ini_set('memory_limit', '256M');
    4.  
    5. //Функция получает имя файла, начальную строку и сколько строк прочитать всего. Возвращает массив строк.
    6. function Read_file($file_name, $start_row, $how_much_rows){
    7.     $file = NULL;
    8.     $file = fopen($file_name, "rb") or die($php_errormsg);
    9.     $fbuffer = array();
    10.     $line_counter = 0;
    11.     $i = 0;
    12.     while ((!feof($file)) && ($line_counter < $start_row)) {
    13.         if ($s = fgets($file)) {
    14.             $line_counter++;
    15.         }
    16.     }
    17.  
    18.     while((!feof($file)) && ($i < $how_much_rows))
    19.        {
    20.             $fbuffer[] = fgets($file);
    21.             $i++;
    22.        }
    23.    
    24.     fclose($file) or die($php_errormsg);
    25.     return $fbuffer;
    26. }
    27.  
    28. $line = 0; //Указываем с какой строки начинаем читать
    29. $count_line = 899; //Указываем сколько строк надо прочесть
    30.  
    31.  
    32.     ini_set("auto_detect_line_endings", "ON");
    33.     $arFileList = glob("*.txt"); //получим список файлов .txt в текущей директории
    34.  
    35.     $Sucsess_dir = "sucsess"; //Создадим или проверим директорию куда будем кидать УСПЕШНЫЕ базы
    36.     if(!is_dir($Sucsess_dir)) {
    37.         mkdir($Sucsess_dir);
    38.     }
    39.  
    40.     $Errors_dir = "errors"; //Создадим или проверим директорию куда будем кидать базы с ОШИБКАМИ
    41.     if(!is_dir($Errors_dir)) {
    42.         mkdir($Errors_dir);
    43.     }
    44.  
    45.     //var_dump($arFileList);
    46.     require_once("../import_settings.php"); //начинаем обработку файла
    47.     $WasError = false;
    48.  
    49.     for ($p=0; $p < count($arFileList); $p++) { //начинаем передобр текстовых файлов в текущей директории
    50.         $file = $arFileList[$p];
    51.         echo "<p>ФАЙЛ: ".$file."<br>";
    52.         if (isset($file))
    53.         {      
    54.          
    55.                        
    56.                         $res = Read_file($file,0,$count_line);
    57.  
    58.                         //узнаем сколько всего строк в файле
    59.                         $handle = @fopen($file, "r");
    60.                         $total_lines=0;
    61.                           while (!feof($handle))  
    62.                           {
    63.                               $bufer = fread($handle,1048576);
    64.                               $total_lines+=substr_count($bufer,"\n");
    65.                           }
    66.                         fclose($handle);
    67.                         //--
    68.  
    69.                         mysqli_close($link);
    70.                        
    71.                         while ($line < $total_lines){
    72.                         $link = mysqli_connect($dblocation,$dbuser,$dbpasswd,"zorge_db");
    73.                         $result = mysqli_query($link, "set names utf8") or die("Ошибка " . mysqli_error($link));
    74.                         $Add = "";
    75.                         $query_part = 0;
    76.                         $rows = array();
    77.                         for ($s=0; $s<count($res); $s++) //начинаем построчно обрабатывать файл
    78.                             {
    79.                                 $buffer = $res[$s];
    80.                                 strip_tags($buffer); //удаляем html php из строки
    81.                                 trim($buffer);
    82.                                 $buffer = $buffer.$Add; //добавляем предыдущую строку, если та не была записанна из за меньшего количества ячеек
    83.                                 trim($buffer,$razdelChar);
    84.                                 $columns = explode($razdelChar, $buffer); //разбиваем строку в массив
    85.  
    86.                                
    87.                                     if ($query_part == 0)
    88.                                     {
    89.                                     $helpQ = $helpQpt1." VALUES ( ";
    90.                                         for ($i=0; $i < count($columns)-1; $i++)
    91.                                         {
    92.                                             $helpQ = $helpQ."'".str_replace($needles, $replacements, $columns[$i])."', "; //создаем запрос на внесение данных в БД
    93.                                         }
    94.                                         $helpQ = $helpQ."'".str_replace($needles, $replacements, $columns[count($columns)-1])."' )"; //последний столбец загоняем без запятой
    95.                                         $rows[$query_part] = $helpQ;
    96.                                         $query_part++;
    97.                                     }
    98.                                     else
    99.                                     {
    100.                                         $helpQ = ", ( ";
    101.                                         for ($i=0; $i < count($columns)-1; $i++)
    102.                                         {
    103.                                             $helpQ = $helpQ."'".str_replace($needles, $replacements, $columns[$i])."', "; //создаем запрос на внесение данных в БД
    104.                                         }
    105.                                         $helpQ = $helpQ."'".str_replace($needles, $replacements, $columns[count($columns)-1])."' )"; //последний столбец загоняем без запятой
    106.                                         $rows[$query_part] = $helpQ;
    107.                                         $query_part++;
    108.                                     }
    109.                              
    110.  
    111.                                 $line++;                  
    112.                             }
    113.                            
    114.                             //Выполняем запрос на запись:
    115.                             $query1 = implode($rows);                          
    116.  
    117.                                     $result = mysqli_query($link, $query1);
    118.                                     if ($result == FALSE) {
    119.                                         echo "Ошибка " . mysqli_error($link) . "<br><br>";
    120.                                         rename($file,$Errors_dir."/".$file);
    121.                                         break;
    122.                                     }
    123.                                     else //запись прошла успешно
    124.                                     {
    125.                                         $Add = "";
    126.                                     }
    127.                            
    128.                          
    129.                             $res = Read_file($file,$line,$count_line);
    130.                             mysqli_close($link);
    131.                         }
    132.                            
    133.                             echo "Все данные успешно внесены в БД. Строк записано: ".strval($line-1);  
    134.                             rename($file,$Sucsess_dir."/".$file); //переместим файл в директорию с файлами без ошибок
    135.                              
    136.                         }
    137.                         else
    138.                         {
    139.                             $WasError =false;//Пропустили файл с ошибкой, обнулим счетчик
    140.                         }
    141.                            
    142.         }
    143.         else
    144.         {
    145.             echo("<br> Возникли проблемы при загрузке файла");
    146.         }          
    147.                        
    148.     }
    149.  
    150.     ?>
     
  2. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.748
    Симпатии:
    1.321
    Адрес:
    Лень
    зачем пишешь такой код ?
    --- Добавлено ---
    это что за ?
    --- Добавлено ---
    каждый символ прокомментируй
    --- Добавлено ---
    https://www.php.net/fgets
     
  3. Pablo

    Pablo Новичок

    С нами с:
    31 июл 2020
    Сообщения:
    4
    Симпатии:
    0
    PHP:
    1.  while ((!feof($file)) && ($line_counter < $start_row)) {//пока не достигли строки с которой надо начать считывание или конца файла выполняем:
    2.         if ($s = fgets($file)) { //проверяем корректность считываения строки Если написать просто fgets($file), то ошибка не пропадает
    3.             $line_counter++;  //увеличиваем счетчик уже прочитанных строк
    4.         }
    5.     }
    6. //Файл не закрываем продолжим работу со строки на которой остановились
    7.  
    8.     while((!feof($file)) && ($i < $how_much_rows))// пока не достигли конца файла и счетчик строк меньше количества, которое необходимо вернуть
    9.        {
    10.             $fbuffer[] = fgets($file); //добавляем строку из файла в массив, который потом выведем
    11.             $i++; //увеличиваем счетчик строк
    12.        }
    13.  
    14.     fclose($file) or die($php_errormsg);//закрываем файл
    15.     return $fbuffer;//возвращаем массив строк
     
  4. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.553
    Симпатии:
    1.754
    @Pablo Длительные операции выносятся в отдельные процессы. Очереди.
     
  5. Pablo

    Pablo Новичок

    С нами с:
    31 июл 2020
    Сообщения:
    4
    Симпатии:
    0
    Можно вас попросить чуть подробнее рассказать? Ссылки на что почитать
     
  6. Pablo

    Pablo Новичок

    С нами с:
    31 июл 2020
    Сообщения:
    4
    Симпатии:
    0
    Погуглил, вряд ли это решит проблему если скрипт лажает при обработке одного файла
     
  7. amberson

    amberson Активный пользователь

    С нами с:
    23 июл 2020
    Сообщения:
    62
    Симпатии:
    14
    Такое лучше делать с запуском php из консоли, там нет ограничений по времени.

    По коду просится рефакторинг, то есть переработка, упрощение. Циклов многовато.

    PHP:
    1.         if (isset($file))
    Тут is_file предполагался по видимому.

    Есть переменные которые непонятно где инициализированы.

    Если это .csv то в mysql должен быть механизм импорта из csv.