구독 관리
Function Guide
구독 관리 함수들
브라우저 푸시 구독자를 등록, 조회, 관리하는 핵심 함수들입니다.
회원/비회원 구독자를 모두 지원하며, 다양한 필터 조건으로 구독자를 선별할 수 있습니다.
save_push_subscription()
브라우저에서 받은 푸시 구독 정보를 데이터베이스에 저장합니다.
function save_push_subscription($subscription_data)
Parameters
$subscription_data
브라우저의
pushManager.subscribe()
에서 받은 구독 정보 배열입니다.
필수 구조:
- •
endpoint
(String) - 푸시 서비스 엔드포인트 URL - •
keys['p256dh']
(String) - P-256 ECDH 공개키 - •
keys['auth']
(String) - 인증 시크릿
Return Value
bool - 저장 성공 시 true, 실패 시 false
사용 예시
// JavaScript에서 받은 구독 정보
$subscription = array(
'endpoint' => 'https://fcm.googleapis.com/fcm/send/...',
'keys' => array(
'p256dh' => 'BGtFqB7V9OZF...',
'auth' => 'rF3dm4Ux...'
)
);
if (save_push_subscription($subscription)) {
echo '구독이 등록되었습니다.';
} else {
echo '구독 등록에 실패했습니다.';
}
$subscription = array(
'endpoint' => 'https://fcm.googleapis.com/fcm/send/...',
'keys' => array(
'p256dh' => 'BGtFqB7V9OZF...',
'auth' => 'rF3dm4Ux...'
)
);
if (save_push_subscription($subscription)) {
echo '구독이 등록되었습니다.';
} else {
echo '구독 등록에 실패했습니다.';
}
get_active_subscriptions()
다양한 필터 조건으로 활성 구독자 목록을 조회합니다. 푸시 발송 대상을 선별할 때 사용합니다.
function get_active_subscriptions($filters = array())
Parameters
$filters
구독자를 필터링할 조건들을 담은 배열입니다. 빈 배열 전달 시 모든 활성 구독자를 반환합니다.
사용 가능한 필터:
- •
member_ids
(Array) - 특정 회원 ID 목록 - •
level
(Int) - 회원 레벨 - •
gender
(String) - 성별 ('M' 또는 'F') - •
created_after
(String) - 가입일 이후 (Y-m-d H:i:s)
Return Value
// 구독자 정보 배열
array(
array(
'endpoint' => 'https://fcm.googleapis.com/...',
'keys' => array(
'p256dh' => 'BGtFqB7V9OZF...',
'auth' => 'rF3dm4Ux...'
),
'member_id' => 'user123'
)
// ... 추가 구독자들
)
array(
array(
'endpoint' => 'https://fcm.googleapis.com/...',
'keys' => array(
'p256dh' => 'BGtFqB7V9OZF...',
'auth' => 'rF3dm4Ux...'
),
'member_id' => 'user123'
)
// ... 추가 구독자들
)
사용 예시
// 1. 모든 활성 구독자
$all_subscribers = get_active_subscriptions();
// 2. 특정 회원들만
$filters = array('member_ids' => array('admin', 'user1', 'user2'));
$specific_members = get_active_subscriptions($filters);
// 3. 레벨 10 이상 회원들
$vip_subscribers = get_active_subscriptions(array('level' => 10));
// 4. 최근 7일 내 가입한 회원들
$filters = array(
'created_after' => date('Y-m-d H:i:s', strtotime('-7 days'))
);
$new_members = get_active_subscriptions($filters);
// 5. 남성 회원들만
$male_subscribers = get_active_subscriptions(array('gender' => 'M'));
$all_subscribers = get_active_subscriptions();
// 2. 특정 회원들만
$filters = array('member_ids' => array('admin', 'user1', 'user2'));
$specific_members = get_active_subscriptions($filters);
// 3. 레벨 10 이상 회원들
$vip_subscribers = get_active_subscriptions(array('level' => 10));
// 4. 최근 7일 내 가입한 회원들
$filters = array(
'created_after' => date('Y-m-d H:i:s', strtotime('-7 days'))
);
$new_members = get_active_subscriptions($filters);
// 5. 남성 회원들만
$male_subscribers = get_active_subscriptions(array('gender' => 'M'));
get_subscription_stats()
구독자 통계 정보를 한 번에 조회합니다. 관리자 페이지나 대시보드에서 사용합니다.
function get_subscription_stats()
Return Value
array(
'total' => 1500, // 전체 구독자 수
'active' => 1350, // 활성 구독자 수
'inactive' => 150, // 비활성 구독자 수
'today' => 25, // 오늘 가입한 구독자 수
'this_week' => 180 // 이번 주 가입한 구독자 수
)
'total' => 1500, // 전체 구독자 수
'active' => 1350, // 활성 구독자 수
'inactive' => 150, // 비활성 구독자 수
'today' => 25, // 오늘 가입한 구독자 수
'this_week' => 180 // 이번 주 가입한 구독자 수
)
사용 예시
$stats = get_subscription_stats();
echo '전체 구독자: ' . $stats['total'] . '명
';
echo '활성 구독자: ' . $stats['active'] . '명
';
echo '오늘 신규: ' . $stats['today'] . '명
';
// 활성화율 계산
$active_rate = ($stats['active'] / $stats['total']) * 100;
echo '활성화율: ' . round($active_rate, 1) . '%';
echo '전체 구독자: ' . $stats['total'] . '명
';
echo '활성 구독자: ' . $stats['active'] . '명
';
echo '오늘 신규: ' . $stats['today'] . '명
';
// 활성화율 계산
$active_rate = ($stats['active'] / $stats['total']) * 100;
echo '활성화율: ' . round($active_rate, 1) . '%';
unsubscribe_push()
특정 엔드포인트의 구독을 해제합니다. 완전 삭제가 아닌 비활성화 처리합니다.
function unsubscribe_push($endpoint)
Parameters
$endpoint
구독 해제할 푸시 서비스 엔드포인트 URL입니다. 브라우저에서 받은 구독 정보의 endpoint 값을 사용합니다.
Return Value
bool - 해제 성공 시 true, 실패 시 false
사용 예시
// JavaScript에서 받은 엔드포인트
$endpoint = 'https://fcm.googleapis.com/fcm/send/cJhJBNJGqA...';
if (unsubscribe_push($endpoint)) {
echo '구독이 해제되었습니다.';
} else {
echo '구독 해제에 실패했습니다.';
}
$endpoint = 'https://fcm.googleapis.com/fcm/send/cJhJBNJGqA...';
if (unsubscribe_push($endpoint)) {
echo '구독이 해제되었습니다.';
} else {
echo '구독 해제에 실패했습니다.';
}
편의 함수들
자주 사용하는 필터 조건들을 간편하게 사용할 수 있는 래퍼 함수들입니다.
get_subscriptions_by_level()
// 특정 레벨 회원들의 구독 정보 조회
$vip_subscribers = get_subscriptions_by_level(10);
$premium_subscribers = get_subscriptions_by_level(8);
$vip_subscribers = get_subscriptions_by_level(10);
$premium_subscribers = get_subscriptions_by_level(8);
get_subscriptions_by_gender()
// 성별로 구독자 조회
$male_subscribers = get_subscriptions_by_gender('M');
$female_subscribers = get_subscriptions_by_gender('F');
$male_subscribers = get_subscriptions_by_gender('M');
$female_subscribers = get_subscriptions_by_gender('F');
get_subscriptions_by_member_ids()
// 특정 회원 ID 목록으로 조회
$target_members = array('admin', 'moderator1', 'moderator2');
$staff_subscribers = get_subscriptions_by_member_ids($target_members);
$target_members = array('admin', 'moderator1', 'moderator2');
$staff_subscribers = get_subscriptions_by_member_ids($target_members);
get_all_active_subscriptions()
// 모든 활성 구독자 조회 (필터 없음)
$all_subscribers = get_all_active_subscriptions();
$all_subscribers = get_all_active_subscriptions();
실제 활용 예시
새 게시글 알림 시스템
// 게시글이 등록될 때 레벨별로 알림 발송
function notify_new_post($bo_table, $wr_subject) {
// VIP 회원들에게 우선 알림
$vip_subscribers = get_subscriptions_by_level(10);
if (!empty($vip_subscribers)) {
$options = array(
'click_action' => '/bbs/board.php?bo_table=' . $bo_table,
'icon' => '/img/vip-notification.png'
);
send_push_notification('[VIP] 새 글 알림', $wr_subject, $options);
}
// 30분 후 일반 회원들에게 알림
$general_filters = array('level' => 5); // 레벨 5 이상
$general_subscribers = get_active_subscriptions($general_filters);
// 실제로는 cron job이나 큐 시스템으로 지연 발송
}
function notify_new_post($bo_table, $wr_subject) {
// VIP 회원들에게 우선 알림
$vip_subscribers = get_subscriptions_by_level(10);
if (!empty($vip_subscribers)) {
$options = array(
'click_action' => '/bbs/board.php?bo_table=' . $bo_table,
'icon' => '/img/vip-notification.png'
);
send_push_notification('[VIP] 새 글 알림', $wr_subject, $options);
}
// 30분 후 일반 회원들에게 알림
$general_filters = array('level' => 5); // 레벨 5 이상
$general_subscribers = get_active_subscriptions($general_filters);
// 실제로는 cron job이나 큐 시스템으로 지연 발송
}
이벤트 참여자 대상 알림
// 특정 이벤트 참여자들에게만 알림
function notify_event_participants($event_participants) {
// 참여자 목록에서 구독자만 필터링
$subscribers = get_subscriptions_by_member_ids($event_participants);
if (!empty($subscribers)) {
$options = array(
'icon' => '/img/event.png',
'click_action' => '/event/result.php',
'require_interaction' => true
);
$result = send_push_notification(
'이벤트 결과 발표!',
'참여하신 이벤트의 결과를 확인해보세요.',
$options
);
echo count($event_participants) . '명 중 ' . count($subscribers) . '명에게 알림 발송';
} else {
echo '알림을 받을 구독자가 없습니다.';
}
}
function notify_event_participants($event_participants) {
// 참여자 목록에서 구독자만 필터링
$subscribers = get_subscriptions_by_member_ids($event_participants);
if (!empty($subscribers)) {
$options = array(
'icon' => '/img/event.png',
'click_action' => '/event/result.php',
'require_interaction' => true
);
$result = send_push_notification(
'이벤트 결과 발표!',
'참여하신 이벤트의 결과를 확인해보세요.',
$options
);
echo count($event_participants) . '명 중 ' . count($subscribers) . '명에게 알림 발송';
} else {
echo '알림을 받을 구독자가 없습니다.';
}
}
주의사항
중복 처리: save_push_subscription()은 동일 endpoint 시 업데이트 처리
소프트 삭제: unsubscribe_push()는 완전 삭제가 아닌 is_active=0 처리
성능 고려: 대량 구독자 조회 시 메모리 사용량과 처리 시간 주의
필터 조합: 여러 필터 동시 사용 시 AND 조건으로 처리됨
소프트 삭제: unsubscribe_push()는 완전 삭제가 아닌 is_active=0 처리
성능 고려: 대량 구독자 조회 시 메모리 사용량과 처리 시간 주의
필터 조합: 여러 필터 동시 사용 시 AND 조건으로 처리됨