likes
comments
collection
share

PHP1长什么样能做什么

作者站长头像
站长
· 阅读数 8

PHP1长什么样能做什么

有一次下载PHP的历史版本时,发现了这个叫“PHP Museum”的入口。点进去一看,里面竟然保存着一个PHPv1的压缩包php-108.tar.gz

PHP1长什么样能做什么

虽然很好奇这么老的版本都实现了哪些功能,但一看里面文件的创建时间,最早的是Jun 11 1995,就感觉不太好让它跑起来。要找一个95年前后的Linux发行版本就要找半天,好不容易下载下来了VirtualBox等虚拟机软件还不一定支持,就算装上了还没法用yum/apt这样的包管理工具……总之很麻烦。之前捣鼓sqlite的早期版本时就折腾了好长时间,最后用的是Redhat7 + Vmware Player。

今天在Ubuntu 18.04.5 LTS上试着编译了一下,没想到竟然一次通过了。

下面就来看看如何编译PHP 1.0.8,配置Apache,并运行phpl.cgi

PHP 1.0.8编译后会生成4个工具(cgi脚本),phpl.cgi是其中之一,另外3个是phpf.cgiphplview.cgiphplmon.cgi

安装、编译和配置

视频🎬 【编译PHP 1.0.8,配置Apache】 www.bilibili.com/video/BV1jm…

Apache

首先安装Apache,因为Nginx好像不支持cgi。

sudo -s
apt install -y make gcc
apt install -y apache2

开启cgi模块,

cd /etc/apache2/mods-enabled/
ln -s ../mods-available/cgi.load

编辑Apache默认站点配置,

vim /etc/apache2/sites-enabled/000-default.conf

去掉Include conf-available/serve-cgi-bin.conf这一行的注释。

/etc/apache2/conf-available/serve-cgi-bin.conf中的配置项目ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/可知,cgi脚本要放到/usr/lib/cgi-bin/中。

Apache配置完成,重启,

service apache2 restart

PHP 1.0.8

接下来下载PHP 1.0.8,

wget "https://museum.php.net/php1/php-108.tar.gz"
tar zxf php-108.tar.gz
cd php

下载并解压缩后,就可以按照README中的步骤编译了。

在编译前,需要将config.h中的

/* #define ROOTDIR "/usr/somewhere/user_id/public_html" */

改为实际的主目录,Apache默认站点的主目录是/var/www/html/。此外,还需要在主目录中创建一个logs目录。

mkdir -p /var/www/html/logs
chmod 0777 /var/www/html/logs/

一切就绪,输入make开始编译。

可以暂时忽略编译过程中的报错,现在得到了4个cgi文件:phpf.cgiphpl.cgiphplmon.cgiphplview.cgi

最后,把这4个文件复制到/var/lib/cgi-bin就大功告成了。

cp *.cgi /usr/lib/cgi-bin/

赶紧用curl测试一下,

curl http://127.0.0.1/cgi-bin/phpl.cgi?version
<html><head><title>PHP Tools Version Information</title></head><body><hr width=400>
<font size=+2><center>PHP Tools Version 1.0.8</center></font><br>
...

如果能看到这样的信息,说明编译成功。

使用phpl.cgi

phpl.cgi的用法和今天的php没有什么差别,都是解析HTML文件中标签,只不过1995年的标签长成<!--$var-->这样。

phpl.cgi支持3种标签的替换:

  • 内置标签,如<!--$today-->, <!--$version-->等,
  • POST请求中的参数,相当于今天的<?php $_POST['param']?>。不知道还有多少PHPer记得register_globals,看来表单中有哪些元素,就有哪些同名的全局变量这一“特点(Bug?)”是与生俱来的,好在PHP社区及时废弃了这个设计,
  • 命令参数,<!--!COMMAND-->相当于今天的`command`

我们可以在/var/www/html/中创建一个测试文件var.html

<ul>
	<li>$today = <!--$today--></li>
	<li>$version = <!--$version--></li>
	<li>$_POST['name'] = <!--$name--></li>
	<li>system load:<pre><!--! w|head -n1 --></pre></li>
</ul>

用curl测试

curl http://127.0.0.1/cgi-bin/phpl.cgi?var.html --data "name=foobar"
<ul>
	<li>$today = 3</li>
	<li>$version = 1.0.8</li>
	<li>$_POST['name'] = foobar</li>
	<li>system load:<pre> 07:44:42 up  1:02,  1 user,  load average: 0.01, 0.01, 0.00
</pre></li>
</ul>
<hr size=3 width=400 align="center"><font size=2><center>Last access at 7:43 on Dec 22 by 127.0.0.1
<br>This page has been accessed a total of <a href="phplmon.cgi"><b>3</b></a> times now! <b>3</b> times today.<br>Page was last updated on Dec 22, 2021 at 7:43.</center></font>

在浏览器中查看

PHP1长什么样能做什么

这里的today不是今天的日期,而是该页面今天被访问了多少次(对比cat /var/www/html/logs/var.cnt的内容)。

phpl.cgi的基本用法就是这样,至于Rasmus当年怎么实现的标签替换,应该也不难找到答案,毕竟PHP 1.0.8的源代码只有3000多行。

参考