17

出于爱好目的,我在提供 PHP 和 Perl CGI 的托管服务器上拥有一个共享空间。我在几个地方读过 CGI 脚本现在已经过时了,我认为主要是因为性能问题(比如PHP 或 vanilla Perl CGI 更快吗?)。

但是由于我刚刚开始学习 Perl,我不想浪费时间在 PHP 中实现在 Perl 中更容易(或唯一可能)的解决方案。

还有样板问题,我知道 CPAN(即存在,还不是内容),但不熟悉 PHP 库(尽管我毫不怀疑它们存在)。我不准备第 10 ^ 10 次从头开始编写登录过程或基本用户管理。

在这一点上,我也不奢侈浪费大量时间研究爱好项目,所以我想,让我们向专家寻求一个先机。

4

8 回答 8

34

CGI 的“过时”特性实际上仅在您正在处理具有大量页面浏览量的大型复杂网站时才会考虑。

许多人认为 CGI 已过时,但并不真正了解 CGI 是什么。有一种普遍的误解认为 CGI 本质上是一种基于 Perl 的技术。许多人攻击 CGI 是为了平息对 Perl 的狂热攻击,以支持他们支持的任何语言。如果您想成为一名真正的技术专家,您需要了解基本问题并根据实际情况做出选择。

CGI 是一个带有网络服务器的接口,它允许您以任何语言编写交互式页面——甚至是 befunge。当服务器收到对由 CGI 脚本控制的页面的请求时,服务器会运行该脚本并将结果返回给请求者。

如果您的编程语言在每次执行时都需要加载 VM、解释器或编译器,那么每次访问您的页面时都需要此启动时间。

FastCGI、mod_php、mod_perl 等 CGI 加速器始终将解释器/VM 保留在内存中,可以保持库加载,甚至缓存脚本中的字节码以减少脚本启动开销。

如果您正在制作一个简单的、个人的或爱好的网站,CGI 就可以了。PHP 也将如此。

如果您的站点需要增长到需要更快的技术,您可以迁移到 mod_perl、FastCGI 或其他 CGI 加速技术。

您使用什么语言应该由它提供的工具以及它们如何满足您的需求来决定。

  1. 列出你需要的能力。
  2. 列出破坏交易的清单。
  3. 现在对照这两个列表检查每个可能的工具集。
  4. 哪一个出来最好?测试一下。
  5. 很烂吗?把它从你的清单上划掉,然后回到第 4 步。

另外,我建议不要使用befunge。仅仅因为它是可能的,并不意味着你应该使用它。


更新: 正如 mpeters 所指出的,mod_perl、mod_php、mod_ruby 等不仅仅是 CGI 加速器;它们提供对 Apache API 的访问。它们充当 CGI 加速器,但可以做很多、很多、更多的事情。

FastCGI 是一个纯 CGI 加速器。

更新 2: PHP 和 CGI​​ 不是相互排斥的。 PHP 可以作为 CGI 安装。PHP 经常与 FastCGI 一起使用。

于 2009-05-05T15:18:03.710 回答
9

对于决定将什么用于业余爱好,这是一个相当主观的问题。在研究了 PHP 之后,我决定将 Perl 作为一种爱好来学习,并且不喜欢我无法阅读大部分 PHP 并且被内置函数列表吓倒的事实。

我做的前几件事是用于联系表格的 CGI 脚本和相册生成器。我使用的是便宜的共享托管计划,并且没有遇到任何性能问题,因此性能问题从未发挥作用。

相反,comp.lang.perl.misc 和 CPAN 的存在确保了我永远不会重新考虑不深入研究 PHP 的决定。

同时,我意识到我网站上的大部分内容在生成后都是静态的,所以现在我编写 Perl 脚本来离线生成内容。

所以,我的答案是,选择一个小项目,任何事情都可以,然后使用 Perl 和适当的 CPAN 模块来实现它,看看你是否喜欢它。

于 2009-05-05T13:15:29.417 回答
5

从扩展的角度来看,您使用 PHP 还是 Perl 是没有意义的,就像用 PHP 和 C 编写的 web 应用程序之间的区别是没有意义的一样。如果差异真的很重要,我们都会编写 C 或汇编。

PHP 很慢,但这并没有阻止 Wikipedia、Facebook 和 Yahoo 广泛使用它。

