【问题标题】:how to include .pl (PERL) file in PHP如何在 PHP 中包含 .pl (PERL) 文件
【发布时间】:2011-02-07 19:13:49
【问题描述】:

我有两个页面,一个在 php(index.php) 中,另一个在 Perl(dbcon.pl) 中。

基本上我希望我的 php 文件只显示 UI,所有数据操作都将在 Perl 文件中完成。

我试过了 在 index.pl 中

<?php include("dbcon.pl");?>
<html>
<br/>PHP</br>
</html>

而 dbcon.pl 有

#!/usr/bin/perl
use strict;
use warnings;
use DBI;

use CGI::Simple;
my $cgi = CGI::Simple->new;
my $dsn = sprintf('DBI:mysql:database=%s;host=%s','dbname','localhost');

my $dbh = DBI->connect($dsn,root =>'',{AutoCommit => 0,RaisError=> 0});


my $sql= "SELECT * FROM products";
my $sth =$dbh->prepare($sql);
$sth->execute   or die "SQL Error: $DBI::errstr\n";
while (my @row = $sth->fetchrow_array){
print $cgi->header, <<html;
<div>&nbsp;@row[0]&nbsp;@row[1]&nbsp;@row[2]&nbsp;@row[3]&nbsp;@row[4]</div>
html
}

但是当我在浏览器中运行 index.php 时,它会打印 dbcon.pl 文件中的所有代码而不是执行它

如何解决这个问题?

注意:我是在windows环境下运行的

还有其他方法吗?

【问题讨论】:

  • 在使用工具之前,您确实应该了解所使用工具的基本原理。我不想粗鲁,但是这个问题几乎是在尖叫“我不知道解释语言是如何工作的”,所以虽然你可以遵循下面的一些答案(它们已经足够好了),但你会遇到更大的问题不久的将来。
  • 我会记住的,谢谢
  • 我也很抱歉听起来很粗鲁,但您似乎真的以您决定使用的方式对此下定了决心,并且顽固地拒绝以任何不同的方式这样做。在我看来,在如此奇怪的组合中使用 Perl 和 PHP 绝对是零理由,而且您似乎无法清楚地表达实际的 动机 去你的方式,除了像“我真的有只能这样做”。
  • 我猜他想用php作为模板系统所以我已经回答了。我认为这已经被过度修改了,因为这是可能的。不过我不同意。您应该使用 perls 模板系统之一,例如 Template Toolkit、Mason、HTML::Zoom 以及一些我知道我忘记的其他模板系统。
  • 看起来他也不知道自己在做什么以及为什么 - 这可以解释大量的降级。

标签: php perl include


【解决方案1】:

请问真正的问题是什么?我在 Perl 代码中没有看到任何“特别”的东西,所以你要么:

a) 不知道如何从 PHP 访问您的数据库(即您不了解 PHP)或

b) 不知道 Perl 在做什么(即你不知道 Perl)或

c) 可能您的环境已设置为可以使用 Perl DBI,但您不能在 PHP 中执行相同操作。

这个 link 应该为您提供直接从 PHP 执行您在 Perl 中执行的操作的指针。您会很容易地找到各种 PHP/DB 组合的数十个示例。

唯一的另一种方法是按照另一张海报的建议:调用 Perl 脚本并解析结果(打印到标准输出)。

这是 ruby​​goldbergsque,脆弱且不可接受的解决方案,除非您绝对不顾一切地使用只能作为 Perl 模块使用的东西(您发布的示例不是这种情况)。

一般来说,如果你想用一种语言完成某事并从其他语言使用它,最好的方法是让(在你的情况下)Perl 作为一种“服务器”运行,即一个单独的进程 -并使其使用 XML-RPC 或其他一些轻量级协议公开服务。

使用 exec() 或类似结构调用程序是非常糟糕的做法。

【讨论】:

  • 感谢您的回复,我知道如何从 PHP 和 PERL 访问 DB,我主要关心的是从 php 调用(或执行)perl 文件,因为我想在 perl 中进行所有后端操作和UI 将在 php.ini 中。再次感谢
  • 不,没有分离。您的 perl 脚本仍会输出 UI 元素。你真的应该看看所有你想要做的分离的 PHP 框架。
  • “我想在 Perl 中进行所有后端操作”有点弱,除非您想利用 PHP 中不可用的东西。如果是这种情况,请选择“服务器”解决方案。使用 Exec() 将非常缓慢、低效且脆弱。
  • 其实你可以在带有perl的模板系统中使用php。如果使用催化剂框架,则添加了一个反映解决方案的答案。我认为使用 TT、HTML::Zoom、Mason 等是更好的选择……但你可以做到。
【解决方案2】:

您正在尝试的事情不可能那么容易。您必须使用 PHP 执行 perl 脚本,捕获输出并打印如下:

<?php echo exec('perl dbcon.pl'); ?>

如前所述,这不是一件好事。为了很好地分离后端和用户界面,您应该查看现有的 PHP 框架。

【讨论】:

  • 我根本不推荐解决方案。
  • 是的,它不是。但这正是他想做的。
  • 我可以知道为什么不推荐它
  • 在其他原因中,您正在从 Perl 中的数据库读取,将其格式化为文本以输出,在 PHP 中将其吞入并再次从文本解码为数据。非常低效。而且每次都将 Perl 解释器作为一个单独的进程启动,这当然会产生一些开销。如果出现问题,您没有可靠的机制来恢复错误是什么,除非您自己编写代码。完成此操作后,您将以低效且容易出错的方式重新发明了几种轮子。
  • Dexter,如果您在这方面遇到问题,您似乎对 PHP 和 Perl 不太了解 - 所以您“偶然”获得这项工作的机会几乎为零。无论如何,你在 Windows 上,所以也许你应该尝试 "" 是的,“Whatever”不是真的正确的道路,我希望您至少了解自己的 PC...
【解决方案3】:

Perl PECL package 将Perl 集成到PHP 中。

附:恕我直言,最好在 Perl 中使用模板工具包之类的模板系统。您甚至可以在模板中使用 Perl。

【讨论】:

    【解决方案4】:

    如果您使用的是Catalyst,您可以使用我们的Catalyst::View::PHP,我怀疑它会给您提供更多关于如何使用php 作为您的模板系统的线索。它还提到了PHP::Interpreter

    【讨论】:

      猜你喜欢
      • 2011-05-05
      • 2010-10-02
      • 1970-01-01
      • 1970-01-01
      • 2016-02-05
      • 1970-01-01
      • 2013-09-11
      • 2014-12-07
      • 1970-01-01
      相关资源
      最近更新 更多