CLI 스크립트

script/ 디렉터리에 배치 작업을 둡니다.

<?php
// script/cleanup.php
require_once '__flexagon.php';

$deleted = (new \ExampleUser\UserDAO())->deleteExpired();
echo "삭제: {$deleted}건\n";
php script/cleanup.php runtimeStage=production days=30

key=value 형태의 인자는 파싱되어 $_PARAMS와 $_REQUEST 양쪽에 담깁니다. runtimeStage는 예약어로, 로드할 설정 디렉터리를 결정합니다.

CLI로 실행하면 FLEXAGON_ENV::$_RUNTIME_ENV가 RUNTIME_ENV_SCRIPT로 설정되어 웹 요청 파이프라인(세션·라우팅·출력 버퍼)이 전부 생략됩니다.

프레임워크 CLI

프레임워크 자체도 명령 두 개를 제공합니다.

php script/flexagon.php init [--path=DIR] [--force]
php script/flexagon.php check [--path=DIR]
호출 방법 사용 가능한 설치 형태
php script/flexagon.php 전부 (Composer · phar · 소스)
php vendor/bin/flexagon Composer 설치

phar 는 PHP CLI 에 스크립트 경로로 넘길 수 없어(php phar://... 가 열리지 않음) script/flexagon.php 가 우회로 역할을 합니다. phar 에는 init 용 템플릿이 들어 있지 않으므로 check 만 동작합니다.

init

프로젝트 구조 34개 파일을 만듭니다. composer create-project flexagon/skeleton 으로 시작했다면 이미 다 있으므로 쓸 일이 없고, composer require flexagon/framework 로 기존 프로젝트에 붙였을 때 필요합니다.

이미 있는 파일은 건드리지 않습니다. 버전을 올린 뒤 새로 생긴 구조 파일만 받아 오는 데도 쓸 수 있습니다.

create   script/flexagon.php
keep     public/index.php
1 created, 22 kept, 0 failed

덮어써야 한다면 --force 를 붙이세요. 손댄 파일도 템플릿으로 되돌아가므로 주의하세요.

check

배치와 런타임이 서로 맞는지 점검하고, 문제가 있으면 종료 코드 1 을 반환합니다. 배포 파이프라인에 그대로 넣을 수 있습니다.

항목 확인 내용 실패 시
php 8.3 이상 문제
ext-json · ext-openssl · ext-pdo 로드 여부 문제
opcache.save_comments 켜져 있는지 문제
project layout flexagon.php · application/_Global.php · public/__flexagon.php · public/_router.php 문제
config placement public/·public_* 안에 _Config.php 나 application/ 이 없는지 문제
bootstrap 프레임워크가 실제로 부팅되는지 문제
session key $SESSION_AUTO_START 가 켜져 있으면 $SESSION_ENCRYPTION_STRING 길이 문제
data sources 설정 여부, 템플릿 플레이스홀더가 남아 있는지 경고
display_errors 운영 모드에서 켜져 있는지 경고
secrets placement .env.php·.env가 public/·public_* 아래에 있는지 오류
.env.php 배열을 반환하는지, git에서 추적되지 않는지 오류
settings .env.example.php의 키 중 설정되지 않은 것 경고
secrets in config _Config.php에 데이터 소스 비밀번호가 직접 적혀 있는지 경고
.env 있지만 Flexagon이 읽지 않음 경고
opcache.file_cache .env.php가 있는데 켜져 있는지 (컴파일된 비밀 값이 디스크에 저장됨) 경고

세 항목은 오류 없이 조용히 잘못되는 것들이라 특히 중요합니다.

  • opcache.save_comments 가 꺼져 있으면 @encrypt·@db_auto_timestamp·@exclude_from_get_array 가 전부 무시됩니다. 암호화되어야 할 컬럼이 평문으로 저장되고, 아무 예외도 나지 않습니다.
  • _Config.php 가 public/ 안에 있으면 PHP 핸들러가 멈추는 순간 DB 자격증명이 그대로 서빙됩니다.
  • 데이터소스가 username/dbname 플레이스홀더 그대로면 연결만 실패합니다.
$ php script/flexagon.php check

  ok       php 8.3.33
  ok       ext-json
  ok       opcache.save_comments
  ok       project layout
  ok       bootstrap
  warn     data sources  default 이 템플릿 플레이스홀더 그대로
  ok       session  auto start off
  ok       display_errors  off

  0 problem(s), 1 warning(s)