【问题标题】:When should I use Perl CGI instead of PHP (or vice versa)?我什么时候应该使用 Perl CGI 而不是 PHP(反之亦然)?
【发布时间】:2010-10-23 21:48:51
【问题描述】:

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

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

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

在这一点上,我也不想浪费大量时间来研究业余爱好项目,所以我想,让我们向专家寻求帮助。

【问题讨论】:

  • 看一下 Catalyst,而不是普通的 CGI。 catalystframework.org
  • @Brad Gilbert - 您将 CGI.pm 和 CGI​​ 界面混为一谈。 Catalyst 可以作为 CGI 运行(启动开销有点大,但可以接受)。
  • 问题是他们是否为您提供了到网络服务器、CGI.pm 或两者的 CGI 接口。命名的巧合意味着我们无法分辨 - 你知道吗?

标签: php perl cgi cpan


【解决方案1】:

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 步。

另外,我建议不要使用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 一起使用。

【讨论】:

  • 虽然大部分内容是正确的,但 mod_perl 不仅仅是一个 CGI 加速器。事实上,这是让您能够在 Perl 中控制 Apache 请求周期的每一点的一种副作用。
  • 阿门。尤其是“CGI 与语言无关”这一点——我写的第一个 CGI 库实际上是用 C 语言作为咨询工作的(那是在大学时代,当时我对 C 语言非常好,但不知何故设法从未听说过Perl :)
  • 当您不是前端技术专家但精通 shell 脚本时,CGI 非常适合制作基于浏览器的生产力工具原型。
【解决方案2】:

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

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

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

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

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

【讨论】:

    【解决方案3】:

    从扩展的角度来看,你是使用 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%,并且需要多个网络服务器 - 但您有足够的流量来证明额外成本是合理的。

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

    【讨论】:

      【解决方案4】:

      这是一个使用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。

      【讨论】:

        【解决方案5】:

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

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

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

        HTH

        科林

        【讨论】:

        • 您可以使用 Mason 或 Template-Toolkit 将 Perl 代码嵌入 HTML,我不建议这样做。
        【解决方案6】:

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

        【讨论】:

        • Catalyst 也可以作为 CGI 运行,只是速度很慢。
        【解决方案7】:

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

        【讨论】:

        • Perl 的追随者可能比 PHP 多得多。 PHP 只对编写网站有用,Perl 几乎可以用于所有编程领域。
        【解决方案8】:

        试试CatalystTemplate Toolkit

        sub hello :Path('/hello') :Args(0) {
            my ( $self, $c ) = @_;
        
            # Hello World
            $c->response->body( $c->welcome_message );
        }
        
        [% title %] [% 内容 %]
        &复制; [%版权%]
        正文>
        猜你喜欢
        • 2010-11-14
        • 2011-12-07
        • 2012-04-11
        • 1970-01-01
        • 2011-10-03
        • 2020-08-19
        • 2011-04-01
        • 2015-09-10
        • 1970-01-01
        相关资源
        最近更新 更多