2013-08-28 4 views
0

WordPress 사이트의 관리 섹션에 웹 인터페이스가 내장되어 있습니다. 그것은 내 데이터베이스에있는 몇 가지 테이블을 긁어 그냥 행별로 큰 데이터 목록을 표시합니다. 이 데이터에는 약 30,000 개의 행이 있으며 for 루프에 기본 에코가 표시됩니다. 한 페이지에 30,000 개의 행을 모두 표시하면 문제가 없습니다.예기치 않게 PHP 서버 파일 다운로드가 끊깁니다.

또한 전체 데이터 행의 CSV 파일을 다운로드하는 옵션이 포함되어 있습니다. 나는 fopenfputcsv을 사용하여 데이터 쿼리 결과에서 다운로드 할 CSV 파일을 작성합니다. 이 기능을 사용해 보았지만 데이터 세트가 30,000에 이르면 CSV가 더 이상 올바르게 생성되지 않습니다. 대부분의 데이터를 제외하고 처음 200 ~ 1000 행이 CSV 파일에 기록됩니다. 내 경우 올바르게 생성되지 않은 CSV는 약 10 메가가 될 것으로 예상합니다. 그런 다음 모든 파일이 제대로 작동하고있는 것처럼 파일은 처음 200 ~ 1000 행을 다운로드합니다. 내가 다운로드 할 수있는 전체 CSV 파일을 얻기 위해 변경할 필요가 무엇인지 확실하지 않다

// This gets a huge list of data from a SP I built. This data is well formed 
$data = $this->run_stats_stored_procedure($job_to_report); 

// This is where the data is converted into a csv file. This part is broken 
// the file may already exist at that location burn it down if it does 
if(file_exists(ABSPATH . "some/path/to/my/file/csv_export.csv")) { 
    unlink(ABSPATH . "some/path/to/my/file/csv_export.csv");     
} 
$csv_file_handler = fopen(ABSPATH . "some/path/to/my/file/candidate_export.csv", 'w'); 

if(!empty($csv_file_handler)) { 

    $title_array = array(
     "ID", 
     "other_feild" 
    ); 

    fputcsv($csv_file_handler, $title_array, ","); 

    if(!empty($data)) { 

     foreach($data as $data_piece) { 
      $array_as_csv_line = array(); 

      foreach($data_piece as $object_property) {     
       $array_as_csv_line[] = (string)$object_property; 
      } 

      fputcsv($csv_file_handler, $array_as_csv_line, ",");  
      unset($array_as_csv_line); 
     } 
    } else { 
     fputcsv($csv_file_handler, array("empty"), ","); 
    }   
    // pros clean everything up when they are done 
    fclose($csv_file_handler); 
} 

: 여기

는 코드입니다. 나는 이것이 설정 문제 일 수 있다고 생각하지만 나는 그렇게하지 않아야한다. 나는이 기능이 20,000 개의 csv 행을 처리하는 데 사용 되었기 때문에 이것을 믿게되었습니다. 이제는 30,000 개가됩니다. 추가 정보가 도움이되는지 알려주세요. 전에 거대한 CSV 파일로 문제가 발생한 사람 있습니까? 도와 줄 수있는 사람에게 감사드립니다.

답변

2

"다운로드"가 1 분, 2 분 또는 3 분 이상 진행되고 있습니까? 그렇다면 웹 서버가 연결을 닫을 수 있습니다. 예를 들어, Apache FCGI 모듈을 사용하는 경우에는 다음 지시문을 사용합니다.

FcgidBusyTimeout 

기본값은 300 초입니다.

이 요청 처리의 최대 시간 제한이다. FastCGI 요청이 FcgidBusyTimeout 초 내에 완료되지 않으면 종료 될 수 있습니다.

희망이 당신의 문제를 해결하는 데 도움이됩니다.

0

현재 구현중인 답변은 스크립트가 더 많은 시간을 사용하도록 허용하는 것입니다. 이렇게하려면 스크립트를 실행하기 전에 다음 코드를 실행하기 만하면됩니다.

set_time_limit (3600); 

이 방법은 지속 가능한 솔루션이 아니기 때문에 앞으로 더 자세히 조사 할 것입니다. 더 이상의 조언을 크게 주시면 감사하겠습니다.

관련 문제