PHP답게 개발하는 가볍고 빠른 프레임워크

Flexagon은 가볍고 빠른 PHP 웹 프레임워크입니다. 복잡한 추상화보다 PHP가 가진 단순함을 살리고, 적은 규칙으로 빠르게 개발하는 것을 지향합니다.

composer create-project flexagon/skeleton myapp

PHP 8.3+ MIT 라이선스 런타임 의존성 0개

public/hello.php
<?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

PHP를, PHP답게 개발하세요.

Flexagon은 MIT 라이선스로 공개된 무료 오픈 소스입니다.