【问题标题】:How to debug Perl that is called from PHP file如何调试从 PHP 文件调用的 Perl
【发布时间】:2016-08-17 23:10:27
【问题描述】:

我目前在家工作(周日!),我试图弄清楚为什么我的 Perl 脚本从调用它的地方返回 NULL 到 PHP。但是,我看不到如何调试 Perl 脚本本身。 PHP 文件返回一个警告,指出我正在尝试对非数组对象执行数组操作(因为预期的数组实际上是 PHP 返回的 NULL)。网络服务器的日志也只记录了这个警告——没有 Perl 错误。

服务器上是否有存储特定“外部”日志的地方?或者,是否有更好的方法来调试从 PHP 文件运行的 Perl 文件,而该 PHP 文件在主 PHP 文件中是必需的?调试不是必需的(我不需要调试模式),但我希望至少看到错误或警告。

【问题讨论】:

  • 能不能改一下Perl脚本的源代码添加一些调试代码?
  • @bart 我确实可以做到。我会写什么?
  • 你能自己运行 Perl 程序而无需中间的 php 吗?你知道什么进去,什么应该出来吗?你有 shell 访问权限吗?
  • @simbabque 不,我只能通过服务器从 PHP 文件运行文件。我没有外壳访问权限。 (否则我会简单地从 shell 运行脚本。)
  • 所以调试器不是一个选项。 answer by bart 是一个好的开始,但了解程序应该做什么也很重要。我认为您也无法安装任何模块,因为您没有外壳访问权限。将@bart 的解决方案与一堆warn 语句结合起来,可能使用Data::Dumper,你应该能够找到问题所在。

标签: php perl debugging


【解决方案1】:

您可以在 Perl 脚本的顶部添加以下代码:

sub debug_log
{
    open my $log_fh, ">>", "/tmp/debug.log";
    print $log_fh $_[0];
    warn $_[0];
    close $log_fh;
}

$SIG{__WARN__} = \&debug_log;
$SIG{__DIE__} = \&debug_log;

这样所有警告和die 消息都应该以/tmp/debug.log 结尾。

【讨论】:

  • tmp 目录是相对于 Perl 文件本身(因此是该脚本的姐妹)、相对于 PHP 文件还是相对于主 PHP 文件?因为乍一看我找不到它。
  • open 参数指定的路径是绝对路径,因此您应该在/tmp 中有一个文件。如果没有文件,则意味着没有警告或脚本没有死。您可以通过在 $SIG... 行之后使用 warn "debug test"; 来测试是否正确记录了警告。
猜你喜欢
  • 2015-04-08
  • 1970-01-01
  • 2011-01-31
  • 2011-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-02
  • 1970-01-01
相关资源
最近更新 更多