PHP 스크립트에서 INGORE_USER_ABORT (TRUE) 는 클라이언트가 중단 되더라도 스크립트를 계속 실행할 수있는 매우 실용적인 기능입니다 (예 : 사용자가 브라우저를 닫거나 네트워크가 분리되어 있음). 이 기능은 장기 실행 작업 (예 : 보고서 생성, 배치 업데이트, 푸시 알림 등)을 처리 할 때 특히 중요합니다. 그러나 데이터베이스 트랜잭션과 함께 사용되는 경우 작업 실행의 무결성과 일관성을 보장하는 방법은 무시할 수없는 과제입니다.
INGORE_USER_ABORT (TRUE) 의 목적은 PHP 엔진에 "클라이언트가 연결이 끊어 졌는지 무시하고 스크립트를 계속 실행하도록 지시하는 것입니다. 기본적으로 PHP는 함수가 명시 적으로 호출되고 True가 전달되지 않는 한 클라이언트 단절을 감지 할 때 스크립트 실행을 종료합니다.
<span><span><span class="hljs-title function_ invoke__">ignore_user_abort</span></span><span>(</span><span><span class="hljs-literal">true</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">set_time_limit</span></span><span>(</span><span><span class="hljs-number">0</span></span><span>); </span><span><span class="hljs-comment">// 스크립트를 무제한으로 실행할 수 있습니다</span></span><span>
</span></span>
set_time_limit (0) 는 일반적으로 시간 초과로 인해 스크립트가 파손되는 것을 방지하기 위해 사용됩니다.
데이터베이스 트랜잭션은 일련의 SQL 작업이 성공적이거나 모든 실패를 보장 할 수 있습니다. 이는 소위 원자력입니다. 트랜잭션의 또 다른 주요 특징은 "내구성"입니다. 즉, 일단 커밋되면 데이터는 영구적으로 저장됩니다.
<span><span><span class="hljs-variable">$db</span></span><span>-></span><span><span class="hljs-title function_ invoke__">beginTransaction</span></span><span>();
</span><span><span class="hljs-comment">// 일련의 데이터베이스 작업</span></span><span>
</span><span><span class="hljs-variable">$db</span></span><span>-></span><span><span class="hljs-title function_ invoke__">commit</span></span><span>(); </span><span><span class="hljs-comment">// 또는 $db->rollBack();</span></span><span>
</span></span>
중단 될 수있는 긴 작업에서 데이터베이스 트랜잭션을 사용하면 실수로 처리하면 다음 문제가 발생합니다.
커밋하지 않고 연결이 연결이 끊어집니다 트랜잭션이 열린 후 스크립트가 갑자기 중단되면 (사용자가 INGOR_USER_ABORT를 설정하지 않기 때문에 사용자가 연결을 끊기 때문에 스크립트가 분리되면 종료되는 경우) 트랜잭션의 작업은 데이터베이스에 의해 자동으로 롤백되어 예상 작업이 실행되지 않습니다.
논리적 중단은 비즈니스 데이터의 불일치를 유발합니다 <br> 스크립트 로직은 트랜잭션에 의존하여 후속 작업을 완료합니다. 거래가 커밋되기 전에 예기치 않게 중단되는 경우 전체 비즈니스 상태는 "반 완성 된 상태"상태 일 수 있습니다.
다음은 INGORE_USER_ABORT를 사용할 때 데이터베이스와의 트랜잭션을 사용할 때 작업 실행의 무결성을 보장하기위한 몇 가지 실질적인 전략입니다.
<span><span><span class="hljs-title function_ invoke__">ignore_user_abort</span></span><span>(</span><span><span class="hljs-literal">true</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">set_time_limit</span></span><span>(</span><span><span class="hljs-number">0</span></span><span>);
</span></span>
이 두 줄의 코드는 작업 로직이 시작되기 전에 실행되어야하므로 클라이언트 단절 또는 시간 초과로 인해 스크립트가 중단되지 않도록해야합니다.
시도/캐치 구조로 트랜잭션을 래핑하여 예외에서 롤백을 보장하고 데이터가 오염되지 않도록하십시오.
<span><span><span class="hljs-keyword">try</span></span><span> {
</span><span><span class="hljs-variable">$db</span></span><span>-></span><span><span class="hljs-title function_ invoke__">beginTransaction</span></span><span>();
</span><span><span class="hljs-comment">// 데이터베이스 관련 작업을 수행하십시오</span></span><span>
</span><span><span class="hljs-title function_ invoke__">doSomething</span></span><span>();
</span><span><span class="hljs-variable">$db</span></span><span>-></span><span><span class="hljs-title function_ invoke__">commit</span></span><span>();
} </span><span><span class="hljs-keyword">catch</span></span><span> (</span><span><span class="hljs-built_in">Exception</span></span><span> </span><span><span class="hljs-variable">$e</span></span><span>) {
</span><span><span class="hljs-variable">$db</span></span><span>-></span><span><span class="hljs-title function_ invoke__">rollBack</span></span><span>();
</span><span><span class="hljs-title function_ invoke__">error_log</span></span><span>(</span><span><span class="hljs-string">"거래에 실패했습니다:"</span></span><span> . </span><span><span class="hljs-variable">$e</span></span><span>-></span><span><span class="hljs-title function_ invoke__">getMessage</span></span><span>());
}
</span></span>
주요 노드에 로그를 작성하면 개발자가 작업 실행이 완료되었는지 여부를 추적하는 데 도움이 될 수 있습니다. 특히 거래 제출 전후의 핵심 지점에서 로그를 작성하면 예기치 않은 중단이 비즈니스에 미치는 영향을 분석하는 데 도움이 될 수 있습니다.
<span><span><span class="hljs-title function_ invoke__">file_put_contents</span></span><span>(</span><span><span class="hljs-string">'/tmp/task.log'</span></span><span>, </span><span><span class="hljs-string">"미션이 시작됩니다\n"</span></span><span>, FILE_APPEND);
</span><span><span class="hljs-comment">// ...</span></span><span>
</span><span><span class="hljs-title function_ invoke__">file_put_contents</span></span><span>(</span><span><span class="hljs-string">'/tmp/task.log'</span></span><span>, </span><span><span class="hljs-string">"거래 제출이 완료됩니다\n"</span></span><span>, FILE_APPEND);
</span></span>
작업 필드 (예 : 처리 , 완료 , 실패 등)를 긴 작업에 소개하여 반복적 인 또는 부분 실행을 피하기 위해 긴 작업에 소개합니다.
<span><span><span class="hljs-comment">// 标记미션이 시작됩니다处理</span></span><span>
</span><span><span class="hljs-variable">$db</span></span><span>-></span><span><span class="hljs-title function_ invoke__">exec</span></span><span>(</span><span><span class="hljs-string">"UPDATE tasks SET status = 'processing' WHERE id = <span class="hljs-subst">$taskId</span></span></span><span>");
</span><span><span class="hljs-comment">// 비즈니스 로직을 실행하십시오...</span></span><span>
</span><span><span class="hljs-comment">// 작업 완료를 표시하십시오</span></span><span>
</span><span><span class="hljs-variable">$db</span></span><span>-></span><span><span class="hljs-title function_ invoke__">exec</span></span><span>(</span><span><span class="hljs-string">"UPDATE tasks SET status = 'done' WHERE id = <span class="hljs-subst">$taskId</span></span></span><span>");
</span></span>
거래와 결합하여 상태 변경이 비즈니스 로직과 일치하도록합니다.
예기치 않은 인터럽트로 인한 "미완성"작업의 경우 시간이 정한 스크립트를 통해 업데이트 되지 않은 데이터베이스의 레코드를 확인하고 자동으로 재 시도 또는 경보를 확인할 수 있습니다.
INGORE_USER_ABORT는 작업을 중단 할 수있는 기능을 제공하지만 데이터베이스 작업의 무결성을 보장 할 수는 없습니다. 트랜잭션 메커니즘을 결합 할 때는 예외 캡처, 상태 관리 및 로그 추적과 같은 다양한 수단을 통해 비즈니스 일관성 및 복구를 보장해야합니다. 불안정한 네트워크 나 예기치 않은 중단에 직면하여 합리적이고 결함이없는 시스템 만 안정적인 비즈니스 운영을 유지할 수 있습니다.