PHP1长什么样能做什么
PHP1长什么样能做什么
有一次下载PHP的历史版本时,发现了这个叫“PHP Museum”的入口。点进去一看,里面竟然保存着一个PHPv1的压缩包php-108.tar.gz。
虽然很好奇这么老的版本都实现了哪些功能,但一看里面文件的创建时间,最早的是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.cgi
、phplview.cgi
、phplmon.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.cgi
、phpl.cgi
、phplmon.cgi
和phplview.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>
在浏览器中查看
这里的today不是今天的日期,而是该页面今天被访问了多少次(对比cat /var/www/html/logs/var.cnt
的内容)。
phpl.cgi
的基本用法就是这样,至于Rasmus当年怎么实现的标签替换,应该也不难找到答案,毕竟PHP 1.0.8的源代码只有3000多行。
参考
- balint-juhasz.medium.com/revive-php-… Revive PHP Tools — A journey to the ‘90s
- blog.lenss.nl/2010/11/com… COMPILING PHP V1.0.8
- www.reddit.com/r/PHP/comme… PHP 1.0 - how was it like and can you still try it today?
转载自:https://juejin.cn/post/7311881316052434978