N3K
Новичок
Импортирование из csv в мускул.
У меня есть функция добавления большого кол-ва эллементов из csv файла в базу данных. Импортирование нужно встроить в проэкт. Добавляю я в базу данных сразу по 1000 строк. Ошибка заключается в том, что после 2х - 10 добавлений ложится апачь. В коде сделал множество обработчикво, что б небыло большого буфера у апача и у мускула. Написано на зенд фреймвёрке, но в данном случае работа идёт на прямую с адаптером базы данных. Вот куски кода 2х функций:
1. Отвечает за получение информации из текстовика + следим за буфером:
2. Отвечает за добавление в базу данных (берёт из 10000 эллементво значения и добавляет их в базу данных по 1000)
Добавление осуществляется на прямую через адаптер.
Подскажите, из за чего ложится апачь? Уже часов 5 мучаюсь.
P.s. Добавление глючит на адаптере pdo_mysql. На mysqli работает корректно, но это недопустимо в проэкте.
У меня есть функция добавления большого кол-ва эллементов из csv файла в базу данных. Импортирование нужно встроить в проэкт. Добавляю я в базу данных сразу по 1000 строк. Ошибка заключается в том, что после 2х - 10 добавлений ложится апачь. В коде сделал множество обработчикво, что б небыло большого буфера у апача и у мускула. Написано на зенд фреймвёрке, но в данном случае работа идёт на прямую с адаптером базы данных. Вот куски кода 2х функций:
1. Отвечает за получение информации из текстовика + следим за буфером:
PHP:
public function indexAction()
{
$file = fopen ('../temp/db/partner.last.dump3','r');
$elements=array();
$pos=0;
while (!feof($file)) {
$str = fgets($file);
if ($str [0] == 'p' && $str [1] == '_') { //проврка - я вляеится ли поле обозначением начала новой таблицы
if (isset($table)) { // Если название таблицы существет, значит уже одну таблицу обработали
$this->insertModel->insertArray($elements,$cols,$table); // передаём в функцию инсёрта данные
$elements=array(); // очищаем буфер
$pos=0;
#exit(0);
}
$table=strtok($str,'|'); // получаем название новой таблицы
$cols=$this->insertModel->getCols($table); // получаем названия её полей
} else // если полученное поле не является названием новой таблицы
if ($pos==10000) { // Если полей для добавления == 10000
$this->insertModel->insertArray($elements,$cols,$table); // Добавляем их
$elements=array(); // и обнуляем счётчик(опять же дял экономии буфера)
$pos=0;
}
$arrayElements=explode('|',$str); // разбитие полученной строки на под строки(значения в бд)
$a=0;
foreach ($arrayElements as $element) { // цыкл прообразующий два масива в асоциативный масив типа [tableName] => element
$resultArray[$cols[$a]]=$element;
$a++;
}
$elements[]=$resultArray; // собраем эллементы в массив
$pos++;
}
}
}
Добавление осуществляется на прямую через адаптер.
PHP:
public function insertArray( array $data, array $cols , $table)
{
$this->_name=$table;
$sql = "INSERT INTO $this->_name ";
$sql.=' (';
for ($a=0,$count=count($cols);$a<$count;$a++) { // Делаем начало запроса в виде INSERT INTO table (....) values
if ($a>0) {
$sql.=',';
}
$sql.='`' . $cols[$a] . '`';
}
$sql.=' ) values';
$count2 = count( $data );
$values = '';
try {
$this->_db->getConnection();
for ( $i = 0; $i < $count2; $i++ ){
$countCols = count( $data[$i] );
$data[$i]['_name'] = mb_convert_encoding($data[$i]['_name'], 'UTF-8');
$data[$i]['_name'] = $this->_db->quote( $data[$i]['_name'] );
$sql.=' (';
$a=0;
foreach ($data[$i] as $element) { // добавляем эллементы в запрос
if ($a>0) {
$sql.=',';
}
$sql .= $element;
$a++;
}
$sql.='),';
if ( $i != 0 && $i%1000 == 0 ){ // отчёт 1000 эллементов
$sql = substr( $sql, 0, strlen( $sql )-1 ); // обризаем последнюю запятую
$sql .= ';';
$this->_db->query($sql); // сам запрос
$sql = "INSERT INTO $this->_name "; //строим овое тело для следующей тысячи эллементов
$sql.=' (';
for ($a=0,$count1=count($cols);$a<$count1;$a++) {
if ($a>0) {
$sql.=',';
}
$sql.='`' . $cols[$a] . '`';
}
$sql.=' ) values';
}
}
}
...
P.s. Добавление глючит на адаптере pdo_mysql. На mysqli работает корректно, но это недопустимо в проэкте.