2011-08-26 3 views

답변

0

웹 서버를 통해 시작된 PHP 스크립트를 백그라운드 프로세스로 처리 할 수 ​​없습니다.

데이터베이스를 최적화 할 수 있는지 (아마 indizes가 충분하지 않은지) 확인하고, 그렇지 않은 경우 CLI에서 규칙적으로 (5 분마다 한 번) 시작되는 두 번째 프로세스를 작성하십시오 사용자에게 "등록 해 주셔서 감사합니다"페이지를 표시하는 cronjob이 표시됩니다 ...

+0

-1 : "PHP 스크립트를 만들 수 없습니다 ... 백그라운드 프로세스를 처리하십시오". 무의미한 말. 물론 웹 요청과 같은 스레드에서 장기 실행 프로세스를 동 기적으로 처리하면 안됩니다.하지만 이것은 진술에서 매우 먼 길입니다. http://symcbean.blogspot.com/2010/02/php-and-long-running-processes.html – symcbean

+0

이 부분을 명확하게하겠습니다. 먼저 내가 잘못 인용 한 다음 잘못된 인용 한 말을 잘못 해석 한 것입니다 (아마도 운영 체제 생태계에서 "백그라운드 프로세스"가 무엇인지 모르고 있기 때문에), 그런 다음 저를 downvote합니까? 웹 서버를 통해 PHP 스크립트를 시작하면 이는 자식 프로세스가되며 자체적으로 백그라운드 프로세스로 만들 수 없습니다. 오, 그렇게 강력하고 (사실 위험한) 블로그 게시물에 내가 무엇을 기록했는지는 관련이 없습니다. 어떤 사람들은... – ty812

1

어쩌면 한 번 사용자가 데이터베이스에 대기 중으로 등록 할 수 있습니다.

그런 다음 백그라운드에서 실행중인 Python 또는 PHP 루틴에서 작업을 연기 할 수 있습니다. 누가 보류중인 요청을 찾았는지 확인하고, 전자 메일을 보내고 최종적으로 데이터베이스를 업데이트합니다.

이 시간 동안 사용자는 등록되었지만 보류 중 상태이지만 적어도 방문자의 관점에서는 모든 것이 처리되기를 기다리지 않습니다.

2

데이터베이스 활동이 너무 오래 걸리면 디자인을 재고해야합니다. 그러나 지연이 이메일 때문인 경우 이메일을 DB 또는 파일에 저장하십시오. 대기중인 전자 메일을 5/10/15 분마다 보내고 삭제하는 cron 작업을 만듭니다.

0

다른 곳에서 내 의견에 따르면 성능상의 문제가 불가피한 경우 PHP에서 장기 실행 프로세스를 생성하는 것이 실용적인 솔루션입니다 (bearing in mind a few caveats).

그러나 "send 3 mails"는 상당한 시간이 걸리지 않아야합니다 (데이터베이스 검사가 무엇인지 모릅니다). 기존 프로세스를 최적화하는 데 시간을 할애해야합니다.

문제를 해결하는 다른 방법은 네트워크 호출이나 비동기 메시징 시스템 또는 메시지 대기열을 사용하는 단일 스레드 작업 프로세서를 통해 다중 프로세스/멀티 스레드 데 이터로 무거운 짐을 내리는 일반적인 배치 처리입니다 .

관련 문제