У меня есть 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 как новый запрос и существующий скрипт не будут ждать ответа).
Вы пробовали set_time_limit (0)? – Ido
Это может быть проблема с лимитом. Попытка увеличить 'max_execution_time' и' memory_limit'. Возможно, вам также понадобится сыграть вокруг 'set_time_limit()'. – BenM
Я установил set_time_limit (0) и ini_set ('max_execution_time', '0'). браузер сервера по-прежнему возвращается к предыдущей странице. это не настройка браузера, так как я говорил с технологией сервера, и они сказали мне свой параметр apache, и они не будут делать больше, чтобы избежать плохих сценариев. это также не проблема памяти, так как я установил ее в 4000 (проверил whit echo ini_get как значения, и они меняются по-разному) – Tavi