PHP에서 대량의 푸시 메시지를 보내기 위한 팁
PHP에서 대량의 푸시 메시지를 보내는 경우, 웹 화면이 멈추지 않도록 비동기 처리를 해야 합니다. 일반적으로 큰 규모의 작업을 처리할 때는 다음과 같은 방법을 사용합니다.
1. 큐 시스템 사용: 메시지를 전송하고자 하는 대상들을 큐에 넣어두고, 백그라운드에서 큐를 처리하는 작업을 별도로 실행합니다. PHP에서는 Redis나 RabbitMQ와 같은 큐 시스템을 사용하여 이를 구현할 수 있습니다.
2. 배치 작업 사용: 대량의 푸시 메시지를 한 번에 보내기보다 일정 갯수씩 나누어서 보내는 것이 좋습니다. 예를 들어, 100명의 대상에게 푸시 메시지를 보내야 할 경우, 10명씩 분할하여 10번의 작업으로 나누어 보내는 것입니다. 이를 위해 PHP의 스크립트를 여러 번 실행하는 배치 작업을 사용할 수 있습니다.
3. 백그라운드 프로세스 사용: 웹 화면과 별개로 동작하는 백그라운드 프로세스를 실행하여 푸시 메시지를 보내는 작업을 처리할 수 있습니다. 이를 위해 PHP CLI(Command Line Interface)를 사용하거나, 서드파티 도구인 Supervisor나 PM2와 같은 프로세스 관리 도구를 사용할 수 있습니다.
또한, 푸시 메시지를 보낼 때는 API 호출 등의 외부 작업이 필요하기 때문에, 처리 시간이 오래 걸릴 수 있습니다. 따라서, PHP 실행 시간 제한을 늘리거나, 배치 작업으로 나누어 처리하는 것도 고려해야 합니다.
댓글 5개
2년 전
저는
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 리퀘스트만 실행되므로 서버에 부하없이 잘 동작하더군요.
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 을 안정적으로 구축하여 비지니스에 집중하는게 오히려 비용적 이익이 클수 있음)
MQ 나 Redis 는 서버 호스팅이나 외부 서비스 연계를 해야 하는데, 배보다 배꼽이 큰 방법입니다.
배치도 crontab 이 없는 환경에선 사용하기 위해선 sass 형태의 cron service 를 사용해야 합니다.
composer 도 쓰기 힘들다면, curl_multi가 현실적 대안입니다.
composer 사용가능하다면, guzzle async 가 효과적입니다.
요즘은 push notification 은 fcm 을 쌩으로 쓰는것보단 onesignal 형태의 외부 서비스를 쓰는것도 괜찮습니다.
발송상태 모니터링도 되고, ios / android 도 단일 api 에서 대응할수 있습니다.
비용이 발송하는게 문제인데, 애초에 대량 발송 업체는 이미 수익이 있는 상태라서 크게 문제되는 비용이 아닐것입니다.(fcm 을 안정적으로 구축하여 비지니스에 집중하는게 오히려 비용적 이익이 클수 있음)
swallow
2년 전
@더업스토리 경험이 많으신 분 같은데 curl_multi 를 이용한 1만개정도의 다중전송을 위한 샘플코드를 보여주시면 감사하겠습니다.
sukja
2년 전
필요했던건되요 참조 하겠습니다.
게시판 목록
개발자팁
개발과 관련된 유용한 정보를 공유하세요.
질문은 QA에서 해주시기 바랍니다.
질문은 QA에서 해주시기 바랍니다.
| 번호 | 분류 | 제목 | 글쓴이 | 날짜 | 조회 |
|---|---|---|---|---|---|
| 5396 | 기타 |
슈퍼스타맨
|
4개월 전 | 358 | |
| 5395 | PHP |
untitled
|
6개월 전 | 828 | |
| 5394 | MySQL |
선택과집중
|
6개월 전 | 605 | |
| 5393 | 웹서버 |
techstar
|
8개월 전 | 868 | |
| 5392 |
|
1년 전 | 1225 | ||
| 5391 | 10개월 전 | 1125 | |||
| 5390 | 10개월 전 | 912 | |||
| 5389 | 9개월 전 | 881 | |||
| 5388 | 9개월 전 | 983 | |||
| 5387 | 8개월 전 | 815 | |||
| 5386 | JavaScript |
nekoieye
|
9개월 전 | 979 | |
| 5385 | 웹서버 | 9개월 전 | 994 | ||
| 5384 | JavaScript |
|
9개월 전 | 824 | |
| 5383 | 기타 | 10개월 전 | 1135 | ||
| 5382 | 기타 |
|
10개월 전 | 584 | |
| 5381 | JavaScript | 10개월 전 | 915 | ||
| 5380 | 기타 |
|
11개월 전 | 702 | |
| 5379 | JavaScript | 11개월 전 | 700 | ||
| 5378 | 11개월 전 | 1203 | |||
| 5377 | 기타 |
|
11개월 전 | 768 | |
| 5376 | jQuery |
|
11개월 전 | 584 | |
| 5375 | jQuery |
techstar
|
11개월 전 | 738 | |
| 5374 | 기타 |
|
11개월 전 | 788 | |
| 5373 | MySQL |
|
1년 전 | 819 | |
| 5372 | 기타 |
|
1년 전 | 1021 | |
| 5371 | JavaScript |
|
1년 전 | 734 | |
| 5370 | JavaScript |
|
1년 전 | 738 | |
| 5369 | PHP |
|
1년 전 | 1249 | |
| 5368 | PHP | 1년 전 | 1417 | ||
| 5367 | 기타 |
nekoieye
|
1년 전 | 1292 |
댓글 작성
댓글을 작성하시려면 로그인이 필요합니다.
로그인하기