我无法理解并在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);
?>
答案 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?