테스트 사이트 - 개발 중인 베타 버전입니다

PHP에서 대량의 푸시 메시지를 보내기 위한 팁

· 2년 전 · 2512 · 5

PHP에서 대량의 푸시 메시지를 보내는 경우, 웹 화면이 멈추지 않도록 비동기 처리를 해야 합니다. 일반적으로 큰 규모의 작업을 처리할 때는 다음과 같은 방법을 사용합니다.

1. 큐 시스템 사용: 메시지를 전송하고자 하는 대상들을 큐에 넣어두고, 백그라운드에서 큐를 처리하는 작업을 별도로 실행합니다. PHP에서는 Redis나 RabbitMQ와 같은 큐 시스템을 사용하여 이를 구현할 수 있습니다.

2. 배치 작업 사용: 대량의 푸시 메시지를 한 번에 보내기보다 일정 갯수씩 나누어서 보내는 것이 좋습니다. 예를 들어, 100명의 대상에게 푸시 메시지를 보내야 할 경우, 10명씩 분할하여 10번의 작업으로 나누어 보내는 것입니다. 이를 위해 PHP의 스크립트를 여러 번 실행하는 배치 작업을 사용할 수 있습니다.

3. 백그라운드 프로세스 사용: 웹 화면과 별개로 동작하는 백그라운드 프로세스를 실행하여 푸시 메시지를 보내는 작업을 처리할 수 있습니다. 이를 위해 PHP CLI(Command Line Interface)를 사용하거나, 서드파티 도구인 Supervisor나 PM2와 같은 프로세스 관리 도구를 사용할 수 있습니다.

또한, 푸시 메시지를 보낼 때는 API 호출 등의 외부 작업이 필요하기 때문에, 처리 시간이 오래 걸릴 수 있습니다. 따라서, PHP 실행 시간 제한을 늘리거나, 배치 작업으로 나누어 처리하는 것도 고려해야 합니다.

댓글 작성

댓글을 작성하시려면 로그인이 필요합니다.

로그인하기

댓글 5개

저는
1) 별도의 큐 테이블에 삽입하고,
3) 별도 구축된 CLI 서버에서 해당 테이블을 바탕으로 푸쉬데이터(메세지 및 대상)를 fetch 한 후에,
2) 1000개씩 배치를 통해 보내고 있습니다. (registration_ids 에 키 배열을 전달)
https://firebase.google.com/docs/cloud-messaging/http-server-ref?hl=ko

다만 1000건 이상을 동시에 보내야 해서, push fetcher 에서 1000건씩 임시배열에 담은 다음, push sender 를 여러개 fork 해서 보내고 있습니다. (예를 들어서 3만건을 보내야하면, 1000개씩 30개로 쪼개서 sender를 동시에 30개 실행)
어차피 프로세스당 1HTTP 리퀘스트만 실행되므로 서버에 부하없이 잘 동작하더군요.
2년 전
아, 1000건 이상은 한꺼번에 어려운가 보군요.
2년 전
대량으로 발송할때는 curl_multi(php에서도 사용가능) 를 사용하거나 guzzle async 를 사용하면 됩니다.

MQ 나 Redis 는 서버 호스팅이나 외부 서비스 연계를 해야 하는데, 배보다 배꼽이 큰 방법입니다.

배치도 crontab 이 없는 환경에선 사용하기 위해선 sass 형태의 cron service 를 사용해야 합니다.

composer 도 쓰기 힘들다면, curl_multi가 현실적 대안입니다.
composer 사용가능하다면, guzzle async 가 효과적입니다.

요즘은 push notification 은 fcm 을 쌩으로 쓰는것보단 onesignal 형태의 외부 서비스를 쓰는것도 괜찮습니다.
발송상태 모니터링도 되고, ios / android 도 단일 api 에서 대응할수 있습니다.

비용이 발송하는게 문제인데, 애초에 대량 발송 업체는 이미 수익이 있는 상태라서 크게 문제되는 비용이 아닐것입니다.(fcm 을 안정적으로 구축하여 비지니스에 집중하는게 오히려 비용적 이익이 클수 있음)
@더업스토리 경험이 많으신 분 같은데 curl_multi 를 이용한 1만개정도의 다중전송을 위한 샘플코드를 보여주시면 감사하겠습니다.
필요했던건되요 참조 하겠습니다.

게시글 목록

번호 제목
17657
17655
17654
17653
17652
17651
17650
17642
17633
17632
17631
17630
17628
17624
17623
17620
17618
17617
17614
17612
17611
17610
17609
17608
17607
17604
17603
17602
17600
17594