从扩展的角度来看,您选择哪种语言并不重要有两个主要原因:

  1. 使用像 Squid 这样的缓存反向代理。通过卸载 apache 的大部分工作负载,您可以显着减少 CGI 调用负载。
  2. 扩展您的网络层很容易。它很难扩展您的数据库层。您始终可以将另一个网络服务器添加到场。如果您可以使用 mod_php 每秒处理 1000 个请求,而使用 CGI 每秒可以处理 500 个请求,如果开发 CGI 更便宜、更快,那就去做吧。您将需要两倍的网络头,但要么:
    1. 您处于网络的底层 90%,并且无论如何只需要一个网络服务器。
    2. 您处于网络的前 10%,并且需要多个网络服务器——但您有足够的流量来证明额外成本是合理的。

选择您和您的团队可以最有效地开发的语言。

于 2009-05-22T00:09:44.740 回答
3

这是一个使用Squatting web 微框架在 CGI 下运行的简单“hello world”示例:

use strict;
use warnings;

{
    package MyApp;
    use base 'Squatting';
    use base 'Squatting::On::CGI';
}

{ 
    package MyApp::Controllers;
    use Squatting ':controllers';

    our @C = (
        C(
            Index => [ '/' ],
            get   => sub { 
                my ( $self ) = @_;
                my $v = $self->v;
                $v->{say} = 'hello world!';
                $self->render( 'hello' );
            },
        ),
    );
}

{
    package MyApp::Views;
    use Squatting ':views';
    use HTML::AsSubs;

    our @V = (
        V(  'html',

            layout => sub { 
                my ( $self, $v, @yield ) = @_;
                html (
                    head ( title( 'My CGI App' ) ),
                    body ( @yield ),
                )->as_HTML;
            },

            hello => sub {
                my ( $self, $v ) = @_;
                p ( $v->{say} );
            },
        ),
    );
}

use CGI;
my $q = CGI->new;
MyApp->init;
MyApp->relocate('/cgi-bin/myapp.cgi');
MyApp->cgi($q);

另存为“myapp.cgi”并放入您的 cgi-bin。

于 2009-05-22T09:56:56.227 回答
2

我在网站上同时使用 Perl 和 PHP - 由于历史原因,主要是 Perl 在工作中和 PHP 在家里;我认为他们之间没有太多选择。

如果您的页面大部分是固定的 HTML 并且只有少量计算,那么 PHP 会更容易一些,因为它无论如何都嵌入在 HTML 中。

我发现 PHP 比 Perl 更规范,因此有时也更受限制。PEAR 与 CPAN 非常相似——我认为没有那么大,但是 CPAN 太大了,以至于它里面有很多渣滓。

高温高压

科林

于 2009-05-05T13:13:39.623 回答
2

如果您使用托管,在许多情况下 PHP 也将作为 CGI 运行。如果你不想运行 FastCGI 或 mod_perl,你可以使用CGI::Application framework。CGI::Application 也可以使用 FastCGI 或 mod_perl 运行,但与 Catalyst 不同的是,它也可以作为 CGI 运行。Catalyst 和 CGI​​::Application 都可以使用它们自己的 Web 服务器运行。

于 2009-05-06T13:17:58.997 回答
1

PHP 和 Perl 都有自己的时刻,但这确实是主观的。Perl 在 CPAN 上有大量可用的框架,即使在纯 CGI 环境中,它也可以与 PHP 一样好或更好地工作。同时,PHP 拥有大量的追随者,以及大量开箱即用的功能,使网站编程变得简单。对我来说,选择归结为个人喜好。我个人更喜欢使用 Perl,而不是试图找到所有在 PHP 中做事的函数式方法。祝你好运!

于 2009-05-05T14:25:11.747 回答
1

使用Template Toolkit试用Catalyst

sub hello :Path('/hello') :Args(0) {
    my ( $self, $c ) = @_;

    # Hello World
    $c->response->body( $c->welcome_message );
}
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Strict//EN">
<html>
  <头部>
    <title>[% title %]</title>
  </head>
  <正文>
    <div id="header">
      <a href="/index.html" class="logo" alt="主页"></a>
      <h1 class="headline">[% title %]</h1>
    </div>

    [% 内容 %]

    <div id="页脚">
      <div id="版权">
        &复制; [%版权%]
      </div>
    </div>
  </正文>
</html>
于 2009-05-05T15:54:37.523 回答