Как в 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)
Вы должны поместить новую строку перед текстом в perl в python, но не в php. Один и тот же код на похожих языках имеет такой разный результат?
Почему в Perl и Python вы print()
заголовки, но в PHP вы header()
их?
Почему в php вам не нужно печатать новую строку, чтобы сказать «конец заголовка»?
PHP следует модели обработки «X Server Pages» — два других примера этой парадигмы — ASP и JSP — все в шаблоне — это текст, который нужно записать клиенту, если только он не заключен в специальные теги, которые заставляют механизм PHP выполнять код. Думайте об этих кусках текста как о неявно завернутых печатных выражениях. В общем случае выходные данные буферизуются до тех пор, пока обработка не достигнет конца шаблона, после чего записываются накопленные заголовки, за которыми следует накопленный буфер вывода страницы.
Код Perl, который вы предоставили, является примером программирования CGI, и при использовании сырого Perl или модуля CGI все в этом файле (простая старая программа Perl) является кодом, а результат отправляется клиенту в порядок что написано. Поскольку протокол HTTP говорит, что сначала вы отправляете заголовки, а затем отправляете содержимое страницы, поэтому вам необходимо print
ваши заголовки, перед вами print
содержание вашей страницы.
Так что ваша Perl-программа — это самый низкий уровень обработки, который вы можете получить. Вы делаете все это с нуля, потому что вы используете универсальный язык программирования и не используете никаких модулей, которые предоставляют функциональные возможности веб-обработки более высокого уровня.
PHP, с другой стороны, является программной системой более высокого уровня, специально для генерации HTML-страниц. Поэтому PHP знает, что вам нужны заголовки, а также содержимое (тогда как Perl просто думает, что вы печатаете материал), и ожидает, что вы будете использовать функцию header (), которую он предоставляет.
Я подозреваю, что вы делаете вещи в Python аналогично тому, что вы делаете в Perl.
Других решений пока нет …