phpの中からPerlのプログラムを記述して実行する

技術関係

いったいなぜこう言うことになったのか、色々と混ぜるな危険な感じですがとりあえず。
まだ、簡単なプログラムでしか試してないので色々とエスケープとか足りてない気がするし、ステータスコードをみて強制終了するのではなくちゃんと結果を返したほうがいいような気がするし、まぁ緊急避難的な対応ということで

|php|
/*
* Perlで文字列を取得する
*
* @param string $str
* @return array string :
/
function perlprint($string) {
$tokens = array();

  // 状況に応じてエスケープする必要があるけど、今回は面倒なので消した
$string = preg_replace("/[\$@%]/", "", $string);
// このヒアドキュメントの中に実行するPerlのプログラムを記述する
$script = <<<EOF
use utf8;
use strict;
use warnings;
use encoding 'utf8';
## Perl側の変数はエスケープして\$にしておく
## PHP側の変数は特にエスケープせずに記述
## ヒアドキュメントもかけちゃうよ
my \$str = <<STR;
$string

STR

    print \$str;

EOF;

  $ret = $this->execPerl($script);
return($ret);
}
/**
* 与えられたスクリプトをPerlで実行する
*
* @param string $script
* @return mixed  :
*/
function execPerl($script) {
// エスケープしていたPerl側の変数をもとに戻す
$script = preg_replace("/\\\$/", "$", $script);
$descriptorspec = array(
0 => array("pipe", "r"),
1 => array("pipe", "w"),
2 => array("pipe", "w"),
);
$cmd = "/usr/bin/perl ";
$process = proc_open($cmd, $descriptorspec, $pipes);
if (is_resource($process)) {
// $pipes はこの時点で次のような形を取っています。
// 0 => 子プロセスの stdin に繋がれた書き込み可能なハンドル
// 1 => 子プロセスの stdout に繋がれた読み込み可能なハンドル
// 2 => 子プロセスの stderr に繋がれた読み込み可能なハンドル
fwrite($pipes[0], $script);
fclose($pipes[0]);
$stdout = stream_get_contents($pipes[1]);
$stderr = stream_get_contents($pipes[2]);
// デッドロックを避けるため、proc_close を呼ぶ前に
// すべてのパイプを閉じることが重要です。
fclose($pipes[1]);
fclose($pipes[2]);
$return_value = proc_close($process);
}
# コマンドの返り値が0以外なら標準エラー出力をそのまま返して終了
if( $return_value != 0) {
die("perl error: {$return_value} \n{$stderr}");
}
return ( array("stdout" => $stdout, "strerr" => $stderr) );
}

||<

タイトルとURLをコピーしました