데이터베이스에 저장하거나 업데이트하려는 정보가 들어있는 XML 파일이 있습니다. 내 서버가 30 초 내에 스크립트가 실행을 끝내지 않으면 이전 페이지로 리디렉션됩니다 (최대 실행 시간 변경, 도움 안됨)아약스를 통해 배열 보내기
파일을 여러 배열로 분할하여 처리 할 AJAX로 보내고 싶습니다. 따라서 실행 시간을 단축하려고합니다.
파일에 38k 행이 있고 30 초 안에 db에 6700 개의 새 객체를 추가하거나 기존 객체를 3800 개 더 추가 할 수 있습니다.
이렇게 할 수있는 방법이 있습니까? 나는 아약스가 너무 익숙하지 않기 때문에 어디서부터 해결책을 찾기 시작할 지조차 모른다.
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 파일에는 기존 db 항목을 처리하고 추가하거나 업데이트해야하는 항목이 38k 개 있습니다.
브라우저가 30 초 후 전체 38k 파일을 실행하면 브라우저가 apache 서버에서 호출 한 history.back()을 수행합니다. 내가 crond에서 파일을 처리하고 예제 1 초마다 항목을 처리하는 것이 좋겠지 만 그 특정 서버에 crond에 액세스 할 수 없기 때문에 그것은 불가능합니다. 나는 파일을 수동으로 분할하려고 시도했는데 ~ 6700 개의 새 항목 또는 3500-4000 개의 기존 항목 (찾기, 저장, 업데이트 및 저장해야하므로 완벽하게 작동 함)
내 초기 문제 , 그리고 내가 아약스를 통해 그것을 할 posible 경우 그래서 서버는 더 이상 30 초 (만약 내가 서버가 아약스를 해석하는 경우에도 알지도 못한다면 실행에서 스크립트를 중지하지 않습니다 새로운 요청 및 기존 스크립트는 응답하기를 기다리지 않습니다).
set_time_limit (0)을 시도 했습니까? – Ido
mem 한도 문제 일 수 있습니다. 'max_execution_time'과'memory_limit'를 증가시키고 있습니다. 당신은 또한'set_time_limit()'주위를 놀 필요가있다. – BenM
나는 set_time_limit (0)과 ini_set ('max_execution_time', '0')을 설정했다. 서버 브라우저는 여전히 이전 페이지로 돌아갑니다. 서버 기술에 대해 말한 이후로 브라우저 설정이 아니며 아파치 설정에 대해 알려 주었고 잘못된 스크립트를 피하기 위해 더 이상 시간을 낭비하지 않을 것입니다. 4000으로 설정했기 때문에 메모리 문제가 아닙니다. (두 가지 값을 모두 확인하고 corectly를 변경합니다.) – Tavi