문제
제출시 기본 코드를 실행하여 제출 된 정보를 처리하고 알림 웹 사이트에 표시하기 위해 데이터베이스에 삽입하는 양식이 있습니다. 또한 이메일 및 SMS 메시지를 통해 이러한 알림을 받도록 등록한 사람들의 목록이 있습니다. 이 목록은 현재로서는 사소한 일이지만 (약 150 명만 입력) 전체 구독자 테이블을 순환하고 150 개 이상의 이메일을 발송하는 데 1 분 이상 걸리기 만하면됩니다. (이메일은 대량 이메일 정책으로 인해 이메일 서버의 시스템 관리자가 요청한대로 개별적으로 전송됩니다.)
이 시간 동안 알림을 게시 한 개인은 알림이 게시되고 있다는 긍정적 인 보강없이 거의 1 분 동안 양식의 마지막 페이지에 앉아있을 것입니다. 이것은 내가 이상적이지 않다고 생각하는 가능한 해결책을 가진 다른 잠재적 인 문제로 이어집니다.
첫째, 포스터는 서버가 지연되고 있다고 생각하고 '제출'버튼을 다시 클릭하면 스크립트가 다시 시작되거나 두 번 실행됩니다. JavaScript를 사용하여 버튼을 비활성화하고 텍스트를 'Processing ...'과 같은 텍스트로 바꾸면이 문제를 해결할 수 있지만 사용자가 스크립트 실행 시간 동안 페이지에 계속 머물러 있기 때문에 이상적이지 않습니다. (또한 JavaScript가 비활성화 된 경우에도이 문제가 여전히 존재합니다.)
둘째, 포스터는 양식을 제출 한 후 탭이나 브라우저를 너무 일찍 닫을 수 있습니다. 스크립트는 브라우저에 다시 쓰기를 시도 할 때까지 서버에서 계속 실행되지만 사용자가 도메인 내의 페이지를 탐색하면 (스크립트가 아직 실행중인 동안) 브라우저는 스크립트가 종료 될 때까지 페이지로드를 중단합니다. . (이것은 브라우저의 탭이나 창이 전체 브라우저 응용 프로그램이 아닌 닫혀있을 때만 발생합니다.) 그래도 이상적이지 않습니다.
(가능) 해결 방법
스크립트의 "이메일"부분을 알림이 게시 된 후 호출 할 수있는 별도의 파일로 나누고 싶습니다. 처음에는 알림이 성공적으로 게시 된 후 확인 페이지에 게시 할 생각이었습니다. 그러나 사용자는이 스크립트가 실행되고 있다는 것을 알지 못하며 어떤 이상 현상도 눈에 띄지 않습니다. 이 스크립트는 실패 할 수 없습니다.
하지만이 스크립트를 백그라운드 프로세스로 실행할 수 있다면 어떨까요? 제 질문은 이것이다 : PHP 스크립트를 어떻게 실행하여 백그라운드 서비스로 트리거하고 사용자가 양식 수준에서 수행 한 작업과 완전히 독립적으로 실행할 수 있습니까?
편집 : 이것은 cron'ed 수 없습니다 . 양식이 제출되는 즉시 실행되어야합니다. 우선 순위가 높은 알림입니다. 또한 서버를 실행하는 시스템 관리자는 크론이 5 분 이상 자주 실행되는 것을 허용하지 않습니다.
exec()
하지만 이것을 시도한 적이 없습니다.
ajax
하고 삽입 하기 만하면됩니다 sleep()
(제 경우에는 foreach 사용). 내 서버에서 완벽하게 작동합니다. 다른 사람들에 대해서는 확실하지 않습니다. 또한 루프 앞에 ignore_user_abort()
및 set_time_limit()
(계산 된 종료 시간 포함)을 추가 하여 스크립트가 내 테스트에 따라 ignore_user_abort()
및 없이 작업을 완료하는 스크립트를 사용하는 서버에 의해 중지되지 않도록합니다 set_time_limit()
.
gearman
백그라운드 작업을 처리하기 위해 PHP와 함께 사용 합니다. 처리 시간이 많고로드가 많은 경우 확장하는 것이 완벽합니다. 당신은 그것을 조사해야합니다.