📄 本篇一句话
静态网站像发传单(人人同一份),动态网站像柜台服务(见人下菜碟)——CGI 是两者之间的历史分水岭:让 Web 服务器第一次能调用外部程序现做内容。
📝 在本章的位置
上游:6-1 的 HTTP 一问一答、6-4 的会话认人;树莓派课 5-1~5-3 已经在真机上把「Apache+PHP+MariaDB」的动态网站三件套亲手搭过一遍。下游:6-6 的 MVC 是动态网站代码的组织法。
一、静态 Web 网站:照本宣科
服务器硬盘上躺着现成的 .html/.css/.js 文件,谁来要都原样发同一份:
- 优点:快(直接读文件)、便宜、CDN 一缓全球秒开——2026 年大量官网、博客仍走静态,静态站点生成器(Hugo、Astro——W3Techs 增速榜常客)很热。
- 局限:千人一面。想显示「你好,波仔,你有 2 件待办」?做不到——内容是死的。
二、动态 Web 网站:见人下菜
每个请求现做:服务器跑一段程序,查数据库、拼 HTML 再回:
浏览器请求 /todo → 服务器执行程序 → 查数据库 → 拼出「波仔的 2 件待办」→ 回 HTML
- 判断标准不是「页面会动」——JS 让静态页动起来照样静态;动态指内容按请求现生成。
- 主流方案比 CGI 晚一代:PHP(W3Techs 2026:70.2% 的网站服务端语言仍是它,部署惯性惊人)、Python(Flask/Django)、Java、Node.js。
- 数据从哪来?6-10 的 DBMS;代码怎么组织?6-6 的 MVC。
三、CGI:动态化的第一次握手
CGI(Common Gateway Interface,公共网关接口,1993)是服务器与外部程序之间的调用约定:来一个请求 → 启动一个新进程跑脚本 → 脚本把结果打到标准输出 → 服务器转手发回浏览器。
- 开创性:Web 从「文件柜」升级为「可以跑代码的平台」——一切动态网站的老祖宗。
- 致命伤:每请求开一个新进程(进程=最重的执行单位),并发一百人就开一百个进程,服务器扛不住。
- 后继者:把解释器常驻进程内(PHP 的 mod_php、Apache 模块)→ 应用服务器(uWSGI/Gunicorn)→ 反向代理+常驻应用(如今的标配)。CGI 的「约定」思想活着,它的「每请求开进程」做法死了。
动手 Demo:同一台服务器,静态与动态各来一次
# demo_web.py —— 用内置库当一个「迷你 Web 服务器」
from http.server import BaseHTTPRequestHandler, HTTPServer
import datetime
class H(BaseHTTPRequestHandler):
def do_GET(self):
self.send_response(200)
self.send_header("Content-Type", "text/html; charset=utf-8")
self.end_headers()
if self.path == "/static":
self.wfile.write("<h1>静态页:谁来都这行字</h1>".encode())
elif self.path == "/dynamic":
now = datetime.datetime.now().strftime("%H:%M:%S")
self.wfile.write(f"<h1>动态页:这一刻是 {now}</h1>".encode())
HTTPServer(("127.0.0.1", 8000), H).serve_forever()
看到什么算成功:浏览器开 http://127.0.0.1:8000/static 刷新十次,文字一个字不变;开 /dynamic 刷新十次,秒数每秒都变。
读结果:静态路径回的是写死的字符串;动态路径每次请求现算时间现拼 HTML——「动态」的定义如此朴素。
30 秒实验
访问任意新闻网站的文章页,按 Ctrl+S 把页面存下来;明天同一时刻看本地存的这份——广告区、评论区大概率变了(动态),正文一个字没变(静态化的内容)。大多数现代网站是静态动态的混合体。
常见误区
- 「页面上有动画就是动态网站」——动画是前端 JS 干的;判断标准是内容是否按请求现生成(要不要查库、认人)。
- 「CGI 是一种语言」——它不是语言,是服务器与程序之间的调用约定;Perl/Python/C 都能写 CGI 程序。
- 「PHP 过时了」——新项目里热度确实下降,但存量部署 70.2%(W3Techs 2026)仍是服务端第一——世界很大一部分网站仍跑在 WordPress(PHP)上。
自测三问(点击展开)
1. **静态与动态网站的判断标准?** 答:内容是否按请求现生成——静态发死文件,动态跑程序查数据现拼。 2. **CGI 的贡献与死穴?** 答:贡献=让服务器能调外部程序(动态化起点);死穴=每请求开新进程太重,扛不住并发。 3. **2026 年服务端语言部署份额第一是谁?** 答:PHP(约 70%,W3Techs)——部署惯性远大于开发者热度。- ☑ 6-5 完成 —— 传单与柜台:静态/动态/CGI 一条线
- ☐ 下一节 6-6 MVC、MVVM
相关笔记
- 树莓派 5-1 · 架设 Web 服务器 —— 真机上的 Apache 与状态码
- 树莓派 5-2 · PHP 环境 —— 动态网站三件套之二
- Cookie 与会话 —— 动态网站认人的前提
- ⌨️ 编程原理 · 索引 —— 全课路线图