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 을 안정적으로 구축하여 비지니스에 집중하는게 오히려 비용적 이익이 클수 있음)
게시글 목록
| 번호 | 제목 |
|---|---|
| 17591 |
node.js
노드로 멀티스레드 기능 구현하기
2
|
| 17590 | |
| 17589 |
PHP
PHP로 인쇄명령주기
1
|
| 17588 |
JavaScript
Javascript로 JSON데이터를 보기좋게 만들기
|
| 17587 | |
| 17584 | |
| 17583 |
MySQL
MySQL과 PostgreSQL의 우단점
|
| 17582 |
MySQL
프로시저 cursor 사용 예
|
| 17581 |
JavaScript
바닐라 ajax 파일업로드 예제
|
| 17579 | |
| 17577 | |
| 17575 | |
| 17574 | |
| 17573 | |
| 17572 | |
| 17569 | |
| 17564 | |
| 17560 | |
| 17559 |
MySQL
프로시저 기본편
|
| 17555 | |
| 17554 | |
| 17553 | |
| 17552 | |
| 17549 | |
| 17548 | |
| 17547 | |
| 17542 | |
| 17533 | |
| 17531 | |
| 17524 |
댓글 작성
댓글을 작성하시려면 로그인이 필요합니다.
로그인하기