<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>FrankenPHP 静态构建指南</title>
<link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
<link href="https://fonts.googleapis.com/css2?family=Noto+Sans+SC:wght@300;400;500;700;900&family=Roboto+Mono:wght@400;500&display=swap" rel="stylesheet">
<style>
:root {
--primary-color: #2563eb;
--secondary-color: #7c3aed;
--accent-color: #06b6d4;
--surface-color: #ffffff;
--background-color: #f8fafc;
--text-primary: #1e293b;
--text-secondary: #64748b;
--code-bg: #1e293b;
--success-color: #10b981;
--warning-color: #f59e0b;
}
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: 'Noto Sans SC', sans-serif;
background-color: var(--background-color);
color: var(--text-primary);
display: flex;
justify-content: center;
min-height: 100vh;
}
.poster-container {
width: 720px;
min-height: 960px;
background-color: var(--surface-color);
position: relative;
overflow: hidden;
display: flex;
flex-direction: column;
}
/* Header Section */
.header {
background: linear-gradient(135deg, var(--primary-color) 0%, var(--secondary-color) 100%);
padding: 60px 40px 40px;
color: white;
position: relative;
border-bottom-left-radius: 40px;
border-bottom-right-radius: 40px;
margin-bottom: 30px;
z-index: 1;
}
.header::before {
content: '';
position: absolute;
top: -50%;
right: -20%;
width: 400px;
height: 400px;
background: radial-gradient(circle, rgba(255,255,255,0.1) 0%, rgba(255,255,255,0) 70%);
border-radius: 50%;
}
.logo-container {
display: flex;
align-items: center;
gap: 20px;
margin-bottom: 20px;
}
.main-logo {
width: 64px;
height: 64px;
border-radius: 16px;
background: rgba(255,255,255,0.2);
backdrop-filter: blur(10px);
padding: 10px;
display: flex;
align-items: center;
justify-content: center;
box-shadow: 0 8px 32px rgba(0,0,0,0.1);
}
.main-logo img {
width: 100%;
height: auto;
filter: brightness(0) invert(1);
}
.title-group {
flex: 1;
}
.main-title {
font-size: 48px;
font-weight: 900;
line-height: 1.1;
letter-spacing: -1px;
margin-bottom: 8px;
text-shadow: 0 2px 10px rgba(0,0,0,0.2);
}
.subtitle {
font-size: 22px;
font-weight: 400;
opacity: 0.95;
letter-spacing: 0.5px;
}
/* Content Body */
.content-body {
padding: 0 40px 40px;
flex: 1;
display: flex;
flex-direction: column;
gap: 24px;
}
/* Intro Card */
.intro-card {
background: white;
border-radius: 20px;
padding: 24px;
border: 1px solid #e2e8f0;
box-shadow: 0 4px 20px rgba(0,0,0,0.03);
display: flex;
align-items: flex-start;
gap: 20px;
}
.intro-icon {
background: #eff6ff;
color: var(--primary-color);
width: 56px;
height: 56px;
border-radius: 16px;
display: flex;
align-items: center;
justify-content: center;
flex-shrink: 0;
}
.intro-text h3 {
font-size: 20px;
font-weight: 700;
color: var(--primary-color);
margin-bottom: 8px;
}
.intro-text p {
font-size: 16px;
line-height: 1.6;
color: var(--text-secondary);
}
/* Comparison Section */
.section-title {
font-size: 24px;
font-weight: 800;
color: var(--text-primary);
margin-bottom: 16px;
display: flex;
align-items: center;
gap: 10px;
}
.section-title i {
color: var(--secondary-color);
}
.comparison-grid {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 20px;
}
.compare-card {
background: white;
border-radius: 20px;
padding: 24px;
position: relative;
overflow: hidden;
border: 1px solid #e2e8f0;
transition: all 0.3s ease;
height: 100%;
display: flex;
flex-direction: column;
}
.compare-card.recommended {
border: 2px solid var(--secondary-color);
box-shadow: 0 8px 30px rgba(124, 58, 237, 0.15);
}
.recommend-badge {
position: absolute;
top: 0;
right: 0;
background: var(--secondary-color);
color: white;
padding: 6px 12px;
font-size: 12px;
font-weight: 700;
border-bottom-left-radius: 12px;
}
.card-header {
display: flex;
align-items: center;
gap: 12px;
margin-bottom: 16px;
}
.card-icon {
width: 48px;
height: 48px;
border-radius: 12px;
display: flex;
align-items: center;
justify-content: center;
font-size: 24px;
color: white;
}
.musl-icon {
background: linear-gradient(135deg, #64748b, #475569);
}
.glibc-icon {
background: linear-gradient(135deg, #7c3aed, #5b21b6);
}
.card-title {
font-size: 18px;
font-weight: 700;
color: var(--text-primary);
}
.feature-list {
list-style: none;
flex: 1;
}
.feature-list li {
display: flex;
align-items: flex-start;
gap: 8px;
font-size: 14px;
color: var(--text-secondary);
margin-bottom: 10px;
line-height: 1.4;
}
.feature-list li i {
font-size: 18px;
margin-top: 2px;
}
.check {
color: var(--success-color);
}
.cross {
color: #ef4444;
}
.warn {
color: var(--warning-color);
}
/* Quick Start */
.quick-start {
background: #0f172a;
border-radius: 20px;
padding: 24px;
position: relative;
overflow: hidden;
}
.quick-start::before {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
height: 4px;
background: linear-gradient(90deg, var(--primary-color), var(--accent-color));
}
.code-header {
display: flex;
align-items: center;
gap: 8px;
margin-bottom: 16px;
}
.code-dot {
width: 12px;
height: 12px;
border-radius: 50%;
background: #475569;
}
.code-dot.red { background: #ef4444; }
.code-dot.yellow { background: #f59e0b; }
.code-dot.green { background: #10b981; }
.code-content {
font-family: 'Roboto Mono', monospace;
font-size: 13px;
color: #cbd5e1;
line-height: 1.8;
}
.code-comment {
color: #64748b;
}
.code-cmd {
color: #fbbf24;
}
/* Advantages */
.advantages {
display: flex;
gap: 16px;
justify-content: space-between;
}
.adv-item {
flex: 1;
background: #f1f5f9;
border-radius: 16px;
padding: 20px 16px;
text-align: center;
}
.adv-icon {
font-size: 32px;
color: var(--primary-color);
margin-bottom: 12px;
}
.adv-title {
font-size: 15px;
font-weight: 700;
color: var(--text-primary);
margin-bottom: 6px;
}
.adv-desc {
font-size: 12px;
color: var(--text-secondary);
line-height: 1.4;
}
/* Footer */
.footer {
text-align: center;
padding: 20px;
color: var(--text-secondary);
font-size: 13px;
margin-top: auto;
display: flex;
align-items: center;
justify-content: center;
gap: 8px;
}
.footer i {
font-size: 16px;
}
</style>
</head>
<body>
<div class="poster-container">
<!-- Header -->
<div class="header">
<div class="logo-container">
<div class="main-logo">
<i class="material-icons" style="font-size: 36px; color: white;">bolt</i>
</div>
<div class="title-group">
<h1 class="main-title">FrankenPHP<br>静态构建</h1>
</div>
</div>
<p class="subtitle">创建可移植的 PHP 二进制文件</p>
</div>
<div class="content-body">
<!-- Intro -->
<div class="intro-card">
<div class="intro-icon">
<i class="material-icons">architecture</i>
</div>
<div class="intro-text">
<h3>核心概念</h3>
<p>利用 <strong>static-php-cli</strong> 项目构建包含 PHP 解释器、Caddy Web 服务器和 FrankenPHP 的独立可执行文件,实现真正的"一次构建,到处运行"。</p>
</div>
</div>
<!-- Comparison -->
<div>
<div class="section-title">
<i class="material-icons">compare_arrows</i>
<span>构建类型对比</span>
</div>
<div class="comparison-grid">
<!-- Musl Card -->
<div class="compare-card">
<div class="card-header">
<div class="card-icon musl-icon">
<i class="material-icons">lock</i>
</div>
<div class="card-title">完全静态</div>
</div>
<ul class="feature-list">
<li><i class="material-icons check">check_circle</i>基于 musl libc</li>
<li><i class="material-icons check">check_circle</i>无任何外部依赖</li>
<li><i class="material-icons check">check_circle</i>可在 Scratch 镜像运行</li>
<li><i class="material-icons cross">cancel</i>不支持动态扩展</li>
</ul>
</div>
<!-- Glibc Card -->
<div class="compare-card recommended">
<div class="recommend-badge">推荐</div>
<div class="card-header">
<div class="card-icon glibc-icon">
<i class="material-icons">extension</i>
</div>
<div class="card-title">基本静态</div>
</div>
<ul class="feature-list">
<li><i class="material-icons check">check_circle</i>基于 glibc</li>
<li><i class="material-icons check">check_circle</i>支持动态加载扩展</li>
<li><i class="material-icons warn">warning</i>需要 glibc 环境</li>
<li><i class="material-icons check">check_circle</i>适合生产环境</li>
</ul>
</div>
</div>
</div>
<!-- Quick Start -->
<div>
<div class="section-title">
<i class="material-icons">terminal</i>
<span>快速开始</span>
</div>
<div class="quick-start">
<div class="code-header">
<div class="code-dot red"></div>
<div class="code-dot yellow"></div>
<div class="code-dot green"></div>
</div>
<div class="code-content">
<div><span class="code-comment"># 构建完全静态二进制文件 (Musl)</span></div>
<div>docker buildx bake --load static-builder-musl</div>
<div style="margin-top: 8px;"><span class="code-comment"># 构建支持扩展的版本 (Glibc)</span></div>
<div>docker buildx bake --load static-builder-gnu</div>
</div>
</div>
</div>
<!-- Advantages -->
<div class="advantages">
<div class="adv-item">
<i class="material-icons adv-icon">rocket_launch</i>
<div class="adv-title">高性能</div>
<div class="adv-desc">内置 Worker 模式<br>极速响应</div>
</div>
<div class="adv-item">
<i class="material-icons adv-icon">inventory_2</i>
<div class="adv-title">易于部署</div>
<div class="adv-desc">单文件分发<br>无需配置环境</div>
</div>
<div class="adv-item">
<i class="material-icons adv-icon">tune</i>
<div class="adv-title">灵活配置</div>
<div class="adv-desc">自定义扩展<br>按需编译</div>
</div>
</div>
</div>
<!-- Footer -->
<div class="footer">
<i class="material-icons">language</i>
<span>访问文档了解更多:frankenphp.dev/docs/static/</span>
</div>
</div>
</body>
</html>
登录后可参与表态
讨论回复
0 条回复还没有人回复,快来发表你的看法吧!