2012-01-27 6 views
1

이것은 내가 자주 경험 한 것입니다. PostGreSql 데이터베이스에 데이터를 삽입하는 PHP 스크립트를 실행 중입니다. 가끔이 스크립트 실행을 중간에 중단하면 어떻게 든 데이터가 데이터베이스에 계속 추가됩니다.데이터를 삽입하는 PHP 스크립트가 중지 된 후에도 데이터가 DB에 삽입됩니다.

왜 이런 일이 발생하며이 문제를 어떻게 피할 수 있습니까?

+2

브라우저에서 "중지"를 누르기 만해도 실제로 PHP 스크립트가 중지되는 것은 아니며 브라우저에서 추가 출력이 끊어지는 것에 유의하십시오. 스크립트는 완료되거나 시간이 초과 될 때까지 서버에서 계속 실행됩니다. – Piskvor

+0

@Mitch, 실행을 시작할 때 스크립트를 "중지"하고 수천 개의 레코드를 삽입하는 경우에도 발생합니다. –

+0

@Piskvor 당신이 문제를 가장 잘 이해했다고 생각합니다! 당신 주위에 방법을 말해 줄 수 있어요? 서버를 다시 시작하면 어떻게 되나요? –

답변

1

주를 결코 실패 sholud, 그것은 바로 연결이 끊어집니다 브라우저에서 추가 출력. 스크립트는 완료되거나 시간이 초과 될 때까지 서버에서 계속 실행됩니다.

서버를 다시 시작하면 거기에서 실행되는 모든 스크립트가 종료되지만 캐논으로 파리를 죽이는 것과 같습니다.

가장 간단한 경우에는 !connection_aborted()을 매번 확인하고 싶을 수 있습니다. http://php.net/manual/en/features.connection-handling.php

0

스크립트가 어떻게 든 실패한다고 생각하나요? 그렇다면 거래를 사용해야합니다. 당신은 PHP 스크립트의 맨 처음에 트랜잭션을 시작하고 맨 마지막에 트랜잭션을 커밋합니다. 스크립트가 실패하면 트랜잭션이 커밋되지 않으므로 롤백됩니다. 이렇게하면 스크립트가 실패하면 데이터가 db에 추가되지 않습니다. 그것은이 라인을 따라 더 많거나 적은 작동

:

<?php 
pg_query("BEGIN;"); 

// all of your PHP and pg code 

// end of file  
pg_query("COMMIT;"); 
?> 

또한 ("ROLLBACK;") pg_query 수동으로 호출 할 수 있습니다; 거래를 취소하고 롤백하십시오.

게다가, 스크립트가 이런 식으로 :) 다만 실제로 (안 어쨌든 대부분의 서버에서) PHP 스크립트를 중지하지 않는 브라우저에서 "중지"를 눌러

+0

스크립트에 문제가 발생하지 않습니다. 이것은 어떤 이유로 든 스크립트가 실행을 멈추고 자 할 때 발생합니다. –

관련 문제