CGI、编程ASP、编程PHP、编程JSP、编程Perl——这些名字放在一起,编程总让人误以为它们是编程同一类东西。但真相是编程,CGI压根不是编程一种语言,它是编程一套协议,一个让Web服务器和外部程序对话的编程古老接口。而ASP(以及后来的编程ASP.NET)是微软家的技术栈,PHP则是编程开源的脚本语言。把它们统称为“Web编程语言”,编程就像把螺丝刀、编程电钻和锤子都叫“钉钉子工具”一样粗暴。编程
1993年,NCSA的Web服务器遇到一个尴尬问题:HTML页面是死的,用户提交个表单,服务器只能把数据存进日志文件,连个反馈都写不回去。于是CGI(Common Gateway Interface)诞生了。它不规定你用哪种语言,C、Perl、Shell脚本都行,只要遵守标准输入输出协议。当年最流行的写法是Perl,因为字符串处理强,还能快速处理表单数据。但CGI有个致命伤——每来一个请求,服务器就得fork一个新进程,跑完就销毁。高并发时服务器直接喘不过气,就像餐厅每来一桌客人都要重新搭个灶台。
微软在1996年推出ASP,目的很明确:让Windows上的IIS服务器能动态生成页面。ASP用VBScript或JScript,把代码嵌在HTML里,用<% %>标签包裹。这设计比CGI聪明,因为IIS能复用线程池,不用每次请求都开新进程。但ASP有个坑——逻辑和显示完全混在一个文件里。我见过一个2000年的老项目,一个index.asp文件有3000行,三分之一是HTML表格,三分之一是VBScript循环,剩下的是SQL字符串拼接。改个页面样式得小心翼翼,生怕碰坏某个Response.Write。
PHP的故事更野。1994年,Rasmus Lerdorf最初写了个Perl脚本统计自己简历的访问量,后来用C重写,加了表单处理和数据库连接功能,就叫“Personal Home Page Tools”。谁也没想到这东西后来能撑起全球80%的网站。PHP的语法糅合了Perl、C和Java的杂烩,但它的核心优势在于部署简单——Apache服务器装个mod_php模块,文件扔进去就能跑。没有CGI的进程开销,也没有ASP的组件注册麻烦。但这也导致PHP代码质量两极分化,WordPress插件里能写出全局变量满天飞的恐怖代码,而Laravel框架又能写出媲美Java的整洁架构。
我早年做过一个外包项目,客户要求“用ASP写个留言板”。我劝他说ASP已经过时了,不如用PHP。他摇头:“我们服务器是Windows的,装不了PHP。”结果我只好用ASP写,每个数据库连接都要手动创建Connection对象,用完还得Close,忘了就内存泄漏。后来换了个Linux服务器,我花两天把代码改成PHP——只改了数据库连接部分,逻辑几乎没动。那一刻我意识到,语言之争根本不重要,重要的是项目生命周期里的维护成本。
现在回头看,CGI是马车,ASP是蒸汽火车,PHP是汽车。马车被淘汰是因为速度,蒸汽火车被淘汰是因为污染,汽车正在被电动车取代。但马车夫转行开汽车,火车司机学驾照——底层逻辑没变:处理HTTP请求,操作数据库,生成HTML。你问我现在该学什么?Python的Flask、Node.js的Express、Go的net/http,本质上都是CGI的进化版——只不过进程换成了协程,Perl换成了现代语言,但那个“接收请求,返回响应”的循环,从1993年到现在就没变过。