2010-12-07 4 views
0

현재 로그 파일을 읽고 MySQL 데이터베이스에 데이터를 저장할 수있는 간단한 PHP 스크립트를 작성하고 있습니다. 이 과정에서 사이트에 웹 요청을 보내서 MySQL 데이터베이스에 삽입되는 일부 데이터를 제공합니다. 나는 그것을 500 개의 레코드를 삽입하고 나서 내 홈페이지로 리다이렉트 할 것을 기대해야하지만, 서버 에러로 끝나고 데이터베이스를 점검 할 때 약 65-70 레코드 만 입력한다. 스크립트가 더 적은 수의 레코드로 작동하므로 로그 파일에 문제가 없는지 확인했습니다. 제발 도와주세요. GeoIP가의 부분에 대한 제한에 따라(PHP + MySQL) 65 번째 레코드에서 항상 서버 오류가 발생합니다.

<?php 
//Make a connection 
$connection = mysql_connect("localhost:3306", "root", "XXXXXXXX"); 

//Select a table 
$db_select = mysql_select_db("major_project", $connection); 

//open file 
$report = fopen('C:\Program Files\Apache Software Foundation\Apache2.2\htdocs\HN.F\report.txt', 'r') or exit("Unable to open report.txt"); 

//insert operation 
while(!feof($report)) 
{ 
    $array = explode("\t", fgets($report)); 

    list($seg, $ts, $rule, $sev, $ref, $ref2, $source, $sourcep, $dest, $destp, $ser) = $array; 

    if($seg != 'Segment') 
    { 
     if(count($array) == 12) 
     { 
      list($seg, $ts, $rule, $sev, $ref, $ref2, $source, $sourcep, $dest, $destp, $ser) = $array; 
      $ipaddrloc = fopen('http://freegeoip.appspot.com/json/'.$source, 'r'); 
      while(!feof($ipaddrloc)) 
      { 
       $var = fgets($ipaddrloc); 
       $lat = json_decode($var)->latitude; 
       $long = json_decode($var)->longitude; 
       $country = json_decode($var)->countryname; 
       $city = json_decode($var)->city; 
      } 
      mysql_query("INSERT INTO `major_project`.`logs` (`LOG_NUMBER`, `Segment`, `Timestamp`, `Rule`, `Severity`, `Reference&nbsp;system`, `Reference`, `Source`, `Source port`, `Dest.`, `Dest. port`, `Service`, `Country`, `City`, `Latitude`, `Longitude`) VALUES (null, '$seg', '$ts', '$rule', '$sev', '$ref', '$ref2', '$source', '$sourcep', '$dest', '$destp', '$ser', '$country', '$city', '$lat', '$long')"); 
     } 
     else 
     { 
      list($seg, $ts, $rule, $sev, $ref, $ref2, $source, $sourcep, $flag, $dest, $destp, $ser) = $array; 
      $ipaddrloc = fopen('http://freegeoip.appspot.com/json/'.$source, 'r'); 
      while(!feof($ipaddrloc)) 
      { 
       $var = fgets($ipaddrloc); 
       $lat = json_decode($var)->latitude; 
       $long = json_decode($var)->longitude; 
       $country = json_decode($var)->countryname; 
       $city = json_decode($var)->city; 
      } 
      mysql_query("INSERT INTO `major_project`.`logs` (`LOG_NUMBER`, `Segment`, `Timestamp`, `Rule`, `Severity`, `Reference&nbsp;system`, `Reference`, `Source`, `Source port`, `Flag`, `Dest.`, `Dest. port`, `Service`, `Country`, `City`, `Latitude`, `Longitude`) VALUES (null, '$seg', '$ts', '$rule', '$sev', '$ref', '$ref2', '$source', '$sourcep', '$flag', '$dest', '$destp', '$ser', '$country', '$city', '$lat', '$long')"); 
     } 
    } 
} 
header("Location: startpage.html"); 

?>

+0

코드를 오류보다 붙여 넣는 것이 더 유용합니다. –

+0

500이면, 더 많이 알려줄 수있는'error.log'가 있습니다. 당신은 그것에 접근 할 수 있습니까? –

+0

하지만 Appspot의 끝 부분에 요청 제한을 두는 것이 좋습니다. 요청을 삭제해도 작동합니까? –

답변

0

, 그들은 트랜잭션의 수를 제한 할 수있다 당신은 등, 특정 기간 내에 제출 방법 많은 제출할 수 있습니다 또는 당신은 단지 수 자신의 서버에서 최대 실행 시간에 도달해야합니다.

나는, 당신이 set_time_limit()PHP Manual를 사용하여 당 스크립트를 기준으로 조정할 수 있습니다 필요 (및 서버 관리자에 의해 허용 된) 경우, phpinfo()를 사용하여 자신의 서버의 한계를 확인하고 수 있다고 생각합니다.

처리되는 행 수가 변동하는 경우 행을 처리하는 데 걸리는 시간을 추적하여 도움을 얻을 수도 있습니다. 행에 카운터를 추가하면 (각 행을 처리 할 때마다 증가하는 단순한 정수) this technique과 같은 것을 사용하면 스크립트가 실행 된 시간을 표시하여 각 행을 시작할 때마다 스크립트가 언제 시작되는지 더 잘 이해할 수 있습니다. 행 당 지연 시간이 길어서 일괄 처리에서 더 적은 수의 행을 처리 할 수 ​​있는지 여부에 관계없이 실행되는 시간은 얼마 남지 않았습니까?

+0

나는 그것을 시도해 줄 것이다 – mib1413456

+0

그것은 일했다! 그래서 스크립트의 시간 제한은 매우 감사합니다. D – mib1413456

+0

우수. 이 질문 옆에있는 체크 표시를 클릭하여이 질문을 정답으로 표시하도록 요청할 수 있습니다. 그것이 당신이 질문을 마감하는 방법이며, 당신을 위해 대답하는 사람들에게 약간의 보상을 제공합니다. 건배. –

관련 문제