2010-12-06 5 views
0

대개 사람들이 스크립트가 작동하지 않는다고 불평하지만, 멈추고 싶어도 계속 작동하는 경우가 있습니다.PHP 스크립트가 실패 할 때 계속 작동합니다.

필자는 줄을 분석하고 DB 테이블에 항목을 삽입하는 CSV 파서를 사용합니다. 프로젝트에 PDO와 Zend Framwork를 사용하고 있습니다. 코드가 잘 작동 .. 사실 너무 잘.

public function save() 
{ 
    $memory_limit = ini_get('memory_limit'); 
    ini_set('memory_limit', '512M'); 

    $sql = " 
     INSERT INTO my_table (
      date_start, 
      timeframe, 
      type, 
      country_to, 
      country_from, 
      code, 
      weight, 
      value    
     ) VALUES (?,?,?,?,?,?,?,?) 
     ON DUPLICATE KEY UPDATE 
      weight = VALUES(weight), 
      value = VALUES(value) 
    "; 
    if ($this->test_mode) { 
     echo $sql; 
     return; 
    } 
    $stmt = new Zend_Db_Statement_Pdo($this->_db, $sql); 
    foreach($this->parsed_data as $entry){ 
     $stmt->execute(array_values($entry)); 
     $affected_rows = $stmt->rowCount(); 
     if ($affected_rows){ 
      $this->_success = true; 
     } 
    } 
    unset($this->parsed_data, $stmt, $sql); 
    ini_set('memory_limit', $memory_limit); 
} 

큰 파일을 구문 분석 할 때 스크립트를 완료하는 데 몇 초가 걸립니다. 이 문제는 ESC 또는 심지어 페이지를 닫음으로써 스크립트를 중지하려고 할 때 나타납니다. 스크립트는 모든 항목을 삽입 할 때까지 중지되지 않습니다. 아파치를 재 장전하는 것조차이 문제를 고치지 않고있다.

나는 이것이 정상적인 행동이 아니며 어쩌면 내가 잘못된 제안을하고 있으므로 제안을 요청할 것이라고 생각합니다.

감사합니다. '브라우저가 사라질가 승리 의미하지 않는다해서 -

+0

실행중인 스레드는 실행중인 스레드입니다. 이것을 고려하십시오 : 한 폴더에서 다른 폴더로 대용량 파일을 복사하기 시작하면 너무 오래 걸리고 파일 복사를 시작한 파인더/탐색기 창을 닫으면 파일 전송이 중지됩니까? 네가 여기서 똑같은 문제를 겪을 것을 기대한다. – DampeS8N

+0

PHP를 스크립팅 언어로 사용하려는 것 같습니다. 더 많은 제어권을 얻기 위해 브라우저가 아닌 명령 행 인터프리터에서이 코드를 실행할 수 있습니다. –

답변

2

내가 그 표준 PHP 동작입니다 확신 해요 ..

UPDATE 에서 ignore_user_abort은 (기본 동작) 해제되어 있으므로 사용자의 중단이 고려되어야한다 스크립트 처리를 중지하십시오. (아파치 재시작 등이이 목표를 달성 할 것입니다.)

이 동작을 변경하려면 ignore_user_abort을 사용할 수 있습니다.

난 당신이 겪고있는 문제가 될 수 의심, " PHP는 시도가 클라이언트에 정보를 전송 될 때까지 사용자가 연결을 중단했다 감지하지 않을 것이다"고 말했다 그.

자세한 내용은 위 링크와 PHP runtime configuration information을 참조하십시오.

+0

이 정보에 대한 링크 또는 소스를 제공 할 수 있습니까? ESC를 클릭하면 다른 짧은 스크립트가 멈 춥니 다. –

+0

@ 엘조 - 내 대답을 업데이트했습니다. 희망이 도움이됩니다. –

+0

@Elzo Valugi 아니요, 그렇지 않습니다. –

0

틀리지 않습니다. 귀하의 시도 때문에 작동하지 않습니다

  • 탈출 -이 페이지의 작업에 전혀 관련이 있기 때문에 - 대부분의 브라우저가 실제로 폐쇄 그것을
  • (또는 새로 고침) 페이지에 반응하지 않는 - 다시, 관련 없음 - SERVER가 무언가를하고 있으며 클라이언트 측이 멈 추면 PHP가 멈추지 않습니다 - 서버가 클라이언트가 페이지를 닫았거나 새로 고쳤는지 실제로 알 수 없습니다.
  • PHP 리포팅 - PHP forked 프로세스를 죽이지 않습니다.

다시 시작해야 할 일 - PHP 프로세스 및 내용을 삭제합니다. 그것은 다소 골칫거리지만. (긴 실행이 바람직하지 않은 경우) 이렇게

방법은() 실제로 PHP 함수를 하고 set_time_limit를 사용하여, 실행 시간 제한을 설정, 또는 (그렇지 않을 경우) 분석을 더 최적화하기 위해.

관련 문제