我何时应该使用Perl CGI而不是PHP(反之亦然)?

时间:2009-05-05 12:56:16

标签: php perl cgi cpan

出于业余爱好的目的,我在托管服务器上有一个共享空间,它提供了许多PHP和Perl CGI。我已经阅读了几个CGI脚本现在已经过时的地方,我认为主要是针对性能问题(如Is PHP or vanilla Perl CGI faster?)。

但是,自从我刚刚开始学习Perl以来,我不想浪费时间在PHP中实现更容易(或仅可能)在Perl中的解决方案。

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

我现在不奢侈浪费大量时间进行业余爱好项目的研究,所以我想,让我们向专家们寻求启发。

8 个答案:

答案 0 :(得分:31)

如果您正在使用具有大量页面浏览量的大型复杂网站,那么CGI的“过时”实际上只是一个因素。

很多人都认为CGI已经过时并不能真正理解CGI是什么。人们普遍存在一种误解,认为CGI本质上是一种基于Perl的技术。许多人攻击CGI是为了支持他们支持的任何语言来填补对Perl的邪教攻击。如果你想成为一名真正的技术专家,你需要了解基本问题,并根据具体情况做出选择。

CGI是一个带有网络服务器的界面,允许您以任何语言编写交互式页面 - even befunge。当服务器获取由CGI脚本控制的页面的请求时,服务器运行脚本并将结果返回给请求者。

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

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

如果您正在制作一个简单的个人或爱好网站,CGI将会没事的。 PHP也是如此。

如果您的网站需要更快的技术,您可以转向mod_perl,FastCGI或其他CGI加速技术。

您使用的语言应根据其提供的工具以及它们如何满足您的需求来确定。

  1. 列出您需要的功能。
  2. 列出交易破坏者名单。
  3. 现在针对这两个列表检查每个可能的工具集。
  4. 哪一个最好?测试一下。
  5. 难道吗?将其从列表中删除,然后返回步骤4.
  6. 另外,我建议不要使用befunge。仅仅因为它是可能的,这并不意味着你应该使用它。


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

    FastCGI是纯粹的CGI加速器。

    更新2: PHP和CGI不是互斥的。 PHP can be installed as a CGI。 PHP通常与FastCGI一起使用。

答案 1 :(得分:8)

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

我做的前几件事是联系表格的CGI脚本和相册生成器。我是在一个廉价的共享主机方案,我没有遇到任何性能问题所以性能问题从未发挥作用。

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

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

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

答案 2 :(得分:4)

无论你使用PHP还是Perl,从缩放的角度来看都是徒劳的,因为用PHP和C编写的webapp之间的差异是没有意义的。如果差异真的很重要,我们都会写C或汇编。

PHP很慢,但这并没有阻止维基百科,Facebook和雅虎广泛使用它。

从缩放的角度来看,有两个主要原因无关紧要,您选择哪种语言:

  1. 使用像Squid这样的缓存反向代理。通过卸载大部分apache的工作负载,您可以显着降低CGI调用负载。
  2. 轻松扩展您的网络层。它正在扩展您的数据库层,这很难。您始终可以向服务器场添加其他Web服务器。如果你可以使用mod_php每秒提供1000个请求,使用CGI每秒提供500个请求,如果你开发CGI的速度更快,速度更快,那就去做吧。你需要两倍的网页头,但要么:
    1. 你处于网络底层的90%,而且无论如何只需要一个网络服务器。
    2. 您位于网络的前10%,需要多个网络服务器 - 但您已获得足够的流量来证明额外费用。
  3. 选择您和您的团队可以最有效地开发的语言。

答案 3 :(得分:3)

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

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。

答案 4 :(得分:2)

我将Perl和PHP用于网站 - 出于历史原因,主要是工作中的Perl和家中的PHP;我不认为他们之间有很多选择。

如果您的页面大多是固定的HTML,只需要少量的计算,那么PHP就更容易了,因为它无论如何都嵌入在HTML中。

我发现PHP比Perl更有纪律,因此有时更具限制性。 PEAR与CPAN非常相似 - 我认为不是那么大,但CPAN是如此之大,以至于它有很多糟糕的东西。

HTH

科林

答案 5 :(得分:2)

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

答案 6 :(得分:1)

PHP和Perl都有他们的时刻,但这确实是主观的。 Perl在CPAN上有大量的框架可以使它比PHP更好或更好,即使在纯粹的CGI环境中也是如此。与此同时,PHP拥有大量的追随者,以及大量开箱即用的功能,使网站编程变得简单。 对我而言,选择归结为个人偏好。我个人更喜欢使用Perl而不是试图找到所有在PHP中使用的功能方法。 祝你好运!

答案 7 :(得分:1)

使用Catalyst尝试Template Toolkit

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>
  <head>
    <title>[% title %]</title>
  </head>
  <body> 
    <div id="header">
      <a href="/index.html" class="logo" alt="Home Page"></a>
      <h1 class="headline">[% title %]</h1>
    </div>

    [% content %]

    <div id="footer">
      <div id="copyright">
        &copy; [% copyright %]
      </div>
    </div>
  </body>
</html>