-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathindex.html
More file actions
322 lines (301 loc) · 31.2 KB
/
index.html
File metadata and controls
322 lines (301 loc) · 31.2 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
<!doctype html>
<html lang="en" x-data="{ dark: window.matchMedia('(prefers-color-scheme: dark)').matches }" :class="dark && 'dark'">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Pretty PHP Info - A modern phpinfo() for humans</title>
<meta name="description" content="A beautiful, searchable replacement for phpinfo(). Query PHP configuration programmatically or browse it in a modern dark-mode UI.">
<!-- Open Graph -->
<meta property="og:type" content="website">
<meta property="og:url" content="https://prettyphpinfo.com/">
<meta property="og:title" content="Pretty PHP Info — A beautiful, searchable replacement for phpinfo()">
<meta property="og:description" content="Search, filter, and query PHP configuration in a modern dark-mode UI. Install via Composer or try instantly with a single curl command.">
<meta property="og:image" content="https://prettyphpinfo.com/og-image.png">
<!-- Twitter -->
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="Pretty PHP Info — A beautiful, searchable replacement for phpinfo()">
<meta name="twitter:description" content="Search, filter, and query PHP configuration in a modern dark-mode UI. Try it with one command.">
<meta name="twitter:image" content="https://prettyphpinfo.com/og-image.png">
<link rel="icon" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -1 100 50'%3E%3Cdefs%3E%3ClinearGradient id='g' x1='0' y1='0' x2='1' y2='1'%3E%3Cstop offset='0%25' stop-color='%236366f1'/%3E%3Cstop offset='100%25' stop-color='%230891b2'/%3E%3C/linearGradient%3E%3C/defs%3E%3Cpath fill='url(%23g)' d='m7.579 10.123 14.204 0c4.169 0.035 7.19 1.237 9.063 3.604 1.873 2.367 2.491 5.6 1.855 9.699-0.247 1.873-0.795 3.71-1.643 5.512-0.813 1.802-1.943 3.427-3.392 4.876-1.767 1.837-3.657 3.003-5.671 3.498-2.014 0.495-4.099 0.742-6.254 0.742l-6.36 0-2.014 10.07-7.367 0 7.579-38.001 0 0m6.201 6.042-3.18 15.9c0.212 0.035 0.424 0.053 0.636 0.053 0.247 0 0.495 0 0.742 0 3.392 0.035 6.219-0.3 8.48-1.007 2.261-0.742 3.781-3.321 4.558-7.738 0.636-3.71 0-5.848-1.908-6.413-1.873-0.565-4.222-0.83-7.049-0.795-0.424 0.035-0.83 0.053-1.219 0.053-0.353 0-0.724 0-1.113 0l0.053-0.053'/%3E%3Cpath fill='url(%23g)' d='m41.093 0 7.314 0-2.067 10.123 6.572 0c3.604 0.071 6.289 0.813 8.056 2.226 1.802 1.413 2.332 4.099 1.59 8.056l-3.551 17.649-7.42 0 3.392-16.854c0.353-1.767 0.247-3.021-0.318-3.763-0.565-0.742-1.784-1.113-3.657-1.113l-5.883-0.053-4.346 21.783-7.314 0 7.632-38.054 0 0'/%3E%3Cpath fill='url(%23g)' d='m70.412 10.123 14.204 0c4.169 0.035 7.19 1.237 9.063 3.604 1.873 2.367 2.491 5.6 1.855 9.699-0.247 1.873-0.795 3.71-1.643 5.512-0.813 1.802-1.943 3.427-3.392 4.876-1.767 1.837-3.657 3.003-5.671 3.498-2.014 0.495-4.099 0.742-6.254 0.742l-6.36 0-2.014 10.07-7.367 0 7.579-38.001 0 0m6.201 6.042-3.18 15.9c0.212 0.035 0.424 0.053 0.636 0.053 0.247 0 0.495 0 0.742 0 3.392 0.035 6.219-0.3 8.48-1.007 2.261-0.742 3.781-3.321 4.558-7.738 0.636-3.71 0-5.848-1.908-6.413-1.873-0.565-4.222-0.83-7.049-0.795-0.424 0.035-0.83 0.053-1.219 0.053-0.353 0-0.724 0-1.113 0l0.053-0.053'/%3E%3C/svg%3E">
<script src="https://cdn.tailwindcss.com"></script>
<script>
tailwind.config = {
darkMode: 'class',
theme: {
extend: {
fontFamily: {
sans: ['Inter', 'system-ui', 'sans-serif'],
mono: ['JetBrains Mono', 'Fira Code', 'ui-monospace', 'monospace'],
}
}
}
}
</script>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet">
<style>
.code-block { background: #0d1117; overflow-x: auto; }
.code-block .keyword { color: #ff7b72; }
.code-block .string { color: #a5d6ff; }
.code-block .function { color: #d2a8ff; }
.code-block .variable { color: #ffa657; }
.code-block .comment { color: #8b949e; }
.code-block .number { color: #79c0ff; }
.code-block .operator { color: #ff7b72; }
.code-block .class { color: #7ee787; }
.code-block div { white-space: nowrap; }
[x-cloak] { display: none !important; }
</style>
<script defer src="https://cdn.jsdelivr.net/npm/alpinejs@3/dist/cdn.min.js"></script>
</head>
<body class="bg-white dark:bg-[#09090b] text-slate-600 dark:text-slate-300 antialiased overflow-x-hidden">
<!-- Nav -->
<nav class="fixed top-0 w-full z-50 border-b border-slate-200 dark:border-white/5 bg-white/80 dark:bg-[#09090b]/80 backdrop-blur-lg">
<div class="max-w-6xl mx-auto px-3 sm:px-6 h-12 sm:h-16 flex items-center justify-between min-w-0">
<span class="text-slate-900 dark:text-white font-light text-base sm:text-xl tracking-tight shrink-0">Pretty PHP Info</span>
<div class="flex items-center gap-4 sm:gap-6 shrink-0">
<a href="https://github.com/stechstudio/phpinfo" class="hidden sm:inline text-sm text-slate-500 dark:text-slate-400 hover:text-slate-900 dark:hover:text-white transition-colors">GitHub</a>
<a href="https://packagist.org/packages/stechstudio/phpinfo" class="hidden sm:inline text-sm text-slate-500 dark:text-slate-400 hover:text-slate-900 dark:hover:text-white transition-colors">Packagist</a>
<button @click="dark = !dark; document.documentElement.classList.toggle('dark', dark)" class="p-1.5 text-slate-400 hover:text-slate-700 dark:hover:text-white rounded-lg transition-colors" title="Toggle theme">
<svg x-show="dark" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="w-4 h-4"><path stroke-linecap="round" stroke-linejoin="round" d="M12 3v2.25m6.364.386l-1.591 1.591M21 12h-2.25m-.386 6.364l-1.591-1.591M12 18.75V21m-4.773-4.227l-1.591 1.591M5.25 12H3m4.227-4.773L5.636 5.636M15.75 12a3.75 3.75 0 11-7.5 0 3.75 3.75 0 017.5 0z" /></svg>
<svg x-cloak x-show="!dark" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="w-4 h-4"><path stroke-linecap="round" stroke-linejoin="round" d="M21.752 15.002A9.72 9.72 0 0118 15.75c-5.385 0-9.75-4.365-9.75-9.75 0-1.33.266-2.597.748-3.752A9.753 9.753 0 003 11.25C3 16.635 7.365 21 12.75 21a9.753 9.753 0 009.002-5.998z" /></svg>
</button>
<a href="https://github.com/stechstudio/phpinfo" class="text-xs sm:text-sm font-medium text-slate-700 dark:text-white bg-slate-100 dark:bg-white/10 hover:bg-slate-200 dark:hover:bg-white/15 px-3 sm:px-4 py-1.5 rounded-lg transition-colors whitespace-nowrap">Get Started</a>
</div>
</div>
</nav>
<!-- Hero background -->
<div class="relative overflow-hidden">
<!-- Gradient glow (positioned by the composer line element below) -->
<!-- Dot pattern -->
<div class="absolute inset-0" style="background-image: radial-gradient(circle, rgb(148 163 184 / 0.15) 1px, transparent 1px); background-size: 24px 24px;"></div>
<!-- Hero -->
<section class="relative pt-28 sm:pt-40 pb-8 px-4 sm:px-6">
<div class="max-w-4xl mx-auto text-center">
<div class="inline-flex items-center gap-2 text-xs sm:text-sm text-slate-500 dark:text-slate-400 border border-slate-200 dark:border-white/10 rounded-full px-3 sm:px-4 py-1.5 mb-6 sm:mb-8">
<span class="w-2 h-2 rounded-full bg-emerald-500 shrink-0"></span>
<span>PHP 8.3+ · <span class="hidden sm:inline">Works with </span>any framework or plain PHP</span>
</div>
<h1 class="text-4xl sm:text-5xl md:text-7xl font-bold tracking-tight text-slate-900 dark:text-white leading-[1.1] mb-5 sm:mb-6">
A prettier<br><span class="text-indigo-600 dark:text-transparent dark:bg-clip-text dark:bg-gradient-to-r dark:from-indigo-400 dark:to-cyan-400">phpinfo()</span>
</h1>
<p class="text-base sm:text-lg md:text-xl text-slate-500 dark:text-slate-400 max-w-2xl mx-auto mb-8 sm:mb-10 leading-relaxed">
Parse, query, and display your PHP configuration with a clean API and a modern, searchable interface. Drop-in replacement for the default phpinfo() page.
</p>
<div class="relative flex justify-center mb-4">
<div class="absolute left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2 w-[800px] h-[600px] rounded-full blur-3xl pointer-events-none dark:hidden" style="background: radial-gradient(ellipse at center, rgb(199 210 254 / 0.55) 0%, transparent 70%)"></div>
<div class="absolute left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2 w-[800px] h-[600px] rounded-full blur-3xl pointer-events-none hidden dark:block" style="background: radial-gradient(ellipse at center, rgb(99 102 241 / 0.065) 0%, transparent 70%)"></div>
<div class="relative font-mono text-xs sm:text-sm bg-slate-50 dark:bg-white/5 border border-slate-200 dark:border-white/10 rounded-lg px-4 sm:px-5 py-3 text-slate-700 dark:text-slate-300">
composer require <span class="text-indigo-600 dark:text-cyan-400">stechstudio/phpinfo</span>
</div>
</div>
</div>
</section>
<!-- Screenshot -->
<section class="relative px-4 sm:px-6 pb-16 sm:pb-24">
<div class="max-w-5xl mx-auto">
<div class="rounded-lg sm:rounded-xl overflow-hidden border border-slate-200 dark:border-white/10 shadow-xl dark:shadow-none dark:drop-shadow-[0_0_80px_rgba(99,102,241,0.15)]">
<img x-show="dark" src="screenshot-dark.png" alt="Pretty PHP Info dark mode interface" class="w-full">
<img x-cloak x-show="!dark" src="screenshot-light.png" alt="Pretty PHP Info light mode interface" class="w-full">
</div>
</div>
</section>
</div>
<!-- Two-column features -->
<section class="px-4 sm:px-6 pb-16 sm:pb-24">
<div class="max-w-6xl mx-auto">
<div class="text-center mb-10 sm:mb-16">
<h2 class="text-2xl sm:text-3xl md:text-4xl font-bold text-slate-900 dark:text-white tracking-tight mb-3 sm:mb-4">Two ways to use it</h2>
<p class="text-slate-500 dark:text-slate-400 text-base sm:text-lg">A beautiful browser UI and a powerful programmatic API. Same package.</p>
</div>
<div class="grid md:grid-cols-2 gap-4 sm:gap-6">
<!-- Browser UI -->
<div class="bg-slate-50 dark:bg-white/[0.03] border border-slate-200 dark:border-white/10 rounded-xl p-5 sm:p-8 min-w-0">
<div class="text-xs font-medium uppercase tracking-wider text-indigo-600 dark:text-indigo-400 mb-2 sm:mb-3">Browser</div>
<h3 class="text-lg sm:text-xl font-semibold text-slate-900 dark:text-white mb-2 sm:mb-3">Drop-in phpinfo() replacement</h3>
<p class="text-slate-500 dark:text-slate-400 text-sm leading-relaxed mb-5 sm:mb-6">
One line of code gives you a searchable, responsive, dark-mode-ready interface. Sidebar navigation, keyboard shortcuts, click-to-copy values. Zero external requests — everything is self-contained.
</p>
<div class="code-block rounded-lg p-4 sm:p-5 font-mono text-xs sm:text-sm leading-relaxed">
<div><span class="comment">// Replace your phpinfo() call</span></div>
<div class="mt-1"><span class="function">prettyphpinfo</span>();</div>
<div class="mt-3"><span class="comment">// Or exclude env vars for security</span></div>
<div><span class="function">prettyphpinfo</span>(<span class="variable">INFO_MODULES</span>);</div>
</div>
</div>
<!-- Programmatic API -->
<div class="bg-slate-50 dark:bg-white/[0.03] border border-slate-200 dark:border-white/10 rounded-xl p-5 sm:p-8 min-w-0">
<div class="text-xs font-medium uppercase tracking-wider text-cyan-600 dark:text-cyan-400 mb-2 sm:mb-3">Programmatic</div>
<h3 class="text-lg sm:text-xl font-semibold text-slate-900 dark:text-white mb-2 sm:mb-3">Query anything in your PHP config</h3>
<p class="text-slate-500 dark:text-slate-400 text-sm leading-relaxed mb-5 sm:mb-6">
Structured data model with a fluent, iterable API. Look up modules, configs, directives — with local and master values. Parse saved phpinfo output from any source.
</p>
<div class="code-block rounded-lg p-4 sm:p-5 font-mono text-xs sm:text-sm leading-relaxed">
<div><span class="variable">$info</span> = <span class="class">Info</span><span class="operator">::</span><span class="function">capture</span>();</div>
<div class="mt-2"><span class="variable">$info</span><span class="operator">-></span><span class="function">version</span>(); <span class="comment">// "8.5.4"</span></div>
<div><span class="variable">$info</span><span class="operator">-></span><span class="function">hasModule</span>(<span class="string">'curl'</span>); <span class="comment">// true</span></div>
<div><span class="variable">$info</span><span class="operator">-></span><span class="function">config</span>(<span class="string">'memory_limit'</span>); <span class="comment">// "128M"</span></div>
</div>
</div>
</div>
</div>
</section>
<!-- Code examples -->
<section class="px-4 sm:px-6 pb-16 sm:pb-24">
<div class="max-w-6xl mx-auto">
<div class="text-center mb-10 sm:mb-16">
<h2 class="text-2xl sm:text-3xl md:text-4xl font-bold text-slate-900 dark:text-white tracking-tight mb-3 sm:mb-4">Clean, expressive API</h2>
<p class="text-slate-500 dark:text-slate-400 text-base sm:text-lg">Everything you need to inspect PHP configuration, nothing you don't.</p>
</div>
<div class="grid md:grid-cols-2 gap-4 sm:gap-6">
<div class="bg-slate-50 dark:bg-white/[0.03] border border-slate-200 dark:border-white/10 rounded-xl overflow-hidden min-w-0 flex flex-col">
<div class="px-4 sm:px-5 py-3 border-b border-slate-200 dark:border-white/5 text-xs font-medium text-slate-500">Check modules and configs</div>
<div class="code-block p-4 sm:p-5 font-mono text-xs sm:text-sm leading-relaxed flex-1">
<div><span class="variable">$info</span> = <span class="class">Info</span><span class="operator">::</span><span class="function">capture</span>();</div>
<div class="mt-3"><span class="comment">// Check for extensions</span></div>
<div><span class="variable">$info</span><span class="operator">-></span><span class="function">hasModule</span>(<span class="string">'redis'</span>); <span class="comment">// true</span></div>
<div class="mt-3"><span class="comment">// Get any config value</span></div>
<div><span class="variable">$info</span><span class="operator">-></span><span class="function">config</span>(<span class="string">'max_file_uploads'</span>); <span class="comment">// "20"</span></div>
<div><span class="variable">$info</span><span class="operator">-></span><span class="function">config</span>(<span class="string">'max_file_uploads'</span>, <span class="string">'master'</span>); <span class="comment">// "100"</span></div>
<div class="mt-3"><span class="comment">// Dig into a specific module</span></div>
<div><span class="variable">$info</span><span class="operator">-></span><span class="function">module</span>(<span class="string">'curl'</span>)<span class="operator">-></span><span class="function">config</span>(<span class="string">'version'</span>); <span class="comment">// "8.7.1"</span></div>
<div class="mt-3"><span class="comment">// Convenience methods</span></div>
<div><span class="variable">$info</span><span class="operator">-></span><span class="function">os</span>(); <span class="comment">// "Linux"</span></div>
<div><span class="variable">$info</span><span class="operator">-></span><span class="function">hostname</span>(); <span class="comment">// "web-01"</span></div>
</div>
</div>
<div class="bg-slate-50 dark:bg-white/[0.03] border border-slate-200 dark:border-white/10 rounded-xl overflow-hidden min-w-0 flex flex-col">
<div class="px-4 sm:px-5 py-3 border-b border-slate-200 dark:border-white/5 text-xs font-medium text-slate-500">Iterate and explore</div>
<div class="code-block p-4 sm:p-5 font-mono text-xs sm:text-sm leading-relaxed flex-1">
<div><span class="comment">// Iterate all modules</span></div>
<div><span class="variable">$info</span><span class="operator">-></span><span class="function">modules</span>()<span class="operator">-></span><span class="function">each</span>(<span class="keyword">function</span>(<span class="variable">$module</span>) {</div>
<div> <span class="variable">$module</span><span class="operator">-></span><span class="function">name</span>();</div>
<div> <span class="variable">$module</span><span class="operator">-></span><span class="function">configs</span>()<span class="operator">-></span><span class="function">count</span>();</div>
<div>});</div>
<div class="mt-3"><span class="comment">// Flatten all configs across modules</span></div>
<div><span class="variable">$info</span><span class="operator">-></span><span class="function">configs</span>()<span class="operator">-></span><span class="function">count</span>(); <span class="comment">// 342</span></div>
<div><span class="variable">$info</span><span class="operator">-></span><span class="function">configs</span>()<span class="operator">-></span><span class="function">filter</span>(<span class="keyword">fn</span>(<span class="variable">$c</span>) <span class="operator">=></span> ...);</div>
<div class="mt-3"><span class="comment">// Parse saved output from any source</span></div>
<div><span class="class">Info</span><span class="operator">::</span><span class="function">fromHtml</span>(<span class="variable">$saved</span>);</div>
<div><span class="class">Info</span><span class="operator">::</span><span class="function">fromText</span>(<span class="variable">$cliOutput</span>);</div>
<div><span class="class">Info</span><span class="operator">::</span><span class="function">detect</span>(<span class="variable">$anything</span>);</div>
</div>
</div>
</div>
</div>
</section>
<!-- Features grid -->
<section class="px-4 sm:px-6 pb-16 sm:pb-24">
<div class="max-w-6xl mx-auto">
<div class="grid grid-cols-2 lg:grid-cols-3 gap-3 sm:gap-6">
<div class="p-4 sm:p-6 rounded-xl border border-slate-200 dark:border-white/5 bg-slate-50 dark:bg-white/[0.02]">
<div class="text-slate-900 dark:text-white font-medium text-sm sm:text-base mb-1 sm:mb-2">Instant search</div>
<p class="text-xs sm:text-sm text-slate-500 leading-relaxed">Filter across all modules and configs as you type. Press <kbd class="text-xs border border-slate-300 dark:border-white/10 rounded px-1 py-0.5 text-slate-500 dark:text-slate-400">/</kbd> to focus.</p>
</div>
<div class="p-4 sm:p-6 rounded-xl border border-slate-200 dark:border-white/5 bg-slate-50 dark:bg-white/[0.02]">
<div class="text-slate-900 dark:text-white font-medium text-sm sm:text-base mb-1 sm:mb-2">Dark mode</div>
<p class="text-xs sm:text-sm text-slate-500 leading-relaxed">Follows system preference with a manual toggle. Persists your choice across sessions.</p>
</div>
<div class="p-4 sm:p-6 rounded-xl border border-slate-200 dark:border-white/5 bg-slate-50 dark:bg-white/[0.02]">
<div class="text-slate-900 dark:text-white font-medium text-sm sm:text-base mb-1 sm:mb-2">Click to copy</div>
<p class="text-xs sm:text-sm text-slate-500 leading-relaxed">Hover any config value to reveal a copy button. Works on HTTP and HTTPS.</p>
</div>
<div class="p-4 sm:p-6 rounded-xl border border-slate-200 dark:border-white/5 bg-slate-50 dark:bg-white/[0.02]">
<div class="text-slate-900 dark:text-white font-medium text-sm sm:text-base mb-1 sm:mb-2">Deep linking</div>
<p class="text-xs sm:text-sm text-slate-500 leading-relaxed">Every module, group, and config has a unique URL hash. Link directly to any directive.</p>
</div>
<div class="p-4 sm:p-6 rounded-xl border border-slate-200 dark:border-white/5 bg-slate-50 dark:bg-white/[0.02]">
<div class="text-slate-900 dark:text-white font-medium text-sm sm:text-base mb-1 sm:mb-2">Self-contained</div>
<p class="text-xs sm:text-sm text-slate-500 leading-relaxed">All CSS and JS are inlined. No CDN requests, no external dependencies. Works air-gapped.</p>
</div>
<div class="p-4 sm:p-6 rounded-xl border border-slate-200 dark:border-white/5 bg-slate-50 dark:bg-white/[0.02]">
<div class="text-slate-900 dark:text-white font-medium text-sm sm:text-base mb-1 sm:mb-2">Dual parser</div>
<p class="text-xs sm:text-sm text-slate-500 leading-relaxed">Parses both HTML (web) and plaintext (CLI) phpinfo() output. Auto-detects the format.</p>
</div>
</div>
</div>
</section>
<!-- Why not ini_get? -->
<section class="px-4 sm:px-6 pb-16 sm:pb-24">
<div class="max-w-6xl mx-auto">
<div class="grid md:grid-cols-2 gap-8 sm:gap-12 items-start">
<!-- Left: problem statement -->
<div>
<div class="text-xs font-medium uppercase tracking-wider text-indigo-600 dark:text-indigo-400 mb-2 sm:mb-3">Why a package?</div>
<h2 class="text-2xl sm:text-3xl md:text-4xl font-bold text-slate-900 dark:text-white tracking-tight mb-4 sm:mb-6">Can't I just use <code class="font-mono text-[0.85em]">ini_get()</code>?</h2>
<div class="space-y-4 text-sm sm:text-base text-slate-500 dark:text-slate-400 leading-relaxed">
<p>PHP configuration is scattered across a handful of narrow functions. <code class="text-slate-700 dark:text-slate-300 text-[0.85em]">ini_get()</code> returns one value at a time. <code class="text-slate-700 dark:text-slate-300 text-[0.85em]">extension_loaded()</code> gives you a boolean. <code class="text-slate-700 dark:text-slate-300 text-[0.85em]">phpversion()</code> and <code class="text-slate-700 dark:text-slate-300 text-[0.85em]">php_uname()</code> each return a single string.</p>
<p>Every one of these requires you to know exactly what you're looking for. There's no way to discover, iterate, or search.</p>
<p>And even combined, they can't give you everything. Compile options, Zend extension internals, stream wrappers, registered filters, and per-extension metadata are only available through <code class="text-slate-700 dark:text-slate-300 text-[0.85em]">phpinfo()</code>.</p>
<p class="text-slate-700 dark:text-slate-300"><code class="text-[0.85em]">phpinfo()</code> is the only function with the complete picture. This package makes that data actually usable.</p>
</div>
</div>
<!-- Right: comparison -->
<div class="space-y-4 sm:space-y-5">
<div class="bg-slate-50 dark:bg-white/[0.03] border border-slate-200 dark:border-white/10 rounded-xl overflow-hidden">
<div class="px-4 sm:px-5 py-3 border-b border-slate-200 dark:border-white/5 text-xs font-medium text-slate-400">Without this package</div>
<div class="code-block p-4 sm:p-5 font-mono text-xs sm:text-sm leading-relaxed">
<div><span class="function">ini_get</span>(<span class="string">'memory_limit'</span>); <span class="comment">// local value only</span></div>
<div><span class="function">extension_loaded</span>(<span class="string">'redis'</span>); <span class="comment">// just true/false</span></div>
<div><span class="function">get_loaded_extensions</span>(); <span class="comment">// names, no config</span></div>
<div><span class="function">phpversion</span>(); <span class="comment">// just the version</span></div>
<div><span class="function">php_uname</span>(); <span class="comment">// just the OS</span></div>
<div class="mt-2"><span class="comment">// compile flags? stream wrappers?</span></div>
<div><span class="comment">// master vs local values?</span></div>
<div><span class="comment">// iterate all config? ...nope.</span></div>
</div>
</div>
<div class="bg-slate-50 dark:bg-white/[0.03] border border-slate-200 dark:border-white/10 rounded-xl overflow-hidden ring-1 ring-indigo-500/20 dark:ring-indigo-400/10">
<div class="px-4 sm:px-5 py-3 border-b border-slate-200 dark:border-white/5 text-xs font-medium text-indigo-600 dark:text-indigo-400">With Pretty PHP Info</div>
<div class="code-block p-4 sm:p-5 font-mono text-xs sm:text-sm leading-relaxed">
<div><span class="variable">$info</span> = <span class="class">Info</span><span class="operator">::</span><span class="function">capture</span>();</div>
<div class="mt-2"><span class="variable">$info</span><span class="operator">-></span><span class="function">config</span>(<span class="string">'memory_limit'</span>); <span class="comment">// local</span></div>
<div><span class="variable">$info</span><span class="operator">-></span><span class="function">config</span>(<span class="string">'memory_limit'</span>, <span class="string">'master'</span>); <span class="comment">// master</span></div>
<div><span class="variable">$info</span><span class="operator">-></span><span class="function">hasModule</span>(<span class="string">'redis'</span>); <span class="comment">// check</span></div>
<div><span class="variable">$info</span><span class="operator">-></span><span class="function">module</span>(<span class="string">'redis'</span>)<span class="operator">-></span><span class="function">configs</span>(); <span class="comment">// full detail</span></div>
<div class="mt-2"><span class="comment">// iterate everything, discover anything</span></div>
<div><span class="variable">$info</span><span class="operator">-></span><span class="function">modules</span>()<span class="operator">-></span><span class="function">each</span>(<span class="keyword">fn</span>(<span class="variable">$m</span>) <span class="operator">=></span> ...);</div>
<div><span class="variable">$info</span><span class="operator">-></span><span class="function">configs</span>()<span class="operator">-></span><span class="function">filter</span>(<span class="keyword">fn</span>(<span class="variable">$c</span>) <span class="operator">=></span> ...);</div>
</div>
</div>
</div>
</div>
</div>
</section>
<!-- CTA -->
<section class="px-4 sm:px-6 pb-20 sm:pb-32">
<div class="max-w-2xl mx-auto text-center">
<h2 class="text-2xl sm:text-3xl font-bold text-slate-900 dark:text-white tracking-tight mb-3 sm:mb-4">Get started in seconds</h2>
<p class="text-slate-500 dark:text-slate-400 text-sm sm:text-base mb-6 sm:mb-8">Install with Composer, call one function. That's it.</p>
<div class="code-block rounded-lg border border-slate-200 dark:border-white/10 p-4 sm:p-5 font-mono text-xs sm:text-sm text-left max-w-lg mx-auto leading-relaxed">
<div><span class="comment">// 1. Install</span></div>
<div class="text-slate-400">$ composer require stechstudio/phpinfo</div>
<div class="mt-4"><span class="comment">// 2. Use</span></div>
<div><span class="keyword">require</span> <span class="string">'vendor/autoload.php'</span>;</div>
<div><span class="function">prettyphpinfo</span>();</div>
</div>
</div>
</section>
<!-- Try without installing -->
<section class="px-4 sm:px-6 pb-20 sm:pb-24">
<div class="max-w-2xl mx-auto text-center">
<h3 class="text-lg sm:text-xl font-semibold text-slate-900 dark:text-white tracking-tight mb-2">Just want to try it?</h3>
<p class="text-slate-500 text-xs sm:text-sm mb-5 max-w-lg mx-auto leading-relaxed">No install required. This downloads a small PHP script, runs it locally, and opens a pretty phpinfo page right in your browser. Nothing leaves your machine.</p>
<div class="font-mono text-xs sm:text-sm bg-slate-50 dark:bg-white/5 border border-slate-200 dark:border-white/10 rounded-lg px-4 sm:px-5 py-3 text-slate-600 dark:text-slate-400 inline-block">
curl -sSL prettyphpinfo.com/go | php
</div>
<p class="text-slate-400 dark:text-slate-600 text-xs mt-3">On Windows, use <code class="text-slate-500 dark:text-slate-500">curl.exe</code> instead of <code class="text-slate-500 dark:text-slate-500">curl</code> in PowerShell</p>
</div>
</section>
<!-- Footer -->
<footer class="border-t border-slate-200 dark:border-white/5 py-6 sm:py-8 px-4 sm:px-6">
<div class="max-w-6xl mx-auto flex flex-col sm:flex-row items-center justify-between gap-3 sm:gap-4 text-xs sm:text-sm text-slate-400 dark:text-slate-600">
<div>Built by <a href="https://stechstudio.com" class="text-slate-600 dark:text-slate-400 hover:text-slate-900 dark:hover:text-white transition-colors">Signature Tech Studio</a></div>
<div class="flex gap-6">
<a href="https://github.com/stechstudio/phpinfo" class="hover:text-slate-600 dark:hover:text-slate-400 transition-colors">GitHub</a>
<a href="https://packagist.org/packages/stechstudio/phpinfo" class="hover:text-slate-600 dark:hover:text-slate-400 transition-colors">Packagist</a>
</div>
</div>
</footer>
</body>
</html>