php、perl 和 python 中的 HTTP 标头


HTTP headers in php, perl and python

在perl和python中,你必须在页面内容之前打印一些标题(如果需要)和新行。否则会出现错误 - End of script output before headers .

在php中,事情是不同的。每当您打印某些内容(使用 print ""echo "" )时,即使您尝试打印标题,也会将其假定为纯文本。为此(打印标题),您应该使用 header() 函数(在 perl 和 python 中不可用)。
一些例子:

<?php
# this is a plain text in the page, you can use 'echo ""' to get the same result
print "Content-type: text/plain; charset=utf-8'n'n";

#!usr/bin/perl 
# this is a header with two new lines after it (without them you get the error)
print "Content-type: text/plain; charset=utf-8'n'n";
# (the same is in python)

<?php
print "Some text, no headers are sent, no new lines are printed and you get no errors";

#!usr/bin/perl
print "Some text, no headers are sent, no new lines are printed and you get an error.";
# (the same is in python)

在python的perl中,你必须在文本之前放置一个新行,但在php中则不能。相似语言的相同代码会产生如此不同的结果?

为什么在perl和python中你print()标题,而在php中你header()它们?

为什么在 php 中您不必打印新行来表示"标题结尾"?

PHP

遵循"X Server Pages"处理模型 - ASP 和 JSP 是这种范式的另外两个例子 - 模板中的所有内容都是要写入客户端的文本,除非包装在导致 PHP 引擎执行代码的特殊标签中。将这些文本块视为隐式包装的打印语句。通常,输出被缓冲,直到处理到达模板的末尾,此时将写入累积的标头,然后写入累积的页面输出缓冲区。

您提供的Perl代码是CGI

编程的一个示例,使用原始Perl或使用CGI模块,文件中的所有内容(普通的旧Perl程序)都是代码,输出按照写入顺序发送到客户端。由于HTTP协议规定首先发送标题,然后发送页面内容,这就是为什么在print页面内容之前必须print标题的原因。

所以你的Perl程序是你能得到的最低级别的处理。您从头开始完成所有这些工作,因为您使用的是通用编程语言,而不是使用任何打包更高级别 Web 处理功能的模块。

另一方面,PHP是一个更高级别的程序系统,专门用于生成HTML页面。所以PHP知道你需要标题和内容(而Perl只是认为你在打印东西),并希望你使用它提供的header()函数。

我怀疑你在Python中做的事情与你在Perl中做的事情类似。