소개
WD 미디어 최적화 (wdopt) — 개발 리포트
최종 버전: v1.0.4
개발일: 2026-05-27
제작: 불패의초인 (BSplus) — https://bsplus.net/
환경: Rhymix 2.1.33 / PHP 7.4 / Windows XAMPP / Cloudflare
📌 프로젝트 배경
Rhymix 공식 자료실의 "미디어 최적화 위자드" 모듈(40만원, PHP 8.2+ 전용)을 참고하여, PHP 7.4~8.4 호환으로 자체 개발. 원본 모듈에 없는 동영상 변환 기능(H.264/H.265) 까지 추가.
요구 인코더
| 인코더 | 경로 | 버전 |
|---|---|---|
| cwebp | C:\cwebp\bin\cwebp.exe |
1.6.0 |
| ffmpeg | C:\ffmpeg\bin\ffmpeg.exe |
기존 설치 |
| ffprobe | C:\ffmpeg\bin\ffprobe.exe |
기존 설치 |
🗂 모듈 구조 (최종)
modules/wdopt/
├── conf/
│ ├── info.xml # 모듈 정보 (v1.0.4)
│ └── module.xml # 액션, 권한 정의
├── schemas/
│ ├── wdopt_queue.xml # 처리 큐 테이블
│ └── wdopt_history.xml # 변환 히스토리 테이블
├── queries/ # XML 쿼리 (12개)
│ ├── insertQueue.xml
│ ├── updateQueueStatus.xml
│ ├── getPendingQueue.xml
│ ├── getQueueList.xml
│ ├── getQueueCount.xml
│ ├── getQueueByFileSrl.xml
│ ├── deleteQueue.xml
│ ├── insertHistory.xml
│ ├── getHistoryList.xml
│ ├── getHistoryStats.xml
│ ├── deleteAllHistory.xml
│ └── updateFileRecord.xml # v1.0.3 추가
├── lang/
│ └── ko.php # 한국어 언어팩
├── tpl/
│ ├── css/admin.css # 관리자 스타일
│ ├── _tabs.html # 탭 네비게이션 (미사용, 직접 삽입)
│ ├── dashboard.html # 대시보드
│ ├── queue.html # 처리 큐
│ ├── history.html # 변환 히스토리
│ └── config.html # 기본 설정
├── wdopt.class.php # 메인 클래스 (설치/업데이트/트리거 등록)
├── wdopt.model.php # 모델 (설정/조회/인코더 감지)
├── wdopt.controller.php # 컨트롤러 (트리거/워커/변환 엔진)
├── wdopt.admin.view.php # 관리자 뷰
├── wdopt.admin.controller.php # 관리자 처리
└── README.md # 소개/사용법
🔧 주요 기능
미디어 변환
| 타입 | 입력 | 출력 | 방법 |
|---|---|---|---|
| 이미지 | JPG, PNG, BMP | WebP (또는 원본 유지) | GD 리사이즈 + cwebp 변환 |
| GIF | GIF | Animated WebP (또는 GIF 최적화) | ffmpeg 변환 |
| 동영상 | MP4, AVI, MKV, MOV 등 | MP4 (H.264 또는 H.265) | ffmpeg 인코딩 |
관리자 화면 (4개 탭)
| 탭 | 기능 |
|---|---|
| 📊 대시보드 | 큐 상태 카드(대기/처리중/완료/실패), 용량 절감량, 인코더 상태 |
| 📋 처리 큐 | 상태별 필터, 일괄 재시도, 실패 비우기, 워커 수동 실행 |
| 📜 변환 히스토리 | 파일별 원본→변환 크기/절감률, 타입별 필터, 히스토리 초기화 |
| ⚙ 기본 설정 | 인코더 경로, 품질, 코덱, 비트레이트, 워커, 백업, 제외 모듈 |
동작 흐름
파일 첨부 업로드
↓
file.insertFile 트리거 (after)
↓
wdopt 큐에 자동 등록 (status: pending)
↓
워커 실행 (수동 버튼 또는 Cron)
↓
cwebp / ffmpeg 변환
↓
원본 파일 → 변환본으로 교체 (같은 경로)
↓
DB 업데이트 (uploaded_filename, file_size, source_filename)
↓
원본 백업 (files/wdopt_backup/YYYYMMDD/)
↓
히스토리 기록
📊 테스트 결과
| # | 파일 | 타입 | 원본 | 변환 | 절감 | 절감률 |
|---|---|---|---|---|---|---|
| 1 | 3c883f...91e.png | 이미지 | 2.0MB | 229.1KB | -1.8MB | -89% |
| 2 | 4ed4ca...96d.png | 이미지 | 1.2MB | 134.7KB | -1.0MB | -88.8% |
| 3 | 2ee79a...3c8.png | 이미지 | 142.4KB | 52.1KB | -90.3KB | -63.4% |
| 4 | 2bc6f3...fc9.mp4 | 동영상 | 166.7MB | 15.1MB | -151.6MB | -91% |
| 5 | 8aacf3...201.mp4 | 동영상 | 242.0MB | 22.3MB | -219.7MB | -90.8% |
| 합계 | 412.0MB | 37.8MB | -374.2MB | -90.8% |
🔄 버전 이력
v1.0.0 — 최초 릴리즈
- 전체 모듈 구조 생성 (conf, schemas, queries, PHP, tpl)
- 이미지(WebP), GIF, 동영상(H.264/H.265) 변환 지원
- 관리자 대시보드, 처리 큐, 변환 히스토리, 기본 설정 화면
file.insertFile/file.deleteFile트리거 연동- 원본 백업, 인코더 자동 감지
v1.0.1 — 트리거 및 DB 호환성 수정
문제: 트리거가 호출되지 않음 (큐에 파일이 등록 안 됨)
module.xml의eventHandlers방식 → Rhymix 2.1.33에서type=wdopt.controller로 잘못 등록됨- 수정: eventHandlers 제거,
wdopt.class.php에서 PHPinsertTrigger()코드로 직접 등록 moduleInstall(),checkUpdate(),moduleUpdate()에 트리거 등록/확인 로직 추가
문제: 워커 실행 시 DB::escapeString() 에러
- 수정:
_updateFileRecord()에서$oDB->escapeString()→addslashes()로 교체
문제: 히스토리/큐 목록이 안 나옴
- 수정: XML 쿼리 3개(
getHistoryList,getQueueList,deleteQueue)에서notnull="notnull"제거notnull이 있으면 필터 없이 전체 조회 시에도 WHERE 조건이 걸려 결과 0건
v1.0.2 — UI 수정
문제: 탭 메뉴(대시보드/큐/히스토리/설정)가 안 보임
<!--@include('_tabs.html')-->문법이 Rhymix 2.1.33 템플릿 엔진에서 동작 안 함- 수정: 4개 템플릿(dashboard/queue/history/config.html)에 탭 HTML 직접 삽입
문제: 변환일 컬럼에 "INVALID FILTER (date_format)" 표시
- Rhymix 템플릿에서
date_format필터 미지원 - 수정:
{$item->regdate|date_format:"Y-m-d H:i"}→{zdate($item->regdate,"Y-m-d H:i")}
문제: select 드롭다운 글씨가 안 보임 (설정 화면)
- Rhymix 관리자 테마 CSS가 select 요소의 padding을 덮어써서 글씨가 밀려남
- 수정:
admin.css에서 select padding8px→3px,!important추가
v1.0.3 — DB 업데이트 수정
문제: 변환 후 DB file_size가 원본 크기 그대로 (동영상 재생 불가)
$oDB->query()직접 SQL 실행이 Rhymix에서 정상 동작하지 않음- 수정:
_updateFileRecord()전면 개편$oDB->query()제거 →executeQuery('wdopt.updateFileRecord')XML 쿼리 방식queries/updateFileRecord.xml신규 추가
v1.0.4 — 파일 경로 형식 수정
문제: 변환 후 파일 다운로드/재생 시 "요청한 파일을 찾을 수 없습니다" 에러
- wdopt가 DB에
/files/attach/...형태로 저장 (앞에.없음) - Rhymix 원본은
./files/attach/...형태를 사용 (file.controller.php:1096) - 수정: Rhymix 원본과 동일한 경로 생성 방식 적용
===============================================================================================
v1.0.5 — 파일 저장 경로 표준화 (Rhymix 커뮤니티 규칙 준수)
배경: Rhymix 핵심 개발자(기진곰)로부터 피드백 수신
"files/attach, files/cache 이외의 경로에 파일을 생성하는 서드파티 자료는 모두 경고하겠습니다."
대형 사이트에서는 files/attach/와 files/cache/를 별도 디스크로 마운트하여 운영하는 경우가 많습니다. 서드파티 모듈이 files/ 하위에 임의 폴더를 생성하면 디스크 분리 구조를 깨뜨리고, 백업 누락 및 용량 관리에 문제가 발생합니다.
변경 사항:
| 항목 | 변경 전 | 변경 후 | 이유 |
|---|---|---|---|
| 백업 기본 경로 | files/wdopt_backup |
files/attach/wdopt_backup |
영구 보존 파일 → files/attach/ 하위 |
| 임시 파일 경로 | files/wdopt_temp |
files/cache/wdopt_temp |
임시/캐시 파일 → files/cache/ 하위 |
수정 파일:
wdopt.class.php—getDefaultConfig()의backup_dir기본값 변경wdopt.controller.php—_getTempDir()경로 변경
추가 보안 참고:
files/attach/는 Rhymix가.htaccess로 디렉토리 리스팅을 차단하고 있어 외부 접근이 자동으로 보호됨- 기존
files/wdopt_backup/은 디렉토리 리스팅이 열려있어 원본 파일이 외부에 노출되는 보안 취약점이 있었음 files/attach/하위로 이동함으로써 별도.htaccess없이도 보안이 보장됨
기존 사용자 마이그레이션 (수동):
- 관리자 → 미디어 최적화 → 기본 설정에서 백업 디렉토리를
files/attach/wdopt_backup으로 변경 후 저장 files/wdopt_backup/안의 백업 파일들을files/attach/wdopt_backup/으로 이동files/wdopt_backup/(빈 폴더) 삭제files/wdopt_temp/(빈 폴더) 삭제 — 임시 파일이므로 삭제해도 무방
📋 전체 버전 요약
| 버전 | 주요 변경 |
|---|---|
| v1.0.0 | 최초 릴리즈 — 이미지(WebP), GIF, 동영상(H.264/H.265) 변환 지원 |
| v1.0.1 | 트리거 등록 방식 변경 (eventHandlers → insertTrigger), DB 호환성 수정 |
| v1.0.2 | 탭 메뉴 직접 삽입, date_format → zdate(), select CSS padding 수정 |
| v1.0.3 | DB file_size 업데이트 수정 ($oDB→query → executeQuery XML 방식) |
| v1.0.4 | uploaded_filename 경로 형식 수정 (./files/... Rhymix 표준 준수) |
| v1.0.5 | 파일 저장 경로 표준화 (백업→files/attach, 임시→files/cache) |
==================================================================================
v1.0.6 — 모듈명 변경 (2026-05-28)
기존 wdopt → slimmer로 전면 리네임. 얼음조각티 님의 피드백 반영 (wdopt는 기존 판매 모듈의 약자와 동일).
- 모듈명, 클래스명, 액션명, 쿼리명 전부
slimmer로 변경 - DB 테이블명:
wdopt_queue→slimmer_queue,wdopt_history→slimmer_history - 모듈 타이틀: "WD 미디어 최적화" → "Slimmer 미디어 최적화"
- 백업 경로:
files/attach/slimmer_backup - 임시 경로:
files/cache/slimmer_temp - 기존 wdopt와 별개 모듈 (신규 설치 필요)
==================================================================================
php
// Rhymix 원본 (file.controller.php:1096)
$args->uploaded_filename = './' . substr($uploaded_filename, strlen(RX_BASEDIR));
// wdopt v1.0.4 (동일 방식)
$relative_path = './' . substr($new_path, strlen(RX_BASEDIR));
⚠ 알려진 이슈 / 향후 과제
| 항목 | 상태 | 설명 |
|---|---|---|
| Cron 자동 실행 | 미설정 | Windows 작업 스케줄러 또는 Rhymix Cron에 등록 필요 |
| 동영상 인코딩 부하 | 주의 | 대용량 영상 변환 시 서버 CPU 부하 → 배치 크기 1, 야간 실행 권장 |
| Cloudflare 캐시 | 주의 | CSS/파일 수정 시 Cloudflare 캐시 퍼지 필요 |
| 처리 중 2건 잔류 | 확인 필요 | 기존 처리 중 상태로 남은 항목 정리 필요 |
| 이미지 WebP 변환 후 본문 | 확인 필요 | 본문에 이미 삽입된 img 태그의 확장자가 .png인데 실제 파일이 .webp인 경우 |
📋 PHP 7.4 호환 규칙 (적용됨)
strpos()사용 (str_starts_with()대신)new BaseObject()사용 (new Object()대신)switch사용 (match대신)$args = new stdClass()초기화- named arguments 미사용
이 모듈은 BSplus 서버 전용으로 개발되었으며, Rhymix 2.1.33 + PHP 7.4 + Windows XAMPP 환경에서 테스트되었습니다.
===============================================================================
다운로드 :
===============================================================================
미리보기


파일 필요하신분 문의 바랍니다. 그리고 버그 발생 또한 문의 바랍니다. 세상에 완벽은 없습니다.