【问题标题】:Sending the output of a command-line perl script to the browser via mod_perl通过 mod_perl 将命令行 perl 脚本的输出发送到浏览器
【发布时间】:2010-12-04 18:40:17
【问题描述】:

我有一个普通的 perl 脚本,可以通过perl -w test.pl 从命令行运行。然后我有一个可以从网络浏览器访问的 mod_perl2 脚本。我想让后者调用前者并将输出发送到浏览器,同时刷新。

mp2 脚本没有 shebang 行,因为它是 mod_perl,所以它不知道 perl 所在的位置。此外,调用system('perl -w c:\\path\\to\\test.pl') 会导致错误:

'perl' 未被识别为内部或外部命令, 可运行的程序或批处理文件。

由于某种原因我无法弄清楚,因为它在我的路径变量中。也许不是因为运行 Apache 的帐户。

有什么方法可以运行脚本并捕获其输出,而无需通过system() 调用 perl 可执行文件?即,使用已经加载的解释器的东西?

【问题讨论】:

  • perl 不在运行httpd 的帐户的%PATH% 中。
  • 我提到可能是 OP 中的情况
  • 我刚刚检查了控制面板->系统->高级->环境变量,它在系统路径中......所以我不知道为什么它不会最终出现在所有路径中帐户。

标签: perl command-line winapi system mod-perl2


【解决方案1】:
do "/path/to/test.pl";

require "/path/to/test.pl";

将加载和评估文件的内容。

关于require 的一个警告是评估文件必须返回“true”。执行此操作的常用方法是在脚本末尾添加 "1;"

【讨论】:

  • 输出最终在哪里呢? test.pl 旨在输出到命令行,而不是使用 mod_perl $r->print...
  • 输出到 STDOUT 文件句柄,我认为它与$r->print 做同样的事情(见modperlbook.org/html/6-4-6-print.html
  • 是的,当脚本运行时,输出似乎没有出现在浏览器中(这是一个长时间运行的脚本。)
  • 如果重构 perl 脚本不是一个选项,那么为什么不让 modperl 处理程序启动脚本,它会输出到另一个可以在浏览器中查看的文件。将长时间运行的脚本直接绑定到 http 请求会引发各种危险信号和警钟。如果您不小心按了 f5,或者您的浏览器崩溃了怎么办?您不想从上次停下的地方继续吗?
  • 如果您有长时间运行的处理,反向代理是更好的处理方式。前端进程处理小事情并将大工作传递给后端。
【解决方案2】:

您需要找到 Perl 二进制文件所在的位置(在 Unix 上,执行 which perl,在 Windows 上,找到 Perl 图标并找到命令行路径或找到安装 perl 的目录 - 例如,“c:\program文件\myPerlDistro\bin\perl.exe"

然后您需要将该完整路径显式添加到您的 qx//(不要使用系统,因为它会丢失输出)调用,或者将该路径添加到 Apache 的 PATH 变量中。

第二种选择是使用 EmbPerl - 它具有 Execute 指令,可以就地执行其他脚本并包含它们的输出 - 在同一个解释器中。它在 mod_perl 下运行。

【讨论】:

  • 我知道这是一种选择,但我更想知道是否有一种方法可以在不加载另一个 perl 可执行文件(并且必须在另一个位置跟踪路径)的情况下做到这一点——请参阅 OP。
  • 添加了第二个选项。
  • 可能是我要找的,我试试看。
  • 呃,也许不是。我以为它只是一个 Perl 模块,而不是我需要访问 Apache 配置的东西。
【解决方案3】:

显然,问题在于运行httpd 的帐户的%PATH% 不包含perl 的路径。您可以使用PerlSetEnvhttpd.conf 中进行设置。

【讨论】:

  • 这个脚本不是主线,我这里不需要mod_perl速度,刚好是环境。
【解决方案4】:

如果这是 Win32(如您的标签所示),您不能通过标准 Windows 东西将 .pl 扩展名与 Perl 相关联(例如,破解注册表或在资源管理器窗口中进入工具 > 文件夹选项 > 文件类型) ?

【讨论】:

  • 听起来是个好主意,但是当我尝试(使用重定向)时,它是这样说的:Can't dup STDERR: Permission denied at C:/Perl/site/lib/Test/Builder .pm 第 1826 行。
  • 并且没有重定向,“没有这样的文件或目录”(错误代码 3328)。
【解决方案5】:

除了 mod_perl 问题,当前 perl 解释器的位置在 $^X。如果你没有在 mod_perl 下运行,那么你应该找到 perl。当然,在 mod_perl 内部,您可能不想要那个,因为它已被嵌入到 apache 中。

有些人提到了 %PATH%,但我不建议这样做。只需找出 Perl 的完整路径并明确使用它,而不依赖于 %PATH%。无论您是硬编码还是在配置中设置它都取决于您。

【讨论】:

    猜你喜欢
    • 2014-05-25
    • 2011-10-24
    • 1970-01-01
    • 1970-01-01
    • 2011-01-14
    • 2020-03-01
    • 2016-08-22
    • 2015-10-30
    • 2015-03-04
    相关资源
    最近更新 更多