0

我无法在 FCGI 模式下理解和运行简单的 PHP 脚本。我正在学习 Perl 和 PHP,我得到了下面的 Perl 版本的 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 中搜索类似内容时发现谈论“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);
?>
4

3 回答 3

1

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

FCGI 已经在请求/协议级别,它在 PHP 运行时完全抽象,因此您对 PHP 的控制不如 Perl 和use FCGI;

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

接下来fastcgi_finish_request与 Perl 代码完全无关。你一定是把它弄糊涂了,或者纯粹靠运气把它扔进去试一试。然而,在这个反例上下文中它并不是真的有用。

于 2014-04-27T11:40:36.280 回答
1

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

因此,对于 PERL 和 PHP,这个“计数器”示例的实现会有所不同。

您对 PERL 的使用fastcgi_finish_request不会带来您期望的 PERL 功能。考虑一个长时间运行的计算,在中间输出数据。您可以使用 fastcgi_finish_request 来做到这一点,然后将数据推送到浏览器,而长时间运行的任务会继续运行。

FASTCGI+PHP 一起打开。通常连接会打开,直到 PHP 完成,然后 FASTCGI 将被关闭。除非您达到 PHP 的执行超时(执行超时)或 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
?>
于 2014-04-27T11:46:42.967 回答
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?

于 2014-04-28T04:37:09.443 回答