2010-08-09 70 views
6

我通常從PHP調用perl腳本如下,並通過變量這種方式,它工作正常,但現在我正在構建一個組件重新-use我也想改變我傳遞的perl腳本名稱,這給我一些頭痛,所以我想知道是否有人可以指出一個更好的方式來做到這一點,因爲我的方式不工作..謝謝..從PHP調用Perl腳本並傳遞變量,同時也使用變量perl腳本名稱

,沒有variablized perl的文件名的工作方式:

$file = "/var/www/other_scripts/perl/apps/perlscript.pl $var1 $var2 $var3 $var4"; 
ob_start(); 
passthru($file); 
$perlreturn = ob_get_contents(); 
ob_end_clean(); 

我試圖variablize perl的文件名能源部似乎沒有爲我工作,你可以在上面看到它是如何包括甚至在最初的「var(s)」,我覺得它很奇怪,但這似乎是它的唯一工作方式,而我不知道如何即使有variablized perl的文件名複製此:

$perlscript_file = "/var/www/other_scripts/perl/apps/" . $perlscript .".pl"; 

$file = $perlscript_file . $var1 . $var2 .$var3 . $var4; 
ob_start(); 
passthru($file); 
$perlreturn = ob_get_contents(); 
ob_end_clean(); 

回答

9

你的方式是行不通的,因爲你是連接所有參數,而空格,有效地使他們的一個參數。

嘗試

$perlscript_file = "/var/www/other_scripts/perl/apps/$perlscript.pl $var1 $var2 $var3 $var4"; 

順便說一句,如果參數是從外部源,您MUST它們進行消毒使用escapeshellarg()$perlscript也是如此 - 如果它來自外部來源甚至用戶輸入,請對其執行escapeshellcmd()

+0

好,謝謝,這是有道理的..現在它的內部,所以它沒有什麼大不了的消毒他們..感謝我NFO – Rick 2010-08-09 09:13:48

3

在你的第二個代碼中,你將它們之間沒有空格的變量連接起來。你應該考慮使用sprintf很好地格式化這個:

$script = sprintf('/var/www/other_scripts/perl/apps/%s.pl %s %s %s %s', $perlscript, $var1, $var2, $var3, $var4); 
6

在一個旁註,有一個CPAN包,旨在提供PHP和Perl之間的橋樑,這將允許你這樣做在PHP中的以下內容:

$perl = Perl::getInstance(); 
$instance = $perl->new('perlclass', @args); 

不知道這是多麼穩定。見

如果您使用的是Apache,你也可以使用

// PHP 
apache_note('foo', 'bar'); 
virtual("/perl/some_script.pl"); 
$result = apache_note("resultdata"); 

# Perl 
my $r = Apache->request()->main(); 
my $foo = $r->notes('foo'); 
$r->notes('resultdata', somethingWithFoo($foo)); 

http://php.net/manual/en/function.apache-note.php