2014-10-14 2 views
1

У меня есть xml-файл, содержащий информацию, которую я хочу сохранить или обновить в базе данных. мой сервер перенаправляет меня на предыдущую страницу, если через 30 секунд скрипт не завершит выполнение (изменилось максимальное время выполнения, не помогло)send array over ajax

Я хочу разбить файл на несколько массивов и отправить их через ajax для обработки в больше экземпляров, пытаясь сократить время выполнения.

Файл содержит 38k строк, и через 30 секунд я могу добавить 6700 новых объектов в db или обновить 3800 существующих.

так есть способ сделать это? Я очень новичок в ajax, поэтому я даже не знаю, с чего начать искать решение.

EDIT1:

<?php 
$time = microtime(TRUE); 
$xml = simplexml_load_string(file_get_contents($feed)); 
$json = json_encode($xml); 
$array = json_decode($json,TRUE); 
$array= $array['Row']; 
    set_time_limit(0); 
    ini_set('memory_limit','4000M'); 
//echo ini_get('max_execution_time'); 
//die(); 
$new = 0; 
$existent = 0; 
foreach($array as $produs) 
{ 
     $prod = Products::model()->findbyattributes(array('cod'=>$produs['ProductId'])); 
     if(!$prod) 
     { 
      $prod = new Products; 
      $prod->cod = $produs['ProductId']; 
      $prod->price = $produs['PriceSRP']; 
      $prod->name = $produs['Name']; 
      $prod->furnizor= 'ABCData'; 
      $prod->brand = $produs['HierarchyNameLevel1']; 
      //$prod->stock = $produs['Available']; 
      if($produs['Available'] == "+") 
       $prod->stock = 'Da'; 
      else 
       {$prod->stock = 'Nu';} 
      $prod->category = $prod->getCategory($produs['MinorGroup'], 'ABC'); 
      if(!$prod->category) 
       continue; 
      if(!$prod->save()) 
      { 
       echo '<pre>'; 
       var_dump($prod->geterrors()); 
       echo '</pre>'; 
      } 
      else{$new++;} 
     } 
     elseif($prod) 
     { 
      $prod->brand = $produs['HierarchyNameLevel1']; 
      $prod->price = $produs['PriceSRP']; 
      $prod->last_edit = date('Y-m-d H:i:s'); 
      if($produs['Available'] == "+") 
       $prod->stock = 'Da'; 
      else 
       {$prod->stock = 'Nu';} 

      if(!$prod->save()) 
      { 
       echo '<pre>'; 
       var_dump($prod->geterrors()); 
       echo '</pre>'; 
      } 
      else {$existent++;} 

     } 
    } 
    echo 'adaugat '.$new.' si updatat '.$existent.' produse in '; 
    print (microtime(TRUE)-$time). ' secunde!'; 
    ?> 

оказывается я, возможно, было неясно, в моем первоначальном сообщении. , так что это мой существующий код. файл $ feed имеет в нем 38 тыс. элементов, которые мне нужно обработать и добавить или обновить существующие записи дБ.

Если я запустил полный файл 38k через 30 секунд, браузер выполняет команду history.back(), вызываемую сервером apache. я бы хотел обработать файл из crond и process, например, 1 запись каждую секунду, но это невозможно, поскольку у меня нет доступа к crond на этом конкретном сервере. Я попытался разбить файл вручную, и он отлично работает для ~ 6700 новых записей или 3500 - 4000 существующих (поскольку он должен их найти, загрузить, обновить и сохранить)

поэтому моя первоначальная проблема , и то, что я спрашивал, возможно ли это сделать через ajax, чтобы сервер не остановил выполнение сценария, если его дольше их 30 секунд (так как я даже не знаю, будет ли сервер интерпретировать ajax как новый запрос и существующий скрипт не будут ждать ответа).

+0

Вы пробовали set_time_limit (0)? – Ido

+0

Это может быть проблема с лимитом. Попытка увеличить 'max_execution_time' и' memory_limit'. Возможно, вам также понадобится сыграть вокруг 'set_time_limit()'. – BenM

+0

Я установил set_time_limit (0) и ini_set ('max_execution_time', '0'). браузер сервера по-прежнему возвращается к предыдущей странице. это не настройка браузера, так как я говорил с технологией сервера, и они сказали мне свой параметр apache, и они не будут делать больше, чтобы избежать плохих сценариев. это также не проблема памяти, так как я установил ее в 4000 (проверил whit echo ini_get как значения, и они меняются по-разному) – Tavi

ответ

1

Я хотел бы сохранить файл XML в папке темп, а затем сделать AJAX GET, который запускает файл из конкретного от набора для (например) 100 записей:

function processScript(offset) { 
    $.ajax({ 
     type: "POST", 
     url: "some.php", 
     data: { offset:offset }, 
     dataType:'json', 
     success: function(data) { 
      var o = parseJSON(data); 
      if(o.offset > 0) { 
       processScript(o.offset); 
      } 
     } 
    }) 
} 
processScript(0); 

В some.php вы хотели бы вернуть объект json с «смещением» свойства, содержащий следующий блок элементов, который вы хотите обработать. Когда файл xml будет завершен, установите смещение на 0.

Приведенный выше код достаточно, чтобы вы начали. Вы также захотите выполнить какое-то зашифрование ошибок в функции success, а также дать уведомление о прогрессе пользователю (например, «3,600 из 38 000 строк»?).

+0

Я обязательно попробую это и дам вам знать, если он работает. Большое спасибо за то время, которое вы пытались помочь! – Tavi

+0

длинный рассказ короткий: он работает, спасибо очень очень много! – Tavi

-1
array = $('.def-mask :checkbox:checked').serialize(); 

$.ajax({ 

    url: 'ajax/battle.php', 

    type: 'post', 

    data: { playerReady: 1, attack: attack, defence: array }, 

    success: function(data) { 

     alert(data); 
    } 
}); 

More info

+0

Просто выдавать код может быть недостаточно, было бы лучше иметь объяснение. – StackFlowed