【问题标题】:Parse large text file with Perl crashes when run from PHP从 PHP 运行时使用 Perl 解析大型文本文件崩溃
【发布时间】:2013-05-18 18:59:19
【问题描述】:

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

基本上我正在使用 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 有关。

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

附言我已将 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;

【问题讨论】:

  • 您在 PHP 中遇到了什么样的错误?
  • 当我从控制台运行它时,不显示任何内容。当我从浏览器运行它并执行 print_r(json_decode($output[0],true)); - 显示“服务器错误”HTTP 500。
  • 你的错误日志呢?
  • 将 Feed 分成几部分。不看剧本就不能说太多。
  • perl 中的json 也可以在PHP 中解析,为什么还要解析呢

标签: php json perl parsing


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    错误似乎在您的 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。这是一个容易忘记的步骤,可能会导致严重的挫败感。

    【讨论】:

    • 请注意,您将在 ini 文件中搜索 prase memory_limit = ,但通读整个 ini 文件以查看其中的内容并不是一个坏主意。
    【解决方案3】:

    我认为这可以在纯 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 开头

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-14
      • 2010-12-10
      • 2012-10-25
      • 2012-10-09
      • 1970-01-01
      • 2023-03-15
      相关资源
      最近更新 更多