PHP::Var

Perl > lib
| | コメント(0) | トラックバック(0)

PHP::Varとは何か

  • PerlのハッシュやリストをPHPのソースコードとしてエクスポートするためのPerlのライブラリです。

特徴

  • 「Perlで作成したデータ構造をPHPのソースコードとして書き出す」ということに特化しているためエクスポートが高速です。
  • インポートの際はPHP側でコードとして評価されるため、serializeしたものをunserializeするよりも低速です。

できないこと

  • PHPのデータをPerlへインポートすることはできません。
  • blessされたオブジェクトを意味のある形でエクスポートすることはできません。(qq("")がオーバーロードされている場合はスカラーとしてエクスポートされます。)

ベンチマーク

Perlで作成したデータ構造をPHPへ渡す機能をもつライブラリとしてPHP::Session::Serializer::PHP がありますので、これと比較しつつ、サンプルデータでベンチマークをとってみました。
(PHP::Session::Serializer::PHPはPHPでserializeしたデータをPerlのデータ構造にunserializeする機能もあったり、またPHPのclassも扱うこともできたりする高機能で汎用性のあるライブラリです。)

スクリプト

#!/usr/bin/perl

use strict;
use warnings;

use File::Temp qw/ tempfile /;

use PHP::Var;
use PHP::Session::Serializer::PHP;
my $serializer = PHP::Session::Serializer::PHP->new;

use Benchmark qw(cmpthese);

my %data = ();
foreach my $k1 ('a' .. 'z') {
    $data{$k1} = {};
    foreach my $k2 (1 .. 10) {
        $data{$k1}{$k2} = [
        'a' x 1000, 'b' x 1000, '"' x 20, "'" x 20, '\\' x 20,
        ],
    }
}

sub php_session {
    my $enc = $serializer->encode(@_);
}

sub php_var {
    my $enc = PHP::Var::export(@_);
}

cmpthese(1_00, {
    serialize => sub { &php_session(\%data) },
    php_var => sub { &php_var(\%data) },
    php_var_purity => sub { &php_var('purity' => 1, \%data) },
    php_var_enclose => sub { &php_var('enclose' => 1, \%data) },
});

print("\n");

sub _tempfile {
    my $data = shift;
    my ($fh, $fn) = tempfile();
    print($fh $data);
    close($fh);
    $fn;
}

my $sess_data = &_tempfile(&php_session(\%data));
my $sess = &_tempfile(
    "<?php \$var = unserialize(file_get_contents('$sess_data')); ?>"
);

my $var_code = &_tempfile(&php_var('enclose' => 1, 'var' => \%data));
my $var = &_tempfile("<?php include('$var_code'); ?>");

my $eval_data = &_tempfile(&php_var(\%data));
my $eval = &_tempfile("<?php eval(file_get_contents('$eval_data')); ?>");

cmpthese(1_00, {
    unserialize => sub { system("php $sess") },
    code_embed => sub { system("php $var_code") },
    code_include => sub { system("php $var") },
    'eval' => sub { system("php $eval") },
});

結果

                  Rate    serialize php_var_enclose php_var_purity       php_var
serialize       34.6/s           --            -22%           -27%          -27%
php_var_enclose 44.6/s          29%              --            -5%           -6%
php_var_purity  47.2/s          36%              6%             --           -1%
php_var         47.6/s          38%              7%             1%            --

               Rate         eval code_include   code_embed  unserialize
eval         30.4/s           --          -1%          -3%         -32%
code_include 30.6/s           1%           --          -3%         -32%
code_embed   31.4/s           3%           3%           --         -30%
unserialize  44.8/s          48%          47%          43%           --

一般的なケースでは書き出しよりも読み込みの頻度の方が高いと思うので、PHP::Session::Serializer::PHP と比較して速度的には劣ることが多いです。

ライセンス

MITライセンス

トラックバック(0)

このブログ記事を参照しているブログ一覧: PHP::Var

このブログ記事に対するトラックバックURL: https://tec.toi-planning.net/mtos/mt-tb.cgi/879

コメントする