如何获得PHP(部署)的简单性和Perl的强大功能?
我鄙视PHP语言,并且可以肯定我并不孤单。但是PHP的妙处在于mod_php采取的方式并隐藏了与apache运行时集成的细节,并实现了类似于CGI的请求隔离和良好的性能。
用Perl语义获得与PHP运行时环境相同的简单性,速度和隔离性的最短距离方法是什么?我感觉像是原始的mod_perl给了我太多的绳索,使我无法自拔:交叉请求全局变量,混乱的配置,太多的模板引擎供我们选择。
FastCGI? HTML :: Mason?我希望在Perl中进行大部分开发,只要我有一个让我支持的框架即可。
解决方案
我建议使用FastCGI的Catalyst。另外,对于模板而言,Template :: Toolkit是我个人最喜欢的,但是HTML :: Mason在社区中也受到高度评价。
看一下Catalyst,这个MVC(模型,视图,控制器)框架可以独立运行,也可以与apache_perl一起工作,并且隐藏了很多混乱的地方。学习曲线有些奇怪(快速开始,中速较慢,然后它确实会点击以获取高级内容)。
Catalyst允许我们使用Template Toolkit将设计逻辑与业务逻辑分开,Template Toolkit确实很棒,即使我们决定不使用Catalyst,也应该使用它。 HTML :: Mason不是我个人喜欢的东西,尽管如果我们自己完成所有HTML,则可能需要查看Template :: Declare,这也是可以与Catalyst一起使用的另一种选择。
有关数据库的内容,请参阅DBIx :: Class,它又可以与Catalyst一起使用,也可以单独使用。
根据我们想做什么,有很多可能性。
如果我们想利用mod_perl的速度,却可以利用香草CGI的简便性,请查看CPAN的Modperl :: Registry分发。这将使我们可以在很大程度上保持不变地运行纯CGI脚本。
在框架方面,我是CGI :: Application的忠实拥护者。它提供了一个非常简单的基于继承的框架,该框架可以处理Web应用程序需要执行的大多数操作,从而使我们可以自由选择自己喜欢的方式来设计应用程序。一个简单的应用程序可以以整体方式完成;更复杂的可以使用成熟的MVC设计。通常,与Perl一样,CGI-App为我们提供了很多选择,并且通常不会给我们带来任何麻烦。
CGI-App默认情况下支持出色的HTML :: Template模块,并具有适用于其他模板系统的插件,例如壮观的Template Toolkit。还有很多其他用途的插件。
如果我们想为我们完成更多工作,请查看Catalyst。如果我们使用过Ruby on Rails,则这种处理方式可能会更熟悉。
其他流行的Web应用程序框架包括Randal Schwartz编写的Jifty和CGI :: Prototype,它基于Class :: Prototyped对象框架。
前面提到的Catalyst是构建整个Web应用程序的很好的工具,但绝非简单易行。 PHP的主要优势在于,我们可以根据需要将其小块代码嵌入其他静态页面中,即可以执行以下操作:
<html>
<body>
<p> 2 + 2的值是:<?php echo 2 + 2; ?> </ p>
</ body> </ html>
并在网络浏览器上查看:
2 + 2的值是:4
如果我们尝试使用Catalyst进行此类操作(据我所知),则我们正在开发具有多个文件的整个应用程序,以打印一个简单的值。至少,在我看到的教程中没有解释如何进行简单的嵌入。
幸运的是,使用Mason可以达到这种简单程度,在某些方面(由于Perl的强大功能),它甚至可以更加简单。上面的示例显示为:
`<html> <body> <p> 2 + 2的值为:<%2 + 2%> </ p> </ body> </ html>
我们会得到相同的结果。
不过,没有理由我们不能先安装和使用Mason并开始与之并列安装Catalyst,但是,如果我们打算稍后再迁移到非常复杂的,纯粹由Perl驱动的项目,则可以。
我不知道mod_perlite会变成什么样,它将提供我们所需要的。
Catalyst和CGI :: Application之类的东西更像Zend Framework,而不是PHP本身。为了复制PHP提供的"开箱即用"创建网页的基本功能,那么我们需要在每个基本Perl安装中都可用的两个CPAN模块:
use CGI; use DBI;
是我们真正需要的。现在代替:
$_POST['param'] $_GET['param']
你有:
my $q = new CGI; $q->param('param'); # same for post or get
而不是:
$dbh = mysql_connect('localhost', 'mysql_user', 'mysql_password'); $sth = mysql_query("SELECT 1 FROM table", $dbh); while($row = mysql_fetch_assoc($sth)) { // do something with $row }
你有:
my $dbh = DBI->connect('DBI:mysql:host=localhost;', 'mysql_user', 'mysql_password'); my $sth = $dbh->prepare("SELECT 1 FROM table"); $sth->execute(); while(my $row = $sth->fetchrow_hashref) { # do stuff with row }
DBI代码稍微复杂一点,因为它提供了准备好的语句和绑定变量,因此我们不必担心SQL注入。 PHP不提供此功能,因此我们需要使用PDO之类的东西或者编写自己的数据库类。
剩下的唯一一件事就是是否要在脚本中输出HTML。但是你不想那样吗?为此,我们使用HTML :: Template或者Template :: Toolkit,与在PHP中使用Smarty或者本机模板的方式相同。
Perl中与PHP最接近,广为人知的等效项可能是HTML :: Mason。
像PHP一样,它将Perl嵌入到文档中并呈现它:
% my $noun = 'World'; Hello <% $noun %>! How are ya?
O'Reilly的书Mason用HTML嵌入Perl可以免费在线获得。
我同意亚里斯多德的观点。如果只是完成,mod_perlite听起来就像我们要查找的内容。
我使用过HTML :: Mason,首先入侵RT,然后使用它创建两个站点。有一个学习曲线,但是还算不错。我认为,更糟糕的是正在安装东西,但是与Mason相比,它与Apache和mod_perl的关系更大。片段一旦就位,就和我们制作的过程一样复杂(就像Perl本身一样)。
就简单性而言,最接近PHP的是HTML :: Mason。
对于那些寻求简单性的人来说,建议Catalyst是个坏玩笑...而且我现在每天很高兴与Catalyst一起工作。
我刚刚看到了舞者。看起来这可能是一个不错的选择。