2. 서버 요구사항
2.1 설치 마법사가 검사하는 항목 [확인] (install/index.php)
필수 (하나라도 실패하면 3단계 진입 불가)
| 항목 | 조건 |
|---|---|
| PHP | >= 5.6.0 |
pdo_mysql 확장 |
로드됨 |
json 확장 |
로드됨 |
mbstring 확장 |
로드됨 (한글 문자열 처리) |
data/ 쓰기 권한 |
is_writable |
pages/ 쓰기 권한 |
is_writable |
install/schema.sql |
읽기 가능 |
선택 (실패해도 진행): openssl(보안 난수·암호화), gd(썸네일, 내장 캡차)
2.2 마법사가 검사하지 않지만 실제로 필요한 것 [확인]
| 항목 | 근거 |
|---|---|
core/ 쓰기 권한 (설치 시점) |
설치가 core/security/{16자 hex}/ 폴더를 만들고 Secure.php를 복사한다. 실패하면 예외로 설치가 중단된다. 마법사의 환경 점검 목록에는 없다 |
curl 확장 또는 allow_url_fopen=1 |
소셜 로그인, 캡차 검증(reCAPTCHA/hCaptcha/Turnstile), SMS 드라이버, 결제 플러그인, 마켓, OG 크롤링이 사용. 코드에 function_exists('curl_init') 분기 27곳 |
gd + WebP 지원 |
imagewebp, imagecreatefromwebp 존재 시에만 업로드 WebP 자동변환 동작. 없으면 원본을 그대로 저장(업로드 실패 아님) |
fileinfo |
업로드 MIME 검증에서 finfo_open 사용(function_exists 가드) |
exif |
exif_read_data 사용(가드 있음). 없으면 회전 보정만 생략 |
zip (ZipArchive) |
마켓 ZIP 설치에서 우선 사용. 없으면 순수 PHP 파서로 폴백 |
redis 확장 |
선택. REDIS_SESSION_URL 정의 시에만 세션·캐시·레이트리밋에 사용 |
apcu |
선택. 캐시 2순위 |
2.3 PHP / DB 호환 범위 (코드 주석·README 기준, 코드는 5.6 문법)
| 항목 | 범위 |
|---|---|
| PHP | 5.6 ~ 8.4 (단일 코드베이스) |
| MySQL | 5.6+ (utf8mb4, InnoDB) |
| MariaDB | 10.1+ |
| 웹서버 | IIS 7+, Apache 2.2+, Nginx, 저가형 공유호스팅(카페24 등) |
| OS | Windows, Linux |
| 문자셋 | 전 테이블 utf8mb4 / utf8mb4_unicode_ci / InnoDB |
2.4 index.php가 강제하는 런타임 값 [확인]
php
@ini_set('pcre.backtrack_limit', '10000000');
@ini_set('pcre.recursion_limit', '10000000');
@ini_set('memory_limit', '256M'); // 호스팅이 ini_set을 막으면 적용되지 않음
error_reporting(E_ALL & ~E_NOTICE & ~E_DEPRECATED);
// 설치됨: display_errors=0, log_errors=1, error_log = data/error.log
// 미설치: display_errors=1
header('Permissions-Policy: camera=*, microphone=*'); // 이후 sendSecurityHeaders()가 camera=(), microphone=()로 다시 덮어씀 (§16 참조)
ob_start(); // 요청 끝에서 ob_end_flush()
2.5 권장 php.ini (README)
ini
opcache.enable = 1
opcache.memory_consumption = 256
opcache.max_accelerated_files = 10000
; PHP-FPM
pm.max_children = 200
업로드 한도: DB 설정 upload_max_size 기본 10485760(10MB). 실제 한도는 min(upload_max_size, php.ini upload_max_filesize, post_max_size) 이다. Nginx는 client_max_body_size 50m을 예시로 제시한다.
3. 폴더 구조 (실제 ZIP 기준)
/ index.php dx_load.php version.php cleanup_sessions.php
│ .htaccess nginx.conf.example README.md LICENSE LICENSE.ko.md
├─ admin/ 관리자 (25개 하위 모듈, 각각 index.php + script.js/style.css)
├─ api/ 비어 있음 (예약)
├─ assets/ css/ js/ img/ ckeditor4/ dx-dark.css dx-dark-admin.css
├─ boards/ handler.php, handler/(비어 있음), skins/gallery, category/skins/{default,pill,tab}
├─ controllers/ README.md만 있음 (DxRouter용 컨트롤러 위치)
├─ core/ 엔진. api/ auth/ cache/(빈) captcha/ db/ hook/ mailer/ router/ search/ security/ sms/
├─ data/ .htaccess, uploads/.htaccess, boards/(빈), pages/(빈) ← 설치 후 config.php 등이 생성됨
├─ docs/ CAPTCHA_MANUAL.md, MARKET_API_SPEC.md
├─ extend/ top/ middle/ bottom/ (자동 실행 훅 없는 코드 삽입)
├─ install/ index.php, migrate.php, schema.sql, web.config, .htaccess, css/, js/
├─ pages/ home.php, shop.php (커스텀 페이지)
├─ plugins/ ckeditor4-editor, dx-socket, 결제 11종, example-plugin, dx-payment-helper.php
├─ routes/ README.md만 있음 (DxRouter 라우트 파일 위치)
└─ themes/ default/ (유일한 테마)
[주의] ZIP에 없는 것: 루트 web.config(README는 있다고 서술), data/config.php, data/cache/, data/sessions/, data/error.log, core/security/{hash}/. 이들은 설치·실행 중 생성된다.