从PHP运行时,使用Perl崩溃解析大型文本文件

时间:2013-05-23 12:09:12

标签: php json perl parsing

我正在使用Perl脚本来解析和创建用于PHP的JSON输出。

基本上我使用Perl解析大文本文件(5-20​​MB),数据如下:

XXXXXXYYYYYYYYYYYYYZZZZZZZZZYYYYYYYYYPPPPPPPPPPP
XXXXXXYYYYYYYYYYYYYZZZZZZZZZYYYYYYYYYPPPPPPPPPPP
XXXXXXYYYYYYYYYYYYYZZZZZZZZZYYYYYYYYYPPPPPPPPPPP
XXXXXXYYYYYYYYYYYYYZZZZZZZZZYYYYYYYYYPPPPPPPPPPP

该脚本打印文件中每行数据的JSON输出:

{ "1" : "XXXXXXYYYYYYYYYYYYYZZZZZZZZZYYYYYYYYYPPPPPPPPPPP", "2": ... } 

从终端运行时,它会在1.5秒内超过100,000行此类文件,成功创建JSON。

但是当我使用

从PHP中运行脚本时
exec("/usr/bin/perl script.pl input_file.txt",$output);
print_r(json_decode($output[0],true);
它崩溃了。虽然,如果我给它2000-3000行的文件,它运作良好。不使用json_decode,只做$ output输出变量的var_dump。

我认为它与json_decode有关。

还有其他办法吗?建议?溶液

P.S。我已将PHP memory_limit增加到128MB。

谢谢。

修改

Perl脚本:

#!/usr/bin/perl -w

use strict;
use warnings;

my $file = $ARGV[0];
my $id = 0;

open my $info, $file or die "Could not open $file: $!";

print "{";
while( my $line = <$info>)  {

    print "\"$id\" : " . "\"" . trim($line) . "\"";

    print ',' unless eof;

    $id++;
}
print "}";

sub trim {
    (my $s = $_[0]) =~ s/^\s+|\s+$//g;
    return $s;        
}

close $info;

3 个答案:

答案 0 :(得分:1)

如果它从控制台运行,则错误在于您的php-config。这可能是从脚本执行超时到内存问题或脚本执行权限的所有类型的配置错误。在您的情况下,我会保证发生一些超时或脚本执行权限,具体取决于崩溃所需的时间。检查你的php-error-log以获取详细信息......

答案 1 :(得分:1)

错误似乎在您的php.ini文件中。这可以控制PHP安装的大量可配置选项。您的问题很可能如下:

; Maximum amount of memory a script may consume (128MB)
; http://php.net/memory-limit
memory_limit = 1M

这只是一个例子。但似乎你的记忆限制是小的。尝试将它增加到更大的东西,看看是否能解决问题。如下所示:

; Maximum amount of memory a script may consume (128MB)
; http://php.net/memory-limit
memory_limit = 56M

另请注意,无论何时编辑ini文件,都必须重新启动PHP服务器才能应用更改的ini。这是一个容易忘记的步骤,可能导致严重的挫败感。

答案 2 :(得分:1)

我认为这可以在纯PHP中完成,但我会专注于你所犯的错误

您获得Server Error" HTTP 500.的原因是因为您未启用错误报告。尝试启用错误报告时,您会发现$output返回空数组,因此$output[0]无效,请参阅PHP call class in class returns error:500

使用exec时,请确保使用完整路径

$buid = 'FULL PATH TO /script.pl' ;
$input = 'FULL PATH TO /input_file.txt' ;

exec("$buid $input",$output);
print_r($output);

输出

Array
(
    [0] => Ok{"0" : "XXXXXXYYYYYYYYYYYYYZZZZZZZZZYYYYYYYYYPPPPPPPPPPP","1" : "XXXXXXYYYYYYYYYYYYYZZZZZZZZZYYYYYYYYYPPPPPPPPPPP","2" : "XXXXXXYYYYYYYYYYYYYZZZZZZZZZYYYYYYYYYPPPPPPPPPPP","3" : "XXXXXXYYYYYYYYYYYYYZZZZZZZZZYYYYYYYYYPPPPPPPPPPP"}
)

您的exec中不需要/usr/bin/perl,因为您的脚本已经以#!/usr/bin/perl -w

开头