2014-10-14 3 views
1

데이터베이스에 저장하거나 업데이트하려는 정보가 들어있는 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 초 (만약 내가 서버가 아약스를 해석하는 경우에도 알지도 못한다면 실행에서 스크립트를 중지하지 않습니다 새로운 요청 및 기존 스크립트는 응답하기를 기다리지 않습니다).

+0

set_time_limit (0)을 시도 했습니까? – Ido

+0

mem 한도 문제 일 수 있습니다. 'max_execution_time'과'memory_limit'를 증가시키고 있습니다. 당신은 또한'set_time_limit()'주위를 놀 필요가있다. – BenM

+0

나는 set_time_limit (0)과 ini_set ('max_execution_time', '0')을 설정했다. 서버 브라우저는 여전히 이전 페이지로 돌아갑니다. 서버 기술에 대해 말한 이후로 브라우저 설정이 아니며 아파치 설정에 대해 알려 주었고 잘못된 스크립트를 피하기 위해 더 이상 시간을 낭비하지 않을 것입니다. 4000으로 설정했기 때문에 메모리 문제가 아닙니다. (두 가지 값을 모두 확인하고 corectly를 변경합니다.) – Tavi

답변

1

내가 임시 폴더에 XML 파일을 저장 것, 다음에서 파일을 실행 아약스 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에서 처리하려는 요소의 다음 블록을 포함하는 'offset'속성을 사용하여 json 객체를 반환하고자 할 것입니다. xml 파일이 완료되면 오프셋을 0으로 설정하십시오.

위 코드는 시작하기에 충분합니다. 또한 success 함수에서 일종의 오류 치핑을 수행하고 사용자에게 진행 알림을 제공해야합니다 (예 : "3,600 of 38,000 lines process"?).

+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

관련 문제