Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Импорт в базу большого колличества строк через ssh

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
Vdomah
Отправлено: 28 Ноября, 2013 - 16:57:49
Post Id


Новичок


Покинул форум
Сообщений всего: 53
Дата рег-ции: Июль 2012  


Помог: 0 раз(а)




Здравствуйте!!

Задача в следующем: нужно наладить импорт данных из .xlsx в базу.

В файле .xlsx около 130 000 строк. Скрипт написан и импорт на локалке через командную строку успешно происходит. В цикле вытягивается поочередно каждая строка из екселя и апдейтится строка в базе. Но когда запускаю тот же скрипт на хостинге через ssh, импорт валит сервер где-то на 30 000 строке.

Добавлено:
Возможно проблема в запросе. Может оптимизировать как-нибудь множественный UPDATE?

Подскажите чем можно в этой ситуации помочь. Также привожу скрипт на всякий случай:
PHP:
скопировать код в буфер обмена
  1. $strings = simplexml_load_file('import/xl/sharedStrings.xml');
  2.         $sheet = simplexml_load_file('import/xl/worksheets/sheet1.xml');
  3.         $xlrows = $sheet->sheetData->row;
  4.         $i=0;
  5.         foreach ($xlrows as $xlrow) {
  6.             $arr = array();
  7.            
  8.             // In each row, grab it's value
  9.             foreach ($xlrow->c as $cell) {
  10.                 $v = (string) $cell->v;
  11.                
  12.                 // If it has a "t" (type?) of "s" (string?), use the value to look up string value
  13.                 if (isset($cell['t']) && $cell['t'] == 's') {
  14.                     $s  = array();
  15.                     $si = $strings->si[(int) $v];
  16.                    
  17.                     // Register & alias the default namespace or you'll get empty results in the xpath query
  18.                     $si->registerXPathNamespace('n', 'http://schemas.openxmlformats.org/spreadsheetml/2006/main');
  19.        
  20.                     // Cat together all of the 't' (text?) node values
  21.                     foreach($si->xpath('.//n:t') as $t) {
  22.                         $s[] = (string) $t;
  23.                     }
  24.        
  25.                     $v = implode($s);
  26.                 }
  27.                
  28.                 $arr[] = $v;
  29.             }
  30.            
  31.             // Assuming the first row are headers, stick them in the headers array
  32.             if (count($headers) == 0) {
  33.                 $headers = $arr;
  34.             } else {
  35.                 // Combine the row with the headers - make sure we have the same column count
  36.                 $values = array_pad($arr, count($headers), 0);
  37.                 $row    = array_combine($headers, $values);
  38.  
  39.                 $name = explode('=',$row['NAME']);
  40.                 $article = preg_replace( '/[^0-9]/', '', $name[0] );
  41.                
  42.                 if($row['KOL1'] > 0)
  43.                     $status = 1;
  44.                 else
  45.                 if($row['KOL2'] > 0 || $row['KOL3'] > 0 || $row['KOL4'] > 0)
  46.                     $status = 2;
  47.                 else
  48.                     $status = 0;
  49.  
  50.                     $mysql_query = "UPDATE `ARTICLES` JOIN `ART_LOOKUP` ON `ART_ID` = `ARL_ART_ID` SET `price` = " . $row['CENA'] .", `status` = " . $status . ", `article` = ARL_DISPLAY_NR WHERE `ARL_SEARCH_NUMBER` = '" . $article . "'";
  51.  
  52.                 if(!mysql_query($mysql_query)){
  53.                     echo "Invalid query: " . mysql_error(); exit;
  54.                 }else{
  55.                   echo 'inserted' . $i . ' '; if($i==30000) exit;
  56.                 }
  57.                 $i++;
  58.             }
  59.         }

(Отредактировано автором: 28 Ноября, 2013 - 17:07:06)

 
 Top
IllusionMH
Отправлено: 28 Ноября, 2013 - 17:12:07
Post Id



Активный участник


Покинул форум
Сообщений всего: 4254
Дата рег-ции: Февр. 2011  
Откуда: .kh.ua


Помог: 242 раз(а)




Vdomah, он там по памяти или по таймауту не отваливается?
А почему бы не использовать обычный csv файл?
 
 Top
Vdomah
Отправлено: 28 Ноября, 2013 - 17:25:38
Post Id


Новичок


Покинул форум
Сообщений всего: 53
Дата рег-ции: Июль 2012  


Помог: 0 раз(а)




IllusionMH пишет:
Vdomah, он там по памяти или по таймауту не отваливается?
А почему бы не использовать обычный csv файл?

Говорят про большую нагрузку в техподдержке. Но на всякий случай уточню еще раз, вдруг не так их понял.

А чем csv тут поможет? Быстрее будет сам пхп вытягивать данные, а запросы в БД не поменяются ведь, или о чем вы?
 
 Top
IllusionMH
Отправлено: 28 Ноября, 2013 - 17:30:29
Post Id



Активный участник


Покинул форум
Сообщений всего: 4254
Дата рег-ции: Февр. 2011  
Откуда: .kh.ua


Помог: 242 раз(а)




Vdomah, не уверен что бyдет выигрыш в размере файла. Но думаю, что читать построчно и работать с массивом это быстрее чем разбирать xml
(Добавление)
Лол
PHP:
скопировать код в буфер обмена
  1.  echo 'inserted' . $i . ' '; if($i==30000) exit;


Ну вот на эксите и конец скрипту, по-идее Ха-ха
Или это для проверочных целей? Хм

(Отредактировано автором: 28 Ноября, 2013 - 17:32:42)

 
 Top
DelphinPRO
Отправлено: 28 Ноября, 2013 - 17:33:16
Post Id



Активный участник


Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012  


Помог: 353 раз(а)




IllusionMH пишет:
Vdomah, он там по памяти или по таймауту не отваливается?

навряд ли в этом дело. На большинстве хостингов стоит ограничение на количетсво insert\update завпросов в определенный интервал времени.

Решение простое - объединить запросы в транзакцию.
(Добавление)
ну а так как mysql_* транзакции не поддерживает - придется переписать на PDO Улыбка
(Добавление)
IllusionMH пишет:
if($i==30000) exit;
Радость


-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
Vdomah
Отправлено: 28 Ноября, 2013 - 19:23:03
Post Id


Новичок


Покинул форум
Сообщений всего: 53
Дата рег-ции: Июль 2012  


Помог: 0 раз(а)




Цитата:
if($i==30000) exit;

Проверочных конечно)))
Цитата:
Решение простое - объединить запросы в транзакцию.

Черт, таблица кроме всего в MyISAM. Лдано, попробую транзакции.
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Работа с СУБД »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB