필사 모드: 모던 PHP 2026 — PHP 8.4 / Laravel 12 / Symfony 7.3 / FrankenPHP / Octane / Livewire / Filament 심층 가이드
한국어1장 · 2026년의 PHP — “죽었다”고 한 사람들에게 (다시)
매년 “PHP는 죽었다”는 글이 트렌딩에 오른다. 그리고 매년 그 글을 받친 서버는 PHP로 돌아간다. Wikipedia, Slack의 일부, Facebook의 PHP 변종 Hack, 워드프레스가 만든 웹의 약 43%, Shopify의 일부 결제 흐름, 그리고 한국과 일본의 수많은 커머스 백오피스가 그렇다.
2026년의 PHP는 사용자 수만으로 살아남은 언어가 아니다. **언어 자체가 다시 매력적**이다.
- **PHP 8.4 (2024.11)** — Property Hooks(getter/setter 1급), 비대칭 가시성, Lazy Objects, `new MyClass()->method()` 체이닝 가능
- **Laravel 12 (2025.2)** — Reverb 웹소켓 서버, Folio 파일 라우팅, Volt SFC, Pennant 피처 플래그
- **Symfony 7.3** — Doctrine 3, Mercure 푸시, AssetMapper, 새 Scheduler
- **FrankenPHP** — Caddy 기반 단일 바이너리, 워커 모드 + Early Hints + 동시성
- **Octane** — Laravel을 long-running 프로세스로 (Swoole / RoadRunner / FrankenPHP 어댑터)
- **Livewire 3 / Inertia.js** — “Vue/React 안 쓰고도 리액티브”
- **Filament 3 / 4** — Laravel 어드민의 사실상 표준
- **Pest 3 / PHPUnit 11 / PHPStan 2 / Rector** — 테스트와 정적 분석, 자동 마이그레이션
이 글의 입장은 명확하다. **2026년에 PHP를 고르는 것은 “과거를 답습”하는 선택이 아니라, 풀스택 생산성을 가장 짧은 경로로 얻는 합리적 선택이다.** 한국과 일본의 레거시와 신규 프로젝트 양쪽에서 그렇다.
> 이 글에 등장하는 모든 코드는 PHP 8.4 + Laravel 12 / Symfony 7.3 기준으로 작성했다. 8.3 호환이 필요한 부분은 별도로 표시한다.
2장 · PHP 8.4 (2024.11) — Property Hooks, 비대칭 가시성, Lazy Objects
PHP 8.4는 2024년 11월 21일 GA되었다. “언어가 끝났다”는 평을 가장 빠르게 뒤집은 버전이다.
2.1 Property Hooks — getter/setter가 1급 시민으로
자바, C#, Kotlin이 수십 년 전부터 가졌던 기능이 마침내 PHP에 도착했다.
class User
{
public string $firstName;
public string $lastName;
// 가상 프로퍼티 — 호출 시점에 계산
public string $fullName {
get => "{$this->firstName} {$this->lastName}";
set(string $value) {
[$this->firstName, $this->lastName] = explode(' ', $value, 2);
}
}
}
$u = new User();
$u->fullName = 'Ada Lovelace';
echo $u->fullName; // "Ada Lovelace"
echo $u->firstName; // "Ada"
기존에는 `__get` / `__set` 매직 메서드로 우회했는데, IDE 자동완성도 안 되고 정적 분석도 어려웠다. 이제는 진짜 프로퍼티처럼 보이고, 진짜 프로퍼티처럼 PHPStan/Psalm이 추론한다.
2.2 비대칭 가시성 (Asymmetric Visibility)
“읽기는 public, 쓰기는 private”를 한 줄로 표현할 수 있다.
class Account
{
// public 읽기 + private 쓰기
public private(set) int $balance = 0;
public function deposit(int $amount): void {
$this->balance += $amount;
}
}
$a = new Account();
$a->deposit(100);
echo $a->balance; // 100 OK
$a->balance = 9999; // Error: 외부에서 set 불가
Java의 “final 필드 + getter” 보일러플레이트가 통째로 사라진다.
2.3 Lazy Objects (지연 객체)
ORM과 DI 컨테이너가 가장 갈증을 느낀 기능이다. 객체를 “껍데기”로 만들어 두고, 실제 사용 시점에 초기화한다.
$reflector = new ReflectionClass(HeavyService::class);
$lazy = $reflector->newLazyGhost(function (HeavyService $instance): void {
$instance->__construct(/* expensive deps */);
});
// $lazy는 아직 초기화되지 않은 상태
$lazy->doSomething(); // 이 순간 초기화 콜백이 실행
Doctrine, Symfony DI, Laravel 컨테이너는 모두 8.4의 Lazy Objects 위에서 자체 프록시 코드를 줄이는 중이다.
2.4 `new MyClass()->method()` — 괄호 한 쌍이 사라진다
// PHP 8.3까지
$dt = (new DateTime('now'))->format('Y-m-d');
// PHP 8.4
$dt = new DateTime('now')->format('Y-m-d');
작은 변화지만 코드가 눈에 띄게 깔끔해진다.
2.5 새 배열 함수와 HTML5 파서
array_find($users, fn($u) => $u->isAdmin());
array_find_key($users, fn($u) => $u->name === 'Ada');
array_any($users, fn($u) => $u->isActive());
array_all($users, fn($u) => $u->isVerified());
$dom = Dom\HTMLDocument::createFromString('<p>Hello</p>');
PHP 8.4는 “언어 자체에 또 한 번 큰 한 걸음”을 더했다. 8.0(JIT/Union types)·8.1(enum/readonly)·8.2(readonly class)·8.3(typed const)을 잇는 가장 큰 업데이트다.
3장 · Laravel 12 (2025.2) — Reverb / Folio / Volt / Pennant
Laravel 12는 2025년 2월 24일 릴리스되었다. **“프레임워크에 더 무엇을 더할 수 있을까”에 답한 버전**이다.
3.1 Reverb — Laravel의 1급 WebSocket 서버
Pusher와 Soketi를 거쳐, Laravel은 마침내 자체 웹소켓 서버 Reverb를 가졌다. ReactPHP 기반으로, FrankenPHP·Octane과 결합하면 단일 서버에서 수만 동시 연결을 처리한다.
composer require laravel/reverb
php artisan reverb:install
php artisan reverb:start
// app/Events/MessageSent.php
class MessageSent implements ShouldBroadcast
{
public function __construct(public Message $message) {}
public function broadcastOn(): array {
return [new PrivateChannel("chat.{$this->message->room_id}")];
}
}
프론트에서는 Laravel Echo로 한 줄.
Echo.private(`chat.${roomId}`).listen('MessageSent', (e) => {
appendMessage(e.message);
});
3.2 Folio — 파일 시스템 기반 라우팅
Next.js / Nuxt의 파일 라우팅이 Laravel에 들어왔다. `resources/views/pages/` 하위 파일이 곧 라우트다.
resources/views/pages/
├── index.blade.php → /
├── dashboard.blade.php → /dashboard
└── users/
├── index.blade.php → /users
└── [id].blade.php → /users/{id}
// resources/views/pages/users/[id].blade.php
<?php
use function Laravel\Folio\name;
use App\Models\User;
name('users.show');
$user = User::findOrFail($id);
?>
`web.php`를 안 만져도 라우트가 늘어난다. 작은 사이드 프로젝트와 어드민에 특히 잘 맞는다.
3.3 Volt — Livewire 3 단일 파일 컴포넌트
Vue SFC를 닮은 Livewire 컴포넌트. PHP 로직과 Blade 템플릿이 한 파일에 산다.
<?php
use function Livewire\Volt\{state, computed};
state(['count' => 0]);
$increment = fn () => $this->count++;
?>
Folio + Volt 조합은 “Laravel에서 가장 빠르게 화면 한 장을 만드는 방법”의 새 답이다.
3.4 Pennant — 1급 피처 플래그
use Laravel\Pennant\Feature;
Feature::define('new-checkout', fn (User $user) => $user->isInternal());
if (Feature::active('new-checkout')) {
return view('checkout.v2');
}
LaunchDarkly 같은 SaaS 없이 DB 기반 피처 플래그를 1주일 만에 도입할 수 있다.
3.5 그 외 — 새 스타터 킷, Workflows, Vite 6
Laravel 12는 React/Vue/Livewire **별 공식 스타터 킷**을 제공하고, Workflows(공식 워크플로 엔진), Vite 6, Tailwind 4를 기본으로 끼워 준다. `laravel new` 한 번이면 인증·관리자·요금제까지 도달하는 시대다.
4장 · Symfony 7.3 — Doctrine 3 + Mercure + AssetMapper
Symfony는 “Laravel처럼 보이지 않으려는” 또 다른 정답이다. 더 명시적이고, 더 컴포넌트 지향이며, “엔터프라이즈 PHP의 사실상 표준”이다.
4.1 7.x 라인업
- **7.0** (2023.11) — PHP 8.2+ 요구
- **7.1** (2024.5) — 새 Asset Mapper 통합
- **7.2** (2024.11) — JSON Streamer, Profiler 개선
- **7.3** (2025.5) — Doctrine 3 안정 지원, Mercure 1급 어댑터
4.2 Doctrine ORM 3 + DBAL 4
#[ORM\Entity]
class Product
{
#[ORM\Id, ORM\Column, ORM\GeneratedValue]
public int $id;
#[ORM\Column(length: 200)]
public string $name;
#[ORM\Column(type: 'decimal', precision: 10, scale: 2)]
public string $price;
}
Doctrine 3는 enum, readonly, 비대칭 가시성을 1급으로 지원한다. PHP 8.4의 Property Hooks와도 매끄럽게 맞물린다.
4.3 Mercure — 서버 → 브라우저 푸시
WebSocket이 무거울 때 Server-Sent Events 기반 Mercure 허브를 쓴다. Symfony 7은 1급 통합이다.
public function publish(HubInterface $hub): Response {
$hub->publish(new Update(
'/orders/42',
json_encode(['status' => 'shipped']),
));
return new Response();
}
4.4 AssetMapper — “Node 없는 프론트”
php bin/console importmap:require bootstrap
Webpack/Vite를 안 깔고도 importmap + 브라우저 ES 모듈로 SPA-급 프론트를 만들 수 있다. 어드민과 사내 도구에 특히 맞는다.
4.5 Scheduler & Messenger
#[AsSchedule('default')]
class MainSchedule implements ScheduleProviderInterface
{
public function getSchedule(): Schedule {
return (new Schedule())->add(
RecurringMessage::cron('0 3 * * *', new DailyReport()),
);
}
}
크론 + 큐 + 워크플로가 한 컴포넌트로 묶였다. Laravel의 `schedule:run` + Horizon에 대응한다.
5장 · FrankenPHP — Caddy 기반 단일 바이너리 PHP 런타임
FrankenPHP는 2022년 Kévin Dunglas(API Platform / Mercure 저자)가 시작한 프로젝트로, **Caddy 웹 서버 위에 PHP 인터프리터를 내장**한 Go 바이너리다. 2024년 1.0 GA, 2026년 현재 Laravel·Symfony 양쪽 공식 지원.
5.1 왜 충격적인가
전통적 PHP 스택:
nginx → php-fpm → PHP
3개 프로세스, 3개 설정 파일
FrankenPHP:
frankenphp 단일 바이너리 → PHP
HTTPS, HTTP/3, 메트릭, 정적 파일, PHP 실행 모두 한 프로세스
5.2 워커 모드 — long-running PHP
FrankenPHP의 핵심은 **워커 모드**다. 요청마다 PHP를 부팅하지 않고, 부트스트랩한 워커가 요청 루프를 돌린다.
// public/worker.php
require __DIR__ . '/../vendor/autoload.php';
$kernel = (require __DIR__ . '/../bootstrap/app.php')
->handleRequest(Request::capture());
$handler = static function () use ($kernel) {
// 요청별 핸들러 — Octane이 내부적으로 호출
return $kernel->handle(Request::capture());
};
\frankenphp_handle_request($handler);
Caddyfile
{
frankenphp {
worker ./public/worker.php
}
}
example.com {
root * public/
php_server
}
요청당 부트 비용이 사라지면서 Laravel 평균 응답 시간이 50–80% 줄어드는 사례가 흔하다.
5.3 Early Hints (103) — 진짜로 빨라지는 트릭
// 본문 처리 전에 103 Early Hints로 CSS/JS 프리로드 지시
return response()
->withHeaders(['Link' => '</css/app.css>; rel=preload; as=style'])
->earlyHints();
브라우저는 본문이 오기 전부터 CSS를 받는다. LCP가 200–400ms 빨라지는 게 보통이다.
5.4 임베드 모드 — 단일 바이너리 배포
`frankenphp build` 한 번이면 PHP 인터프리터 + 앱 코드 + Caddy가 한 바이너리에 들어간다. `scp` 한 번으로 배포 끝. Docker도 굳이 안 써도 된다.
frankenphp build --output ./myapp
scp ./myapp user@server:/srv/myapp
ssh user@server './myapp run'
6장 · Laravel Octane — Swoole / RoadRunner / FrankenPHP
Octane은 “Laravel을 long-running 프로세스로 띄우는 공식 어댑터”다. PHP 워커 풀이 부팅 한 번으로 메모리에 머무르고, 요청마다 컨테이너를 재사용한다.
6.1 세 가지 백엔드
| 백엔드 | 기반 | 강점 | 주의점 |
|---|---|---|---|
| **Swoole** | C 확장 | 코루틴, 최고 성능 | 메모리 누수 디버깅 까다로움 |
| **RoadRunner** | Go | 안정성, 명시적 워커 모델 | 코루틴 없음 |
| **FrankenPHP** | Caddy/Go | 단일 바이너리, Early Hints | 가장 새것 |
composer require laravel/octane
php artisan octane:install --server=frankenphp
php artisan octane:start --workers=8
6.2 Octane이 바꾸는 두 가지
1. **부트 시간** — Laravel 평균 부트가 80ms라면, 워커 1번 부트 후 0ms.
2. **싱글톤 라이프타임** — 컨테이너에 등록한 싱글톤이 요청 사이 살아 있다. **이 점이 함정**이다. 요청 상태가 싱글톤에 끼면 다음 요청으로 새서 보안 사고가 난다.
// 위험 — 사용자 요청 객체를 싱글톤에 박지 마라
$this->app->singleton('user', fn () => Auth::user()); // BAD
// 안전 — 매 요청 새로 만들기
$this->app->scoped('user', fn () => Auth::user()); // GOOD
Octane은 `php artisan octane:reload`로 워커를 무중단 재시작한다. 코드 배포 후 한 줄이면 된다.
7장 · RoadRunner + Spiral — Go 기반 런너와 그 위의 프레임워크
RoadRunner는 Spiral Scout가 만든 **Go 기반 PHP 애플리케이션 서버**다. 2018년에 시작했고, 2026년에는 v2025 라인이 안정 운영된다.
7.1 RoadRunner의 차별점
- 워커 풀은 Go가 관리, 요청은 gRPC로 PHP 워커에 분배
- HTTP, gRPC, 큐(Beanstalk/SQS/AMQP/NATS), 잡 스케줄러, KV가 한 프로세스
- 메트릭은 OpenTelemetry로 1급 export
.rr.yaml
version: '3'
server:
command: 'php worker.php'
http:
address: '0.0.0.0:8080'
pool:
num_workers: 8
jobs:
pipelines:
high:
driver: memory
config:
priority: 1
7.2 Spiral — PHP의 “Go 스타일” 프레임워크
Spiral은 RoadRunner를 만든 팀의 자체 프레임워크다. Laravel/Symfony와 달리 처음부터 long-running PHP를 전제로 설계되었다.
- DI는 PSR-11
- ORM은 Cycle ORM(DataMapper, Doctrine 대안)
- 라우팅은 어트리뷰트
- 큐, gRPC 서비스, 워크플로(Temporal과 1급 통합)가 빌트인
#[Route(route: '/users/<id:int>', methods: 'GET')]
public function show(int $id, ORM $orm): array {
return $orm->getRepository(User::class)->findByPK($id)->toArray();
}
“Laravel은 너무 매직, Symfony는 너무 무거움”이라는 사람들에게 매력적이다.
7.3 Hyperf — 중국발 코루틴 프레임워크
Hyperf는 Swoole 코루틴 기반의 비동기 프레임워크다. 중국 본토에서 Laravel을 능가하는 인지도를 가졌고, 일본·한국 일부 게임 서버 백엔드에서도 채택되었다.
#[AutoController]
class UserController {
#[GetMapping(path: '/users/{id}')]
public function show(int $id): array {
return User::find($id)->toArray();
}
}
코루틴 기반이라 Node.js처럼 `Promise.all` 패턴이 자연스럽다.
8장 · Livewire 3 + Inertia.js — Laravel 리액티브 / SPA
“React/Vue 안 쓰고도 SPA 같은 UX”를 만드는 두 갈래의 답.
8.1 Livewire 3 — 서버 컴포넌트의 PHP 버전
Livewire 3은 2023년에 큰 폭으로 다시 쓰였다. Alpine.js와 깊게 통합되었고, 동작이 React Server Components와 비슷하다.
// app/Livewire/Counter.php
class Counter extends Component
{
public int $count = 0;
public function increment(): void {
$this->count++;
}
public function render(): View {
return view('livewire.counter');
}
}
{{-- resources/views/livewire/counter.blade.php --}}
서버가 매 인터랙션마다 HTML 조각을 그려 보낸다. 네트워크는 살짝 더 쓰지만 **JS 코드량이 거의 0**이다. 어드민·내부 도구에 최강이다.
8.2 Inertia.js — Laravel/Rails 위의 SPA
Inertia는 “SPA를 위한 풀스택 어댑터”다. 백엔드(Laravel/Rails/Django) 컨트롤러가 Vue/React/Svelte 컴포넌트 + props를 반환한다.
// 컨트롤러
public function index() {
return Inertia::render('Users/Index', [
'users' => User::paginate(20),
]);
}
<!-- resources/js/Pages/Users/Index.vue -->
defineProps({ users: Object });
REST API를 만들 필요가 없다. 라우터, 인증, 권한이 백엔드 그대로다.
8.3 어떻게 고를까
| 상황 | 추천 |
|---|---|
| 어드민, 내부 도구, 소규모 SaaS | **Livewire 3** (또는 Filament) |
| 진짜 SPA, 풀 인터랙티브 UI | **Inertia.js + Vue/React** |
| 정적 사이트 + 작은 인터랙션 | **Alpine.js만** |
9장 · Filament — Laravel 어드민의 사실상 표준
Filament는 Dan Harrin이 만든 “Laravel 어드민 패널 생성기”다. 2022년 v2 이후 폭발적으로 성장했고, 2024년 v3, 2025년 v4로 이어졌다. **2026년의 Laravel 어드민은 사실상 Filament**다.
9.1 무엇을 주는가
- 리소스(CRUD) 생성기 — `php artisan make:filament-resource User`
- 테이블, 폼, 위젯, 알림이 컴포넌트
- 멀티 테넌시(서브도메인, 패스 프리픽스)
- Role/Permission (Spatie 패키지와 통합)
- 위에 Livewire 3로 동작
class UserResource extends Resource
{
protected static ?string $model = User::class;
public static function form(Form $form): Form {
return $form->schema([
TextInput::make('name')->required(),
TextInput::make('email')->email()->required(),
Select::make('role')->options([
'admin' => 'Admin',
'user' => 'User',
]),
]);
}
public static function table(Table $table): Table {
return $table
->columns([
TextColumn::make('name')->searchable(),
TextColumn::make('email')->copyable(),
TextColumn::make('created_at')->dateTime(),
])
->filters([
SelectFilter::make('role'),
])
->actions([
EditAction::make(),
DeleteAction::make(),
]);
}
}
20줄 안 되는 코드로 “검색 + 필터 + 페이지네이션 + 액션”까지 갖춘 어드민이 나온다. Django Admin과 자주 비교되는데, **Filament 쪽이 디자인과 커스터마이즈 자유도가 더 높다**.
9.2 어드민이 아니라 “앱 빌더”로
Filament는 더 이상 어드민 전용이 아니다. **Panels**라는 개념으로 고객용 대시보드, 파트너 포털, 내부 운영 도구까지 한 코드베이스에서 만들 수 있다.
| Panel | 대상 | URL |
|---|---|---|
| `admin` | 사내 관리자 | /admin |
| `partner` | B2B 파트너 | /partner |
| `customer` | 고객 대시보드 | /app |
10장 · Statamic — 플랫 파일 CMS
Statamic은 “워드프레스에 신물난 Laravel 사람들”의 답이다. 콘텐츠를 DB가 아니라 **Markdown + YAML 파일**로 저장한다.
10.1 무엇이 좋은가
- 파일이 곧 콘텐츠 → Git에 올라간다 → 코드 리뷰가 콘텐츠 리뷰
- Laravel 기반 → 패키지, 큐, 인증 다 가져다 쓴다
- 빌트인 CP(Control Panel)가 깔끔
- Antlers 템플릿 엔진 + Blade 양쪽 지원
- Headless로 GraphQL/REST export 가능
content/collections/articles/2026-05-16.hello.md
id: a1b2c3
title: 'Hello, Statamic'
author: youngju
본문 Markdown
Hello, world.
10.2 어울리는 곳
- 마케팅 사이트, 블로그, 도큐먼테이션 사이트
- 콘텐츠 변경 빈도가 낮고, 디자인 자유도가 높은 곳
- Git 기반 워크플로(PR로 글 검수)를 쓰고 싶은 팀
WordPress와의 차이는 명확하다. Statamic은 **개발자 친화 + 코드 우선**, WordPress는 **에디터 친화 + UI 우선**이다.
11장 · 도구 체인 — Pest / PHPUnit 11 / PHPStan 2 / Psalm / Rector
11.1 Pest 3 — 표현력 좋은 테스트 러너
Pest는 PHPUnit 위에 “Jest 같은 DSL”을 얹는다. 2024년 3.0, 2025년 4.x.
// tests/Feature/UserTest.php
use App\Models\User;
it('creates a user', function () {
$user = User::factory()->create(['name' => 'Ada']);
expect($user->name)->toBe('Ada');
});
test('admin can list users')
->actingAs(User::factory()->admin()->create())
->get('/admin/users')
->assertOk();
브라우저 테스트도 1급으로 들어갔다(`pest --browser`). Pest 4부터는 Playwright 위에서 동작한다.
11.2 PHPUnit 11
여전히 “업계 표준”. Pest도 내부적으로는 PHPUnit 위에서 돈다.
final class UserTest extends TestCase
{
public function testItCreatesUser(): void {
$user = User::factory()->create();
$this->assertNotNull($user->id);
}
}
11.x는 `#[Test]`, `#[DataProvider]` 등 어트리뷰트 방식이 표준이 되었다.
11.3 PHPStan 2 vs Psalm
| 항목 | PHPStan 2 | Psalm |
|---|---|---|
| 만든 곳 | Ondřej Mirtes | Vimeo (지금은 커뮤니티) |
| 강점 | 빠른 분석, 큰 생태계 | 더 엄격한 추론, 보안 분석 |
| Laravel 친화 | 매우 (Larastan) | 보통 |
| 2026년 모멘텀 | 강함 | 다소 약화 |
대부분의 신규 Laravel/Symfony 프로젝트는 **PHPStan 2 + Larastan**으로 시작한다.
composer require --dev phpstan/phpstan larastan/larastan
vendor/bin/phpstan analyse --level=8 app/
레벨 8(최대)에서 깨끗하면 “타입 안전한 PHP”라고 부를 수 있다.
11.4 Rector — 자동 리팩터링
Rector는 “AST 기반 자동 마이그레이션 도구”다. PHP 7 → 8, Laravel 10 → 11 → 12, Symfony 6 → 7 같은 메이저 업그레이드를 한 번에 해 준다.
// rector.php
use Rector\Config\RectorConfig;
use Rector\Set\ValueObject\LevelSetList;
return RectorConfig::configure()
->withPaths([__DIR__ . '/app'])
->withPhpSets(php84: true)
->withSets([LevelSetList::UP_TO_PHP_84]);
vendor/bin/rector process
“리팩터링이 두려워서 못 올리는 PHP 5/7 레거시”의 가장 큰 처방이다.
12장 · 호스팅 진영 — Forge / Vapor / Cloud
Laravel 진영은 “언어 → 프레임워크 → 도구 체인 → 호스팅”까지 수직 통합을 마쳤다.
12.1 Forge — VPS 프로비저닝 SaaS
- 2014년 출시, 가장 오래된 Laravel 호스팅 도구
- DigitalOcean / AWS / Linode / Vultr / Hetzner의 VPS를 자동 설정
- nginx + PHP-FPM + Redis + Supervisor + Let’s Encrypt가 자동 구성
- 2025년부터 FrankenPHP 1급 지원
12.2 Vapor — 서버리스 (AWS Lambda)
- Laravel을 AWS Lambda 위에 올린다 (PHP는 Bref 위에서 동작)
- 콜드 스타트는 평균 300–500ms
- 큐는 SQS, DB는 RDS Aurora, 큐는 Redis (ElastiCache)
- “트래픽 스파이크가 심한 서비스”에 잘 맞는다
12.3 Cloud — Laravel 11/12 시대의 매니지드 호스팅
Laravel Cloud는 2024년 발표, 2025년 GA된 “Vercel 스타일” 매니지드 호스팅이다.
- Git push → 자동 빌드 + 배포 + 도메인 + SSL
- FrankenPHP 워커 모드를 기본 런타임으로 채택
- Postgres / Redis / 큐 / 잡 스케줄러가 한 대시보드
- 리전: 미국 / EU / 아시아(싱가포르) / 그 외 추가 중
Vercel이 Next.js를 호스팅하는 방식 그대로, Laravel을 1급으로 호스팅한다.
| 상황 | 추천 |
|---|---|
| 트래픽이 비교적 일정, 비용 절감 우선 | Forge + VPS |
| 트래픽 스파이크, AWS 생태계와 깊이 통합 | Vapor |
| “신경 안 쓰고 그냥 띄우고 싶다” | Cloud |
13장 · 한국 / 일본 — 우아한형제들, 카카오, pixiv, Cookpad, 메르카리
“진짜 회사들은 PHP를 어디에 쓰는가”를 한·일 사례로 보자.
13.1 한국
- **우아한형제들(배민)** — 초창기 백오피스가 PHP였고, 일부 어드민/내부 도구는 여전히 PHP. 신규는 Java/Kotlin이지만 사내 어드민 빌더로 Filament를 검토했다는 발표가 인프콘 2025에 있었다.
- **카카오** — 일부 광고/마케팅 LP, 사내 도구. 카카오 게임즈의 일부 백오피스도 PHP.
- **GS샵, 이마트몰, 11번가** 등 한국형 커머스 백오피스의 상당수가 여전히 PHP/CodeIgniter/CakePHP 위에서 동작 중.
- 신규 스타트업의 PHP 채택은 줄었지만, **에이전시 / 마케팅 / CMS 시장에서는 압도적**이다.
13.2 일본
- **ピクシブ(pixiv)** — 일러스트 SNS, 창업 초기부터 PHP. 사내 도구와 본체 일부에 여전히 PHP가 살아 있다. 2024년 PHP 8.3, 2025년 PHP 8.4 마이그레이션 사례가 PHPerKaigi에 발표되었다.
- **Cookpad** — 오랫동안 Ruby on Rails로 알려졌지만, 인수한 자회사·실험 프로덕트에는 PHP가 살아 있다.
- **メルカリ(Mercari)** — 초창기 모놀리식은 PHP(Symfony). 마이크로서비스 전환 이후 Go 중심이지만, 일부 백오피스와 보조 시스템은 여전히 PHP.
- **クックパッド株式会社, サイバーエージェント, GMOペパボ, ピクスタ** — 다양한 PHP 사례가 PHPerKaigi / PHP Conference Japan에서 매년 발표된다.
- 일본은 한국보다 **PHP 커뮤니티가 단단하고 컨퍼런스가 활발**하다. PHPerKaigi와 PHP Conference Japan은 매년 수백 명이 모인다.
13.3 공통 패턴
- “신규는 Go / Kotlin / TypeScript, 어드민·CMS·마케팅·레거시는 PHP”
- 진짜 죽는 것은 PHP가 아니라 **레거시 프레임워크(CodeIgniter 3, CakePHP 2, Symfony 2/3)**다
- 8.4 + Laravel 12 + FrankenPHP는 **이 레거시를 모더나이즈하는 가장 짧은 경로**
14장 · 누가 PHP를 골라야 하나 — 2026년의 결정 가이드
“언어 자체”가 아니라 “상황”이 답을 결정한다.
14.1 PHP를 고르는 게 정답인 경우
- **풀스택 한 명 ~ 소규모 팀**으로 SaaS를 빠르게 띄워야 할 때 → Laravel 12 + Filament + Forge
- **사내 어드민, 운영 도구, 백오피스** → Filament 단독
- **마케팅 사이트 + 블로그** → Statamic
- **레거시 PHP를 모더나이즈** → PHP 8.4 + Rector + Pest + Octane
- **JS를 최소화하고 싶은 UI** → Livewire 3 (또는 Inertia)
- **워드프레스 대안이 필요** → Statamic 또는 헤드리스 + Laravel API
14.2 PHP를 고르지 말아야 할 경우
- **초저지연 (1ms 미만), 수십만 동시 연결의 실시간 시스템** → Go / Rust / Elixir
- **데이터 사이언스, ML 학습** → Python
- **모바일 native, 게임 클라이언트** → Swift / Kotlin / C++ / C#
- **AWS Lambda 콜드 스타트가 결정적인 곳** → Node.js / Rust
14.3 “모던 PHP” 스택 추천 — 2026년 풀스택 SaaS
PHP 8.4
Laravel 12
FrankenPHP (워커 모드) + Octane
Livewire 3 + Volt + Filament 4
Postgres 16 + Redis 7
Pest 3 + PHPStan 2 (level 8) + Rector
Laravel Cloud (또는 Forge + Hetzner)
이 스택이라면 “1인 개발자가 한 달 안에 결제까지 갖춘 SaaS를 띄울 수 있다”는 문장이 과장이 아니다.
14.4 마지막 한마디
2026년의 PHP는, 2016년의 PHP가 받았던 농담을 더 이상 듣지 않는다. **언어가 좋아졌고, 생태계가 단단해졌고, 호스팅이 매끄러워졌다.** 한·일에서도 “레거시를 살리는 언어”인 동시에 “새 풀스택을 빠르게 띄우는 언어”로 자리 잡았다.
“PHP는 죽지 않는다”는 농담의 다음 줄은 이렇게 써야 한다. **“PHP는 죽기는커녕, 다시 매력적이다.”**
참고 / References
- PHP — [PHP 8.4 Release Announcement](https://www.php.net/releases/8.4/en.php)
- PHP RFC — [Property Hooks](https://wiki.php.net/rfc/property-hooks)
- PHP RFC — [Asymmetric Visibility v2](https://wiki.php.net/rfc/asymmetric-visibility-v2)
- PHP RFC — [Lazy Objects](https://wiki.php.net/rfc/lazy-objects)
- Laravel — [Laravel 12 Release Notes](https://laravel.com/docs/12.x/releases)
- Laravel — [Reverb (WebSockets)](https://laravel.com/docs/12.x/reverb)
- Laravel — [Folio (Page-based routing)](https://laravel.com/docs/12.x/folio)
- Laravel — [Volt (Single-file Livewire)](https://livewire.laravel.com/docs/volt)
- Laravel — [Pennant (Feature flags)](https://laravel.com/docs/12.x/pennant)
- Symfony — [Symfony 7.3 Release](https://symfony.com/blog/category/releases)
- Symfony — [AssetMapper Component](https://symfony.com/doc/current/frontend/asset_mapper.html)
- Doctrine — [Doctrine ORM 3](https://www.doctrine-project.org/)
- Mercure — [mercure.rocks](https://mercure.rocks/)
- FrankenPHP — [frankenphp.dev](https://frankenphp.dev/)
- FrankenPHP — [Worker mode docs](https://frankenphp.dev/docs/worker/)
- Caddy — [caddyserver.com](https://caddyserver.com/)
- Laravel Octane — [Octane docs](https://laravel.com/docs/12.x/octane)
- RoadRunner — [roadrunner.dev](https://roadrunner.dev/)
- Spiral — [spiral.dev](https://spiral.dev/)
- Hyperf — [hyperf.io](https://hyperf.io/)
- Yii — [yiiframework.com](https://www.yiiframework.com/)
- Phalcon — [phalcon.io](https://phalcon.io/)
- Livewire — [livewire.laravel.com](https://livewire.laravel.com/)
- Inertia.js — [inertiajs.com](https://inertiajs.com/)
- Filament — [filamentphp.com](https://filamentphp.com/)
- Statamic — [statamic.com](https://statamic.com/)
- Pest — [pestphp.com](https://pestphp.com/)
- PHPUnit — [phpunit.de](https://phpunit.de/)
- PHPStan — [phpstan.org](https://phpstan.org/)
- Larastan — [GitHub larastan/larastan](https://github.com/larastan/larastan)
- Psalm — [psalm.dev](https://psalm.dev/)
- Rector — [getrector.com](https://getrector.com/)
- Laravel Sail — [Sail docs](https://laravel.com/docs/12.x/sail)
- Laravel Forge — [forge.laravel.com](https://forge.laravel.com/)
- Laravel Vapor — [vapor.laravel.com](https://vapor.laravel.com/)
- Laravel Cloud — [cloud.laravel.com](https://cloud.laravel.com/)
- AdminerEvo — [adminerevo.org](https://www.adminerevo.org/)
- PHPerKaigi — [phperkaigi.jp](https://phperkaigi.jp/)
- PHP Conference Japan — [phpcon.php.gr.jp](https://phpcon.php.gr.jp/)
- pixiv inside (PHP migration cases) — [inside.pixiv.blog](https://inside.pixiv.blog/)
- 우아한형제들 기술 블로그 — [techblog.woowahan.com](https://techblog.woowahan.com/)
- 카카오 테크 — [tech.kakao.com](https://tech.kakao.com/)
- Bref (PHP on AWS Lambda) — [bref.sh](https://bref.sh/)
- 인프콘(INFCON) 2025 발표 자료 — [infcon.kr](https://infcon.kr/)
현재 단락 (1/450)
매년 “PHP는 죽었다”는 글이 트렌딩에 오른다. 그리고 매년 그 글을 받친 서버는 PHP로 돌아간다. Wikipedia, Slack의 일부, Facebook의 PHP 변종 Hac...