PHP FastCGI Простой счетчик
Я не могу понять и запустить простой скрипт PHP в режиме FCGI. Я изучаю как Perl, так и PHP, и я получил приведенную ниже версию FastCGI для Perl, чтобы работать как положено.
Счетчик Perl FastCGI:
#!/usr/bin/perl
use FCGI;
$count = 0;
while (FCGI::accept() >= 0) {
print("Content-type: text/html\r\n\r\n",
"<title>FastCGI Hello! (Perl)</title>\n",
"<h1>FastCGI Hello! (Perl)</h1>\n",
"Request number ", $++count,
" running on host <i>$ENV('SERVER_NAME')</i>");
}
При поиске аналога в PHP нашел разговор о "fastcgi_finish_request", но понятия не имею, как выполнить контрпример в PHP, вот что я попробовал:
<?php
header("content-type: text/html");
$counter++;
echo "Counter: $counter ";
//http://www.php.net/manual/en/intro.fpm.php
fastcgi_finish_request(); //If you remove this line, then you will see that the browser has to wait 5 seconds
sleep(5);
?>
3 ответа
Perl не является PHP. Это не должно означать, что вы не можете чаще всего обмениваться вещами и кодом порта между ними, однако, когда дело доходит до сред выполнения, существуют большие различия, которые вы не можете просто поменять местами.
FCGI уже находится на уровне запроса / протокола, который полностью абстрагируется во время выполнения PHP, и поэтому у вас не так много контроля над PHP, как у Perl и use FCGI;
Поэтому вы не можете просто портировать этот код.
Рядом с этим fastcgi_finish_request
совершенно не связан с кодом Perl. Вы, должно быть, перепутали это или бросили это просто удачей, чтобы дать этому попытку. Однако это не очень полезно в контексте контраргумента.
PHP и HTTP не сохраняют состояния. Все данные актуальны только для текущего, текущего запроса. Если вам нужно сохранить состояние, вы можете подумать о сохранении данных в cookie, сессии, кеше или БД.
Таким образом, реализация этого "встречного" примера будет отличаться для PERL и PHP.
Ваше использование fastcgi_finish_request
не принесет функциональность, которую вы ожидаете от PERL. Подумайте о длительных вычислениях, где вы выводите данные посередине. Это можно сделать с помощью fastcgi_finish_request, после чего данные отправляются в браузеры, в то время как долго выполняющиеся задачи продолжают выполняться.
Открытие происходит вместе FASTCGI+PHP. Обычно соединение будет открыто до завершения PHP, затем FASTCGI будет закрыто. За исключением случаев, когда вы достигаете тайм-аут exec PHP (тайм-аут exec) или fastcgi timeout (тайм-аут соединения). fastcgi_finish_request обрабатывает случай, когда подключение fasgi к браузеру закрывается ДО того, как PHP завершит выполнение.
Пример простого счетчика посещений для PHP
<?php
$hit_count = @file_get_contents('count.txt'); // read count from file
$hit_count++; // increment hit count by 1
echo $hit_count; // display
@file_put_contents('count.txt', $hit_count); // store the new hit count
?>
Честно говоря, это даже не то, как вы должны делать это с помощью Perl.
Вместо этого я бы рекомендовал использовать CGI::Session
отслеживать информацию о сеансе:
#!/usr/bin/perl
use strict;
use warnings;
use CGI;
use CGI::Carp qw(fatalsToBrowser);
use CGI::Session;
my $q = CGI->new;
my $session = CGI::Session->new($q) or die CGI->Session->errstr;
print $session->header();
# Page View Count
my $count = 1 + ($session->param('count') // 0);
$session->param('count' => $count);
# HTML
print qq{<html>
<head><title>Hello! (Perl)</title></head>
<body>
<h1>Hello! (Perl)</h1>
<p>Request number $count running on host <i>$ENV{SERVER_NAME}</i></p>
</body>
</html>};
В качестве альтернативы, если вы действительно хотите использовать все возможности, вы можете сохранить локальный файл, как показано в: I still don't get locking. I just want to increment the number in the file. How can I do this?