2011-05-14 3 views
1

스크립트를 실행하면 모든 데이터 행을 처리하기 전에 다음 오류가 발생합니다. 30초 의최대 실행 시간이 30 초를 초과했습니다

최대 실행 시간이 문제를 조사한 후

을 초과, 나는 문제를 해결해야 max_execution_time이라는 시간을 연장 할 수 있어야한다.

내 PHP 프로그래밍 초기 단계에서 아래 스크립트를 사용하는 것이 더 효과적인 방법인지 알고 싶습니다. 따라서 "감옥에서 벗어남"에 의존 할 필요가 없습니다.

스크립트는 다음과 같습니다

1

은 CSV가에서 내 SQL 테이블에

을 CSV 데이터 10,000 행을 삽입하려고 일부 열

3을 따기

이 벚꽃을 제기 촬영 내 머리 내가 덩어리로 삽입 할 수 있어야한다고 생각하지만, 내 스킬 셋을 훨씬 넘어선 나는 한 줄을 쓰는 방법조차 모른다 : \

많은 미리 감사드립니다.

<?php 
function processCSV() 
{ 
    global $uploadFile; 
    include 'dbConnection.inc.php'; 
    dbConnection("xx","xx","xx"); 
    $rowCounter = 0; 
    $loadLocationCsvUrl = fopen($uploadFile,"r"); 
    if ($loadLocationCsvUrl <> false) 
    { 
     while ($locationFile = fgetcsv($loadLocationCsvUrl, ',')) 
     { 
      $officeId = $locationFile[2]; 
      $country = $locationFile[9]; 
      $country = trim($country); 
      $country = htmlspecialchars($country); 
      $open = $locationFile[4]; 
      $open = trim($open); 
      $open = htmlspecialchars($open); 
      $insString = "insert into countrytable set officeId='$officeId', countryname='$country', status='$open'"; 
       switch($country) 
       { 
        case $country <> 'Country': 
         if (!mysql_query($insString)) 
         { 
          echo "<p>error " . mysql_error() . "</p>";  
         } 
         break; 
       } 
      $rowCounter++; 
     } 
     echo "$rowCounter inserted."; 
    } 
    fclose($loadLocationCsvUrl); 
} 
processCSV(); 
?> 
+0

이 작업을 한 번 수행해야합니까, 아니면 데이터베이스에 10k 행을 삽입해야합니까? –

+0

또한 웹 서버를 통해이를 실행하고 있습니까? 즉, 브라우저에서 페이지를 호출하고 있습니까, 아니면 명령 줄을 통해 실행하고 있습니까? – stevecomrie

+0

@Salman A> 아마도 월 2 ~ 3 번 – user752336

답변

3

첫째, 2011 년에는 상 mysql_query를 사용하지 않습니다. mysqli 또는 PDO와 준비된 문을 사용한다. 그렇다면 SQL 용 문자열을 이스케이프 처리하는 방법을 알아야 할 필요가 없습니다. 이 목적으로 완전히 잘못 사용 된 htmlspecialchars을 사용했습니다. 다음으로 트랜잭션을 사용하여 많은 삽입 작업의 속도를 높일 수 있습니다. MySQL은 여러 관심 분야를 지원합니다.

하지만 가장 좋은 방법은 CSV 스토리지 엔진을 사용하는 것입니다. http://dev.mysql.com/doc/refman/5.0/en/csv-storage-engine.html 여기를 읽으십시오. 즉시 모든 것을 SQL에로드 한 다음 원하는대로 조작 할 수 있습니다. 이 문서에서는 load data infile 명령도 보여줍니다.

+0

고맙습니다. "CSV 스토리지 엔진"에 대해 들어 본 적이 없습니다. 구현하기 위해 연구 할 것입니다. 불쌍한 코드에 대해 유감스럽게 생각합니다. 나는이 모든 것을 처음 접했고, 읽었으며 오래된 책이었습니다. – user752336

0

삽입하기 전에 다음 함수를 호출 해보십시오. 30 초 기본 시간 대신 시간 제한을 무제한으로 설정합니다.

set_time_limit(0);

+0

문제는 제한 시간을 변경하지 않고 문제를 해결하는 방법이었습니다. – Arjan

1

글쎄, 이와 같은 단일 쿼리를 생성 할 수 있습니다.

$query = "INSERT INTO countrytable (officeId, countryname, status) VALUES "; 
$entries = array(); 
while ($locationFile = fgetcsv($loadLocationCsvUrl, ',')) { 
    // your code 
    $entries[] = "('$officeId', '$country', '$open')"; 
} 

$query .= implode(', ', $enties); 
mysql_query($query); 

그러나 이는 쿼리 시간 및 서버 한도 설정에 따라 달라집니다.

하지만 다른 게시물을 읽을 때 더 좋은 방법이 있습니다. 그러나 나는 당신이 생각한 방식을 공유해야합니다.

+0

나는 똑같이 말하려고했다. 나는 최근 mysqldump 파일에서 mysql에 ~ 3 분 안에 1.3GB의 데이터를 가져왔다. 10k 레코드는 여러 삽입 문과 관련된 문제가 아니어야하지만 삽입 당 500 행의 배치로 나누어야합니다. –

+0

큰 차이를 만들었습니다. – user752336

관련 문제