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。

bash 复制代码
sudo -s
apt install -y make gcc
apt install -y apache2

开启cgi模块,

bash 复制代码
cd /etc/apache2/mods-enabled/
ln -s ../mods-available/cgi.load

编辑Apache默认站点配置,

bash 复制代码
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,

bash 复制代码
wget "https://museum.php.net/php1/php-108.tar.gz"
tar zxf php-108.tar.gz
cd php

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

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

c 复制代码
/* #define ROOTDIR "/usr/somewhere/user_id/public_html" */

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

bash 复制代码
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就大功告成了。

bash 复制代码
cp *.cgi /usr/lib/cgi-bin/

赶紧用curl测试一下,

xml 复制代码
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,

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测试

xml 复制代码
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多行。

参考

相关推荐
Solara2 分钟前
一个标志位挂了 18 天不落地:它等的重启,2 天 14 小时后就完成了
人工智能·程序员·ai编程
海带紫菜菠萝汤17 分钟前
本周 AI 观察:算力、路由、账本——护城河正搬出模型层
人工智能·ai·程序员·架构·大模型
niucloud-admin26 分钟前
NIUCLOUD LITE AI开发文档--基础开发规范
开发语言·php
ESDWAN2 小时前
为什么跨境网络白天正常、晚上卡顿?如何分析时段性?
linux·网络·php·网络运维
狗凯之家源码网11 小时前
全新 PHP 轻量客服聊天室源码深度评测
开发语言·php·聊天室系统
catchadmin13 小时前
免费可商用 PHP 管理后台 CatchAdmin V5.4.1 发布,新增 MCP 支持
开发语言·php
是真的小外套15 小时前
第13章:网络安全漏洞防护原理与应用
安全·web安全·php
狗凯之家源码网15 小时前
纯 PHP+MySQL 应用市场系统源码实测!
开发语言·mysql·php
高晶15 小时前
ARM 嵌入式 Linux 系统启动流程实战指南
设计模式·程序员
楠风测开15 小时前
MySQL 慢查询 + AI 智能分析
程序员