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?

Другие вопросы по тегам