PHP FastCGI简单计数器

时间:2014-04-27 11:34:20

标签: php perl fastcgi mod-fcgid

我无法理解并在FCGI模式下运行简单的PHP脚本。我正在学习Perl和PHP,下面的Perc版本的FastCGI示例正常工作。

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中搜索类似内容发现了关于&#34; fastcgi_finish_request&#34;但不知道如何 要完成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 个答案:

答案 0 :(得分:1)

Perl不是PHP。这并不意味着你不能经常在两者之间交换东西和端口代码,但是当涉及到运行时环境时,你不能只是交换更大的差异。

FCGI已处于请求/协议级别,已在PHP运行时完全抽象化,因此您在PHP中的控制力不如Perl和use FCGI;

因此,您不能只移植该代码。

旁边的fastcgi_finish_request与Perl代码完全无关。你必须把它弄糊涂或者通过纯粹的运气把它扔进去尝试一下。然而,在这个反例示例中,它并没有真正有用。

答案 1 :(得分:1)

PHP和HTTP是无状态的。 所有数据仅与当前正在进行的请求相关。 如果需要保存状态,可以考虑将数据存储到cookie,session,cache或db中。

所以执行这个&#34;计数器&#34; PERL和PHP的示例会有所不同。

您对fastcgi_finish_request的使用不会带来您期望从PERL获得的功能。 考虑长时间运行的计算,您可以在中间输出数据。 您可以使用fastcgi_finish_request执行此操作,然后将数据推送到浏览器,同时长时间运行的任务继续运行。

FASTCGI + PHP一起开放。 通常连接将在PHP完成之前打开,然后FASTCGI将关闭。 除了达到PHP的exec超时(exec超时)或fastcgi超时(连接超时)。 fastcgi_finish_request处理这种情况,在PHP完成执行之前关闭浏览器的fascgi连接。

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
?>

答案 2 :(得分:0)

老实说,这甚至不是你应该如何使用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?