如何调试从 PHP 文件调用的 Perl
Posted
技术标签:
【中文标题】如何调试从 PHP 文件调用的 Perl【英文标题】:How to debug Perl that is called from PHP file 【发布时间】: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,你应该能够找到问题所在。
【参考方案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";
来测试是否正确记录了警告。以上是关于如何调试从 PHP 文件调用的 Perl的主要内容,如果未能解决你的问题,请参考以下文章