0

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

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

XXXXXXYYYYYYYYYYYYYZZZZZZZZZYYYYYYYYYPPPPPPPPPPP
XXXXXXYYYYYYYYYYYYYZZZZZZZZZYYYYYYYYYPPPPPPPPPPP
XXXXXXYYYYYYYYYYYYYZZZZZZZZZYYYYYYYYYPPPPPPPPPPP
XXXXXXYYYYYYYYYYYYYZZZZZZZZZYYYYYYYYYPPPPPPPPPPP

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

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

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

但是当我使用 PHP 从 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 有关。

还有其他方法可以做到这一点吗?建议?解决方案?

ps 我已将 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;
4

3 回答 3

1

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

于 2013-05-23T12:12:02.200 回答
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。这是一个容易忘记的步骤,可能会导致严重的挫败感。

于 2013-05-23T12:31:27.390 回答
1

我认为这可以纯粹地完成,PHP但我只会专注于您遇到的错误

你得到的原因Server Error" HTTP 500.是因为你没有启用错误报告。尝试打开错误报告,您会发现$output返回空数组因此$output[0]无效请参阅类中的 PHP 调用类返回错误: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"}
)

你不需要/usr/bin/perl在你的 exec 因为你的脚本已经开始了#!/usr/bin/perl -w

于 2013-05-23T12:58:08.263 回答