현재 저는 PHP 스크립트를 사용하여 외부 인터페이스에 대한 요청을 실행하여 이메일을 보낸 다음 이메일이 돌아올 때까지 기다리고 처리 결과를 얻은 다음 그 결과를 내 데이터베이스 기록으로 보내고 있습니다. .
한 시간에 20,000개 정도의 항목을 처리할 수 있는데 너무 느립니다. .
사장님께서 쓰레드풀을 이용해서 하라고 하셨는데 지금 또 헷갈리네요. . 구체적인 방법은 모르겠지만 일반적인 과정을 설명해 주실 수 있나요? 스레드 확장을 사용하고 있습니까?
현재 저는 PHP 스크립트를 사용하여 외부 인터페이스에 대한 요청을 실행하여 이메일을 보낸 다음 이메일이 돌아올 때까지 기다리고 처리 결과를 얻은 다음 그 결과를 내 데이터베이스 기록으로 보내고 있습니다. .
한 시간에 20,000개 정도의 항목을 처리할 수 있는데 너무 느립니다. .
사장님께서 쓰레드풀을 이용해서 하라고 하셨는데 지금 또 헷갈리네요. . 구체적인 방법은 잘 모르겠습니다. 일반적인 과정을 설명해 주실 수 있나요? 스레드 확장을 사용하고 있습니까?
저도 비슷한 일을 한 적이 있는데 조언을 해줄 수 있었습니다.
2w/h ≒ 5.55 QPS입니다. 이는 실제로 높지 않습니다.
상사의 생각에 따라 단일 스레드 스크립트의 실행 속도가 느리다면 몇 가지를 더 사용하세요. 그런 다음 필요한 것은 pthread 확장(멀티스레딩)이거나 처리를 위해 여러 프로세스를 직접 여는 것입니다(pcntl 확장 또는 직접 exec를 사용할 수도 있음).
그러나 귀하의 요구 사항에 따라 처리 시간을 가장 많이 차지하는 것은 외부 IO 대기입니다. 동시에 여러 이메일을 보내거나(예: multi_curl) 이메일을 비동기적으로 보내거나(예: 컬의 비동기), 비동기 서비스를 전체적으로 사용하는 것을 고려할 수 있습니다(예: swoole 확장)
데이터 테이블에 process_id 필드 추가
데이터베이스 레코드를 삽입할 때 process_id에 mt_rand(1,10) 값을 무작위로 할당합니다.
10개의 PHP 스크립트를 엽니다.
첫 번째 스크립트는 process_id 1로 레코드를 처리합니다. : select * from send_email_list where process_id=1 and status=0
두 번째 스크립트는 process_id가 2인 레코드를 처리합니다. select * from send_email_list where process_id=2 and status=0
이런 방식으로 10개의 프로세스가 동시에 이것은 가장 간단하고 직접적인 방법으로 처리 속도를 10배까지 직접적으로 높일 수 있습니다.
멀티스레딩, multi_curl 동시성 및 스울 비동기식은 모두 실현 가능한 솔루션입니다. 그러나 위의 솔루션은 기존 기반에 대한 간단한 수정만 필요하며 주제에 더 적합할 수 있습니다.
nodejs를 사용하여 백그라운드 이메일 서비스 수행