사이트 접속자 현황 모듈 ( php 7.4~8.4 까지 )
여기 오셔서 받으세요~

php 8 호환 버전으로 업데이트 했네요

BSplus 모듈/위젯 수정사항 정리
작업일: 2026-05-22
작업자: 불패의초인
목표: 기능 복구, 신규 기능 추가, PHP 8 호환성 확보
---
1. counter 모듈 (modules/counter/)
수정 파일
파일 작업
`counter.class.php` 수정
`counter.controller.php` 수정
`schemas/counter\_log.xml` 수정
`queries/insertCounterLog.xml` 수정
`queries/getRealtimeVisitors.xml` 신규
`queries/getRefererStatus.xml` 신규
`queries/getWeeklyStatus.xml` 신규
변경 내역
[신규] 유입경로(Referer) 기록 기능
`counter\_log` 테이블에 `referer` 컬럼(varchar 500) 추가
`counter.class.php`의 `checkUpdate()`/`moduleUpdate()`에서 자동 컬럼 추가 (관리자에서 모듈 업데이트 시 적용)
`counter.controller.php`의 `insertLog()`에서 `$\_SERVER\['HTTP\_REFERER']` 저장
`insertCounterLog.xml` 쿼리에 `referer` 컬럼 추가
[신규] 실시간 접속자 조회 쿼리
`getRealtimeVisitors.xml` — 최근 15분 이내 고유 IP 수 집계
[신규] 유입경로 집계 쿼리
`getRefererStatus.xml` — 오늘 날짜 기준 referer별 GROUP BY 집계
[신규] 7일 방문자 추이 쿼리
`getWeeklyStatus.xml` — 지정 기간 내 일별 방문자/페이지뷰 조회
[PHP 8 호환]
`\&getModel()` → `getModel()` (레퍼런스 호출 제거)
`\&TemplateHandler::getInstance()` → `TemplateHandler::getInstance()`
---
2. counter_status 위젯 (widgets/counter_status/)
수정 파일
파일 작업
`counter\_status.class.php` 수정 (v0.2 → v0.3)
`skins/xecenter\_status/counter\_status.html` 수정
`skins/xecenter\_status/default.css` 수정
`skins/bs\_dashboard/\*` 신규 스킨
`skins/bs\_modern/\*` 신규 스킨
`skins/bs\_minimal/\*` 신규 스킨
`skins/bs\_compact2/\*` 신규 스킨
`skins/bs\_compact3/\*` 신규 스킨
변경 내역
[버그 수정] 회원/문서/댓글 수 표시 안 되는 문제
원인: Rhymix 버전 위젯 클래스에서 `admin.getMemberStatus`, `admin.getDocumentStatus`, `admin.getCommentStatus` 쿼리 호출 코드가 누락됨
해결: 구버전(XE용) 수정본의 집계 로직을 Rhymix/PHP 7.4 호환으로 복원
`$status` 객체 및 하위 속성을 `new stdClass()`로 명시적 초기화 (PHP 8 warning 방지)
[신규] 실시간 접속자 수 표시
`counter.getRealtimeVisitors` 쿼리로 최근 15분 이내 고유 IP 수 집계
스킨에 깜빡이는 뱃지 UI로 표시
[신규] 유입경로 집계 표시 (관리자만)
`counter.getRefererStatus` 쿼리로 오늘 유입경로별 집계
직접 / 네이버 / 구글 / 다음 / 기타로 분류 (내부 이동 bsplus.net 제외)
색상별 태그 UI로 표시
[신규] 7일 방문자 추이 미니 차트 (관리자만)
`counter.getWeeklyStatus` 쿼리로 최근 7일 데이터 조회
CSS 막대그래프로 표시, hover 시 날짜/방문자 수 툴팁
[신규] 스킨 5종 추가
`bs\_dashboard` — 카드형 대시보드 레이아웃 (방문자/페이지뷰/정보 카드 분리, 유입경로 가로 막대 차트, 7일 추이 차트)
`bs\_modern` — 둥근 캡슐 안에 한 줄 컴팩트 + 아래 유입/스파크라인
`bs\_minimal` — 테이블형 깔끔 정리 (오늘/어제/전체 컬럼)
`bs\_compact2` — 2줄 심플 (1줄: 방문자+페이지뷰+정보+실시간, 2줄: 유입+차트)
`bs\_compact3` — 3줄 심플 (1줄: 방문자+페이지뷰+실시간, 2줄: 정보+차트, 3줄: 유입)
[PHP 8 호환]
`\&getModel()` → `getModel()`
`\&TemplateHandler::getInstance()` → `TemplateHandler::getInstance()`
`$status` 및 모든 하위 객체 `new stdClass()` 초기화
---
3. content 위젯 갤러리 스킨 (widgets/content/skins/bs_gallery_style/)
신규 파일
파일 설명
`gallery.html` 갤러리 모드 템플릿 (캐러셀)
`css/bs\_gallery.css` 갤러리 CSS
`skin.xml` 스킨 정보
기타 기존 파일 sketchbook5_style 기반 복사
기능
슬라이드 캐러셀 — ❮ ❯ 버튼으로 페이지 넘기기 (CSS transition 애니메이션)
페이지 인디케이터 — 하단 도트 네비게이션, 클릭으로 직접 이동
Hover 효과 — 이미지 확대 + 어두워짐 + 🔍 돋보기 오버레이
터치 스와이프 — 모바일 좌우 스와이프 지원 (touchstart/touchmove/touchend)
둥근 모서리 — 썸네일 border-radius 8px
반응형 — 768px 이하에서 버튼 크기 축소
---
4. accessuser 접속자 현황 모듈 (modules/accessuser/)
수정 파일 (전체 7개 PHP + 1개 쿼리)
파일 작업
`accessuser.class.php` 수정
`accessuser.model.php` 전면 재작성
`accessuser.controller.php` 수정
`accessuser.view.php` 수정
`accessuser.admin.view.php` 수정
`accessuser.admin.controller.php` 수정
`accessuser.mobile.php` 수정
`queries/getAccessUsers.xml` 수정
`conf/info.xml` 수정 (v1.0.2 → v1.1.0)
변경 내역
[치명적 버그 수정] 접속자 0명으로 표시되는 문제
원인 3가지 모두 수정:
`getAccessUsers.xml` — `GROUP BY` + `SELECT \*` 문제
원래: `SELECT \* ... GROUP BY ipaddress` → MySQL strict mode(`ONLY\_FULL\_GROUP\_BY`)에서 쿼리 실패 가능
수정: `GROUP BY` 제거, `SELECT` 컬럼 명시 (`session\_key`, `member\_srl`, `ipaddress`, `cur\_mid`, `last\_update`, `val`)
`getAccessUsers.xml` — `cur\_mid != NULL` 필터링
원래: `cur\_mid`가 NULL이 아닌 것만 조회 → 관리자 페이지 열람 중인 사용자의 `cur\_mid`가 빈 값이라 제외됨
수정: `cur\_mid` NULL/빈값 필터 조건 제거
`accessuser.model.php` — 시간 제한 60초 → 600초
원래: `$\_SERVER\['REQUEST\_TIME'] - 60` (1분)
수정: `$\_SERVER\['REQUEST\_TIME'] - 600` (10분)
이유: Rhymix의 `session.refresh = 300`(5분)이라 세션 갱신 주기가 길어, 1분 제한 시 대부분의 접속자가 목록에서 사라짐
[치명적 버그 수정] 세션 파싱 실패
원래: XE 1.x 세션 직렬화 형식 기준의 `unSerializeSession()` → Rhymix의 `RHYMIX|key|serialized\_value` 형식 파싱 불가
수정: `unSerializeSession()` 전면 재작성
`RHYMIX|` 접두사 자동 감지/제거
PHP 세션 직렬화 형식 파서 구현 (`key|serialized\_value` 반복 구조)
중첩 배열/객체 내부의 `|` 문자를 키 구분자로 오인하지 않도록 깊이 추적 (`findNextSessionKey()`)
문자열 길이 기반 정확한 바운더리 계산 (`s:N:"..."` 형식)
[PHP 8 호환] 전 파일 공통
`\&getModel()`, `\&getController()`, `\&getAdminModel()` → `\&` 제거
`\&TemplateHandler::getInstance()` → `TemplateHandler::getInstance()`
`new Object()` → `class\_exists('BaseObject') ? new BaseObject() : new Object()` (PHP 7.4/8 양쪽 호환)
`$args`, `$module\_config` 등 미초기화 변수 → `new stdClass()` 초기화
`$admin\_member\_srls`, `$friend\_member\_srls` → `array()` 초기화
`$output->data` foreach 전 `null`/`is\_array()` 체크 추가
`strpos()` 비교 → `!== false` 명시적 비교
`\_XE\_PATH\_` → `RX\_BASEDIR` 분기 처리 (`accessuser.mobile.php`)
[개선] 브라우저/OS 감지 업데이트
브라우저 추가: Edge, Whale(웨일), 삼성인터넷
감지 순서 수정: 구체적인 것(Edge, Whale)을 Chrome보다 먼저 체크 (Chromium 기반 브라우저 오감지 방지)
OS 추가: 윈도우 11 (Build 22000 이상), iOS (iPad 포함)
[개선] 봇 목록 업데이트
추가: `semrush`, `ahrefs`, `mj12bot`, `dotbot`, `petalbot`, `gptbot`, `claudebot`, `claude-web`, `bytespider`, `ccbot`, `applebot`, `duckduckbot`, `baiduspider`, `amzn`
[info.xml] 버전/작성자 변경
버전: `1.0.2` → `1.1.0`
날짜: `2017-04-11` → `2026-05-22`
작성자: 숭숭군 + 불패의초인 (bsplus.net)
---
적용 순서
counter 모듈 → `modules/counter/` 덮어쓰기 → 관리자에서 모듈 업데이트 실행 (referer 컬럼 자동 추가)
counter_status 위젯 → `widgets/counter\_status/` 덮어쓰기
bs_gallery_style 스킨 → `widgets/content/skins/bs\_gallery\_style/` 추가
accessuser 모듈 → `modules/accessuser/` 덮어쓰기
캐시파일 재생성
---
PHP 8 전환 시 공통 체크리스트
항목 PHP 7.4 PHP 8.0+
`\&getModel()` 등 레퍼런스 호출 deprecated Fatal Error
`new Object()` 동작 Reserved keyword → `new BaseObject()`
`strpos()` 결과 체크 `if(strpos(...))` `if(strpos(...) !== false)`
미초기화 변수 접근 Notice Warning (더 엄격)
`$args->property` 직접 접근 Notice Warning → `$args = new stdClass()` 필요
`\_XE\_PATH\_` 상수 XE 전용 Rhymix에서는 `RX\_BASEDIR`
`foreach(null)` 무시 TypeError → null 체크 필요
`str\_starts\_with()` 등 없음 PHP 8.0+ 전용 → `strpos()` 사용
댓글 0