@9StarRu

Как разделить файл на части для дальнейшего сохранения в базу данных?

Имеется файл с 10 000 наименованиями товаров, скриптом пытаюсь сохранять данные в базу и все зависает, т.к. скрипт полностью пытается обработать файл.

for($i = 0; $i < $count; $i++){

Предложили решение но для страниц

for($i = $_GET['offset']; $i < $_GET['amount']; $i++){


Можно пакетно делить файл и сохранять данные поэтапно, например по 10 товаров за проход?

Скрипт полностью

<?php
set_time_limit(0);

header('Content-type: text/html; charset=utf8');
ini_set("display_errors", "On");
require_once 'config.php';

/* Вариант 2. 2 строки ниже для вставки только новых значений(не заменяя старых) */
$Query = "INSERT IGNORE INTO `xml`(`id_xml`,`date_xml`,`title_xml`,`link_xml`) VALUES";
$ODKU = ';';

$values = "";
$text = "";

function page_title($url){
    $fp = file_get_contents($url);
    if (!$fp) 
        return null;

    $res = preg_match("/<title>(.*)<\/title>/siU", $fp, $title_matches);
    if (!$res) 
        return null; 

    // Clean up title: remove EOL and excessive whitespace.
    $title = preg_replace('/\s+/', ' ', $title_matches[1]);
    $title = trim($title);
    return $title;
}

// Получаем XML файл

$file = '/var/www/test.xml'; // сохраняем файл XML

$read = simplexml_load_file($file); // получаем объект класса из файла

$xml = $read->Category->Club;

$count = count($xml); // кол-во элементов массива


for($i = 0; $i < $count; $i++){

$text = page_title('https://test.com='.$xml[$i]->Id.'');    

$date_xml = mysql_real_escape_string($xml[$i]->Id);
$title_xml = mysql_real_escape_string($xml[$i]->Title);
$id_xml = mysql_real_escape_string($xml[$i]->Description);
$link_xml = mysql_real_escape_string($xml[$i]->Title);

if (strlen($text) > 0) {
    $link_xml = mysql_real_escape_string($text);
} else {
    $link_xml = mysql_real_escape_string($xml[$i]->Title);
}

//    sleep(SLEEP);

  $values .= "('$id_xml', '$date_xml','$title_xml','$link_xml'),";
  /* заносим данные в БД если накопилось 1000 записей при подготовке запроса */ 
  if($i % 1000 == 0)
  {
    $values[strlen($values)-1]=' ';
    $res = mysql_query("$Query $values $ODKU");
    $values = "";
  }

}

if(strlen($values)>0)
{
  $values[strlen($values)-1]=' ';
  /* заносим данные в БД */
  $res = mysql_query("$Query $values $ODKU");    
}

echo 'Done';
  • Вопрос задан
  • 113 просмотров
Решения вопроса 1
@glagolew059
frontend developer
можно после каждой итерации записи в БД добавить небольшую задержку, например usleep(100000), т.е. 0.1 сек. (тут уже поиграться можно с длительностью задержки)
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы