Привет! Скрипт читает n строк из текстового файла, собирает запрос и загоняет его в базу данных MySQL. Процесс повторяется до достижения конца файла. При обработке большого (3GB) файла вылетает ошибка: Maximum execution time of 900 seconds exceeded on line 15. Строка где: PHP: if ($s = fgets($file)){ Причем такого таймаута ни в php.ini ни в настройках апача. Пробовал несколько раз переписать функцию Read_filе(), но никакого успеха за неделю не добился. Буду благодарен любым советам для решения данной проблемы или вообще по скрипту. Спасибо! PS. использую XAMPP 7.1 PHP: <?php ini_set('default_socket_timeout',12000); ini_set('memory_limit', '256M'); set_time_limit(0); //Функция получает имя файла, начальную строку и сколько строк прочитать всего. Возвращает массив строк. function Read_file($file_name, $start_row, $how_much_rows){ $file = NULL; $file = fopen($file_name, "rb") or die($php_errormsg); $fbuffer = array(); $line_counter = 0; $i = 0; while ((!feof($file)) && ($line_counter < $start_row)) { if ($s = fgets($file)) { $line_counter++; } } while((!feof($file)) && ($i < $how_much_rows)) { $fbuffer[] = fgets($file); $i++; } fclose($file) or die($php_errormsg); return $fbuffer; } $line = 0; //Указываем с какой строки начинаем читать $count_line = 899; //Указываем сколько строк надо прочесть ini_set("auto_detect_line_endings", "ON"); $arFileList = glob("*.txt"); //получим список файлов .txt в текущей директории $Sucsess_dir = "sucsess"; //Создадим или проверим директорию куда будем кидать УСПЕШНЫЕ базы if(!is_dir($Sucsess_dir)) { mkdir($Sucsess_dir); } $Errors_dir = "errors"; //Создадим или проверим директорию куда будем кидать базы с ОШИБКАМИ if(!is_dir($Errors_dir)) { mkdir($Errors_dir); } //var_dump($arFileList); require_once("../import_settings.php"); //начинаем обработку файла $WasError = false; for ($p=0; $p < count($arFileList); $p++) { //начинаем передобр текстовых файлов в текущей директории $file = $arFileList[$p]; echo "<p>ФАЙЛ: ".$file."<br>"; if (isset($file)) { $res = Read_file($file,0,$count_line); //узнаем сколько всего строк в файле $handle = @fopen($file, "r"); $total_lines=0; while (!feof($handle)) { $bufer = fread($handle,1048576); $total_lines+=substr_count($bufer,"\n"); } fclose($handle); //-- mysqli_close($link); while ($line < $total_lines){ $link = mysqli_connect($dblocation,$dbuser,$dbpasswd,"zorge_db"); $result = mysqli_query($link, "set names utf8") or die("Ошибка " . mysqli_error($link)); $Add = ""; $query_part = 0; $rows = array(); for ($s=0; $s<count($res); $s++) //начинаем построчно обрабатывать файл { $buffer = $res[$s]; strip_tags($buffer); //удаляем html php из строки trim($buffer); $buffer = $buffer.$Add; //добавляем предыдущую строку, если та не была записанна из за меньшего количества ячеек trim($buffer,$razdelChar); $columns = explode($razdelChar, $buffer); //разбиваем строку в массив if ($query_part == 0) { $helpQ = $helpQpt1." VALUES ( "; for ($i=0; $i < count($columns)-1; $i++) { $helpQ = $helpQ."'".str_replace($needles, $replacements, $columns[$i])."', "; //создаем запрос на внесение данных в БД } $helpQ = $helpQ."'".str_replace($needles, $replacements, $columns[count($columns)-1])."' )"; //последний столбец загоняем без запятой $rows[$query_part] = $helpQ; $query_part++; } else { $helpQ = ", ( "; for ($i=0; $i < count($columns)-1; $i++) { $helpQ = $helpQ."'".str_replace($needles, $replacements, $columns[$i])."', "; //создаем запрос на внесение данных в БД } $helpQ = $helpQ."'".str_replace($needles, $replacements, $columns[count($columns)-1])."' )"; //последний столбец загоняем без запятой $rows[$query_part] = $helpQ; $query_part++; } $line++; } //Выполняем запрос на запись: $query1 = implode($rows); $result = mysqli_query($link, $query1); if ($result == FALSE) { echo "Ошибка " . mysqli_error($link) . "<br><br>"; rename($file,$Errors_dir."/".$file); break; } else //запись прошла успешно { $Add = ""; } $res = Read_file($file,$line,$count_line); mysqli_close($link); } echo "Все данные успешно внесены в БД. Строк записано: ".strval($line-1); rename($file,$Sucsess_dir."/".$file); //переместим файл в директорию с файлами без ошибок } else { $WasError =false;//Пропустили файл с ошибкой, обнулим счетчик } } else { echo("<br> Возникли проблемы при загрузке файла"); } } ?>
зачем пишешь такой код ? --- Добавлено --- это что за ? --- Добавлено --- каждый символ прокомментируй --- Добавлено --- https://www.php.net/fgets
PHP: while ((!feof($file)) && ($line_counter < $start_row)) {//пока не достигли строки с которой надо начать считывание или конца файла выполняем: if ($s = fgets($file)) { //проверяем корректность считываения строки Если написать просто fgets($file), то ошибка не пропадает $line_counter++; //увеличиваем счетчик уже прочитанных строк } } //Файл не закрываем продолжим работу со строки на которой остановились while((!feof($file)) && ($i < $how_much_rows))// пока не достигли конца файла и счетчик строк меньше количества, которое необходимо вернуть { $fbuffer[] = fgets($file); //добавляем строку из файла в массив, который потом выведем $i++; //увеличиваем счетчик строк } fclose($file) or die($php_errormsg);//закрываем файл return $fbuffer;//возвращаем массив строк
Такое лучше делать с запуском php из консоли, там нет ограничений по времени. По коду просится рефакторинг, то есть переработка, упрощение. Циклов многовато. PHP: if (isset($file)) Тут is_file предполагался по видимому. Есть переменные которые непонятно где инициализированы. Если это .csv то в mysql должен быть механизм импорта из csv.