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 리퀘스트만 실행되므로 서버에 부하없이 잘 동작하더군요.
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 리퀘스트만 실행되므로 서버에 부하없이 잘 동작하더군요.
대량으로 발송할때는 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 을 안정적으로 구축하여 비지니스에 집중하는게 오히려 비용적 이익이 클수 있음)
게시글 목록
| 번호 | 제목 |
|---|---|
| 17657 | |
| 17655 | |
| 17654 | |
| 17653 |
JavaScript
ThreeJS - 3D Bar and Progress Bar
1
|
| 17652 |
node.js
RAM점유크기에 의한 노드서버관리
|
| 17651 |
JavaScript
Javascript Undo, Redo 기능 구현하기
|
| 17650 | |
| 17642 |
node.js
nodejs서버가 사용중인 메모리에 대한 로그
|
| 17633 |
node.js
node.js에서 스케쥴링작성
8
|
| 17632 | |
| 17631 |
MySQL
InnoDB와 MyISAM의 우단점
|
| 17630 | |
| 17628 |
JavaScript
자바스크립트 기반으로 HTML Canvas에 이미지를 불러들여 테두리색입히기
|
| 17624 | |
| 17623 | |
| 17620 |
node.js
tcp소켓과 websocket 의 비교
2
|
| 17618 |
JavaScript
JavaScript로 이미지의 부분 영역을 따내기
|
| 17617 | |
| 17614 | |
| 17612 | |
| 17611 | |
| 17610 | |
| 17609 | |
| 17608 |
node.js
Node.js로 지속적인 핑 결과를 파일로 저장
|
| 17607 |
정규표현식
특수문자 제거, 우리글짜가 있는지 체크
|
| 17604 |
node.js
Node.js에서 PDF 파일의 페이지 수를 얻기
|
| 17603 | |
| 17602 |
node.js
Node.js로 워터마킹 기능을 구현하는 방법
|
| 17600 | |
| 17594 |
댓글 작성
댓글을 작성하시려면 로그인이 필요합니다.
로그인하기