2010-08-09 30 views
6

Tôi thường gọi các tập lệnh perl từ PHP như dưới đây và chuyển các biến theo cách này, và nó hoạt động tốt, tuy nhiên bây giờ tôi đang xây dựng một thành phần -Sử dụng nơi tôi cũng muốn thay đổi tên script perl mà tôi đang đi vào và điều này khiến tôi đau đầu, vì vậy tôi tự hỏi liệu có ai có thể chỉ ra cách tốt hơn để làm điều này theo cách của tôi không hiệu quả .. cảm ơn ..Gọi kịch bản Perl từ PHP và chuyển các biến số, trong khi cũng sử dụng tên script perl script

cách mà hoạt động mà không variablized perl filename:

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

nỗ lực của tôi để variablize tên file perl mà nai dường như không làm việc cho tôi, bạn có thể thấy ở trên làm thế nào nó được bao gồm ngay cả $ var (s) trong ban đầu "", mà tôi thấy lạ nhưng điều này có vẻ là cách duy nhất mà nó hoạt động và tôi là không chắc chắn làm thế nào để tái tạo thậm chí điều này với một tên file perl variablized:

$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(); 

Trả lời

9

cách của bạn không hoạt động bởi vì bạn đang liên tiếp các thông số không gian, có hiệu quả làm cho chúng một tham số.

Hãy thử

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

Bằng cách này, nếu các thông số đều đến từ một nguồn bên ngoài, bạn PHẢI khử trùng chúng bằng cách sử escapeshellarg(). Điều tương tự cũng xảy ra với $perlscript - nếu nó đến từ nguồn bên ngoài hoặc thậm chí là đầu vào của người dùng, hãy thực hiện escapeshellcmd() trên đó.

+0

ok cảm ơn, có ý nghĩa .. bây giờ chỉ là nội bộ của nó vì vậy nó không phải là một việc lớn về sanitizing chúng .. cảm ơn cho tôi nfo – Rick

3

Trong mã thứ hai, bạn đang nối các biến mà không có dấu cách giữa chúng. Bạn nên xem xét sử dụng sprintf để định dạng này độc đáo:

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

Trên một sidenote, có một gói CPAN nhằm cung cấp một cầu nối giữa PHP và Perl, mà sẽ cho phép bạn làm điều gì đó như sau trong PHP:

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

Bạn không chắc chắn mức độ ổn định này. Xem

Nếu bạn đang sử dụng Apache, bạn cũng có thể sử dụng

// 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)); 

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

Các vấn đề liên quan