2012-03-17 6 views
1

첫째, 관련 답변을 검색했지만 몇 가지가 있습니다. 그러나 찾고자하는 것에 특정적인 것을 찾을 수 없습니다. 나는 더 좋은 방법이 있다고 확신한다!PHP CSV - MYSQL Timing out

기본적으로 저는 조언을 구하고 있습니다. 서버에있는 CSV 파일을 MYSQL 데이터베이스로 변환하는 스크립트가 있습니다. 그러나 CSV 파일은 20MB이고 스크립트는 시간 초과되었습니다. 나는 php.ini 파일을 수정하여 시간 초과하지 말고 대신 500 내부 서버 오류를 발생시킵니다. 페이지를 라이브로 유지할 수있는 방법이 있나요? (jquery는 이와 같은 일을합니다.) 그렇지 않다면, 과거의 큰 SQL 파일에 대해 셸 실행을 사용했음을 알고 있습니다. 이? 조언 정말 감사하겠습니다. 오히려 CSV 수동 프로세스를보다

<?php 
$databasehost = "localhost"; 
$databasename = "test"; 
$databasetable = "sample"; 
$databaseusername ="test"; 
$databasepassword = ""; 
$fieldseparator = ","; 
$lineseparator = "\n"; 
$csvfile = "filename.csv"; 
/********************************/ 
/* Would you like to add an ampty field at the beginning of these records? 
/* This is useful if you have a table with the first field being an auto_increment integer 
/* and the csv file does not have such as empty field before the records. 
/* Set 1 for yes and 0 for no. ATTENTION: don't set to 1 if you are not sure. 
/* This can dump data in the wrong fields if this extra field does not exist in the table 
/********************************/ 
$addauto = 0; 
/********************************/ 
/* Would you like to save the mysql queries in a file? If yes set $save to 1. 
/* Permission on the file should be set to 777. Either upload a sample file through ftp and 
/* change the permissions, or execute at the prompt: touch output.sql && chmod 777 output.sql 
/********************************/ 
$save = 1; 
$outputfile = "output.sql"; 
/********************************/ 


if(!file_exists($csvfile)) { 
     echo "File not found. Make sure you specified the correct path.\n"; 
     exit; 
} 

$file = fopen($csvfile,"r"); 

if(!$file) { 
     echo "Error opening data file.\n"; 
     exit; 
} 

$size = filesize($csvfile); 

if(!$size) { 
     echo "File is empty.\n"; 
     exit; 
} 

$csvcontent = fread($file,$size); 

fclose($file); 

$con = @mysql_connect($databasehost,$databaseusername,$databasepassword) or die(mysql_error()); 
@mysql_select_db($databasename) or die(mysql_error()); 

$lines = 0; 
$queries = ""; 
$linearray = array(); 

foreach(split($lineseparator,$csvcontent) as $line) { 

     $lines++; 

     $line = trim($line," \t"); 

     $line = str_replace("\r","",$line); 

     /************************************ 
     This line escapes the special character. remove it if entries are already escaped in the csv file 
     ************************************/ 
     $line = str_replace("'","\'",$line); 
     /*************************************/ 

     $linearray = explode($fieldseparator,$line); 

     $linemysql = implode("','",$linearray); 

     if($addauto) 
      $query = "insert into $databasetable values('','$linemysql');"; 
     else 
      $query = "insert into $databasetable values('$linemysql');"; 

     $queries .= $query . "\n"; 

     @mysql_query($query); 
} 

@mysql_close($con); 

if($save) { 

     if(!is_writable($outputfile)) { 
      echo "File is not writable, check permissions.\n"; 
     } 

     else { 
      $file2 = fopen($outputfile,"w"); 

      if(!$file2) { 
        echo "Error writing to the output file.\n"; 
      } 
      else { 
        fwrite($file2,$queries); 
        fclose($file2); 
      } 
     } 

} 

echo "Found a total of $lines records in this csv file.\n"; 


?> 
+0

() fgetcsv 같은 기능을 사용하는 방법에 대해 알아 구문 분석하지 마십시오 –

답변

2

것은, 당신이 사용하는 하나 개의 MySQL의 명령을 수행 할 수 있어야한다 : 내 프로그래밍 지식의 밤은 정말 너무 좋은, 그래서 여기에

내가 사용하고있는 스크립트입니다 기다려주십시오 LOAD DATA INFILE. 이렇게하면 처리가 MySQL로 옮겨져 PHP가 종료되지 않습니다. 여전히 시간 초과가되면 셸에서 항상 같은 명령을 실행할 수 있습니다.

+0

용서 내 지식의 부족하지만, LOAD 데이터 INFILE은 PHP로 작성 될 수있다 ? –

+0

@BushellConsultancy 물론, MySQL 명령 일 뿐이므로, PHP-MySQL 라이브러리 중 하나를 사용하여 데이터베이스 서버에서 실행할 수 있어야합니다. – liquorvicar

+0

귀하의 결과에 근거한 약간의 검색으로 나는 그 일을 끝내고 있습니다. 다른 누군가가 알고 싶어하는 경우 : $ query = "LOAD DATA LOCAL INFILE 'aw2_dap_combined_all_csv.csv'INTO TABLE 모바일 필드가 종료 됨 ','LINES TERMINATED BY '\ n'"; –

1

자신의 CSV가

사용 PHP의 내장 함수 fgetcsv()