PHP답게 개발하는 가볍고 빠른 프레임워크
Flexagon은 가볍고 빠른 PHP 웹 프레임워크입니다. 복잡한 추상화보다 PHP가 가진 단순함을 살리고, 적은 규칙으로 빠르게 개발하는 것을 지향합니다.
composer create-project flexagon/skeleton myapp
<?php
// public/hello.php → https://example.com/hello
_Global::$SITE_TITLE = 'Hello';
TemplateLoader::show('head');
?>
<h1>Hello, Flexagon</h1>
<p>Pages are plain PHP files. Their path is their URL.</p>
<?php
TemplateLoader::show('tail');
- 0
- 런타임 의존성
- 1.09ms
- 프레임워크 부팅
- 2MB
- 부팅 메모리
- 237KB
- 단일 PHAR 파일
설계 원칙
PHP를 알면 바로 시작할 수 있습니다
페이지는 .php 파일이고, 화면은 PHP와 HTML로 작성하며, 데이터베이스에는 익숙한 SQL을 그대로 사용합니다. 별도의 라우팅 문법이나 서비스 컨테이너, 쿼리 DSL을 먼저 익힐 필요가 없습니다.
쉽고 자유로운 라우팅
파일 구조가 곧 URL 구조가 되어 직관적이고 간결합니다.
모든 요청의 독립적 실행
불필요한 상태를 남기지 않아 안정적이고 예측 가능합니다.
PHP다운 간결한 개발
별도의 템플릿 문법 없이 PHP 본연의 방식으로 개발할 수 있습니다.
적게 쓰고, 더 많이 보이게
한눈에 읽히는 코드
- URL은 곧 파일 경로입니다. 관리할 라우팅 테이블이 없습니다. URL만 보고도 어떤 파일이 실행될지 알 수 있습니다.
- 스키마의 기준은 데이터베이스입니다. DAO가 첫 쿼리에서 컬럼과 기본 키 정보를 읽어 오므로, 스키마를 PHP에 다시 정의할 필요가 없습니다.
- 전역 설정을 숨기지 않습니다. 설정은 정적 클래스 _Global에 모여 있습니다. 설정과 개발자 사이에 DI 컨테이너가 없으며, IDE에서 _Global:: 을 입력하면 자동 완성으로 확인할 수 있습니다.
- 요청당 비용을 최소화합니다. 부팅은 상수 정의, 오토로더 등록, 설정 로드가 전부입니다. 필요하기 전에는 아무것도 만들지 않습니다.
application/ExampleUser/UserDAO.php
<?php
namespace ExampleUser;
use _Flexagon\Base\BaseMySqlDAO;
class UserDAO extends BaseMySqlDAO {
protected string $tableName = 'users';
public function insert(UserModel $user): int|false {
return $this->_insert($user);
}
public function findById(int $id): ?UserModel {
return $this->_select(['id' => $id], new UserModel());
}
/** @return UserModel[] */
public function findByCity(string $city, int $page = 1): array {
return $this->_selectList(
new UserModel(), $page, 20,
'`address` = :CITY', ['CITY' => $city],
'`created_at` DESC'
);
}
}
application/ExampleUser/UserModel.php
<?php
namespace ExampleUser;
use _Flexagon\Base\BaseModel;
class UserModel extends BaseModel {
private ?int $id = null;
private string $name;
/** @encrypt */
private string $residentNumber = '';
public function getId(): ?int { return $this->id; }
public function setId(?int $id): void { $this->id = $id; }
public function getName(): string { return $this->name; }
public function setName(string $name): void { $this->name = $name; }
// Columns map to getters: resident_number → getResidentNumber()
}
application/_Config.php
<?php
use _Flexagon\Libs\Env;
use _Flexagon\Models\DataSourceModel;
// Secrets come from .env.php or the environment, never from this file.
_Global::$DATA_SOURCES['default'] = new DataSourceModel(
Env::get('DB_HOST', 'localhost'),
Env::int('DB_PORT', 3306),
Env::get('DB_USER'),
Env::required('DB_PASSWORD'),
Env::get('DB_NAME')
);
_Global::$SESSION_AUTO_START = true;
_Global::$SESSION_ENCRYPTION_STRING = Env::required('SESSION_ENCRYPTION_STRING');
가볍고 빠릅니다
가벼운 프레임워크, 빠른 웹 애플리케이션
같은 환경에서 Flexagon은 1.09ms, 메모리 2MB, 파일 15개로 요청을 처리할 준비를 마칩니다. Laravel은 12.85ms, 20MB, 파일 336개가 필요합니다. 프레임워크가 가볍고 빠른 만큼, 그 위에서 만드는 웹 애플리케이션에서도 좋은 성능을 기대할 수 있습니다.
런타임 의존성 없이 설치 크기는 532KB로, 패키지 77개에 42MB를 차지하는 Laravel보다 훨씬 작습니다. 237KB짜리 PHAR 파일 하나로 배포할 수 있으며, 대상 서버에는 Composer도, 캐시 워밍 단계도 필요 없습니다.
| Flexagon 3.5.0 | Laravel 13.26.1 | |
|---|---|---|
| 런타임 의존성 | 0 | 77개 패키지 |
| 설치 크기 | 532 KB | 42 MB |
| 부팅 시간 | 1.09 ms | 12.85 ms |
| 부팅 메모리 | 2 MB | 20 MB |
| 부팅 시 로드 파일 | 15 | 336 |
꼭 필요한 기능은 기본으로
웹 애플리케이션에 필요한 것만, 필요한 만큼
시작하기
세 단계로 첫 페이지 띄우기
1
프로젝트 만들기
composer create-project flexagon/skeleton myapp
cd myapp
2
페이지 추가하기
<?php
// public/hello.php
TemplateLoader::show('head');
echo '<h1>Hello, Flexagon</h1>';
TemplateLoader::show('tail');
3
실행하기
docker compose up -d
php script/flexagon.php check
# open http://localhost:8080/hello