Это получая следующую ошибку:
Фатальная ошибка: Allowed memory size of 33554432 байт exhausted (tried to allocate 2 байт) in C:\xampp\htdocs\servisa\Excel\reader.php он-лайн 482
Я должен читать файл очень большого Excel (13 mb, 9000 линий) и вводить все эти данные о таблице моей базы данных MySQL.
То, что я делаю, состоит в том, чтобы загружать все данные excel в array, и потом я произвожу каждое решение insert пробегая array. Потом я прилагаю каждый insert в единственной гигантской консультации.
Мне казалось, что это было более соответствующим, что реализовывать 9000 inserts в базу данных. Кто-то предлагает какой-то лучший способ это делать, с меньше потреблением памяти?
Спасибо!
Здесь этот my код:
require_once 'Excel/reader.php';
$data = new Spreadsheet_Excel_Reader();
$data->setOutputEncoding('CP1251');
$data->read('PAMI/PAMI.XLS');
$arreglo = array(array());
for ($i = 1; $i <= $data->sheets[0]['numRows']; $i++)
{
if ($i == 1)
continue;
$nomCompleto = mysql_real_escape_string($data->sheets[0]['cells'][$i][3]);//str_replace("`", "", str_replace("'", "", $data->sheets[0]['cells'][$i][3]));
$parts = explode(" ", $nomCompleto);
$apellido = array_shift($parts);
$nombre = implode(" ", $parts);
$nroBenef = $data->sheets[0]['cells'][$i][1];
$dni = $data->sheets[0]['cells'][$i][5];
$tipoDni = $data->sheets[0]['cells'][$i][4];
$sexo = $data->sheets[0]['cells'][$i][8];
$domicilio = $data->sheets[0]['cells'][$i][9];//mysql_real_escape_string($data->sheets[0]['cells'][$i][9].' '.$data->sheets[0]['cells'][$i][10]);
$date = str_replace('/', '-', $data->sheets[0]['cells'][$i][6]);
$fnac = date('Y-m-d', strtotime($date));
$arreglo[$i][0] = $apellido;
$arreglo[$i][1] = $nombre;
$arreglo[$i][2] = $dni;
$arreglo[$i][3] = $nroBenef;
$arreglo[$i][4] = $tipoDni;
$arreglo[$i][5] = $sexo;
$arreglo[$i][6] = $domicilio;
$arreglo[$i][7] = $fnac;
}
$sql ="insert into clientespami (apellido,nombre,dni,nroBeneficiario,tipoDni,sexo,domicilio,fechaNac) values ";
$valuesArr = array();
foreach($arreglo as $fila)
{
$ape = $fila[0];
$nom = $fila[1];
$dni = $fila[2];
$ben = $fila[3];
$tipo = $fila[4];
$sex = $fila[5];
$domi = $fila[6];
$nac = $fila[7];
$valuesArr[] = "('$ape', '$nom', '$dni','$ben','$tipo','$sex','$domi','$nac')";
}
$sql .= implode(',', $valuesArr);
//echo $sql;
mysql_query($sql,$conexion);
$cant = mysql_affected_rows();
Одна из причин состоит в том, что ты создаешь слишком большой array ($valuesArr) и потом convirtiГ©ndolo в string, из-за другой сторона не является рекомендуемой использовать mysql_query, так как он является устаревшим.
я предлагаю Тебе использовать PDO, пример podrГ, - чтобы быть чем-то как это
$stmt = $pdo->prepare('INSERT INTO foo VALUES(:a, :b, :c)');
foreach($data as $item) {
$stmt->bindValue(':a', $item[0]);
$stmt->bindValue(':b', $item[1]);
$stmt->bindValue(':c', $item[2]);
$stmt->execute();
}
Я считаю, что ты должен выполнять рукописный шрифт PHP с командной строки. Не делай это с браузера. Кроме этой формы ты можешь показывать его PHP, что для этого выполнения я распределил неограниченный предел памяти только с sig, я командую:
$ php -d memory_limit=-1 script.php
Если это большой файл, идеальное состоит в том, чтобы делать это в travГ©s ее lГ-nea из команды. Также существуют приложения PHP в google, которые делают "strip" файла, и он это делает в части. У Phpmyadmin также есть скрытая функция для больших списков данных.