无法从PHP运行perl脚本

时间:2015-08-12 09:17:05

标签: php perl raspberry-pi

我已经创建了一个perl脚本,我想从PHP运行。

当我做一个像

这样的正常例子时

PHP:

var ppp = $('#more_posts').data('ppp');
var cat = $('#more_posts').data('category');
var pageNumber = 1;


function load_posts(){
    pageNumber++;
    var str = '&cat=' + cat + '&pageNumber=' + pageNumber + '&ppp' + ppp + '&action=more_post_ajax';
    $.ajax({
        type: "POST",
        dataType: "html",
        url: ajax_posts.ajaxurl,
        data: str,
        success: function(data){
            var $data = $(data);
            if($data.length){
                $("#ajax-posts").append($data);
                $("#more_posts").attr("disabled",false);
            } else{
                $("#more_posts").attr("disabled",true);
            }
        },
        error : function(jqXHR, textStatus, errorThrown) {
            $loader.html(jqXHR + " :: " + textStatus + " :: " + errorThrown);
        }

    });
    return false;
}

$("#more_posts").on("click",function(){ // When btn is pressed.
    $("#more_posts").attr("disabled",true); // Disable the button, temp.
    load_posts();
});

PERL:

exec("perl test.pl",$output);
echo '<pre>'; print_r(array_values($output)); echo '</pre>';

打印出来:Hiii。这是用PHP在PHP中执行的perl

但是当我添加其他Perl脚本(test2)时:

#!/usr/bin/perl -s
print "Hiii. This is perl executing in PHP";

新的PHP看起来像:

#!/usr/bin/perl -s

# Function definition
use test_sub qw( :all ) ;

use strict;
use warnings;

if ($ARGV[0] eq "te") 
{
  printf("te chosen to(%d)\n",$ARGV[1]);
  te($ARGV[1]);
}   

我知道至少应该有一个警告,尽管我不使用任何参数,但$ output中似乎没有任何内容。

即使使用PHP中的参数:

exec("perl test2.pl",$output);
echo '<pre>'; print_r(array_values($output)); echo '</pre>';

什么都没有出现。 我试图用函数

查看可执行文件
exec("perl test2.pl te 1",$output);
echo '<pre>'; print_r(array_values($output)); echo '</pre>';

它是什么。

这是在带有Arch的Raspberry PI 2上运行的,我不知道这是否会产生任何影响?

引用的另一个perl文件是:

is_executable('test2.pl')

我已经在终端检查了它自己,这里按预期工作。但我不能通过PHP来实现它。

非常感谢任何帮助。

更新1

我发现如果我添加这行:

package test_sub; 

use strict;
use warnings;

use Exporter qw(import);
use Time::HiRes qw(usleep);

our @EXPORT_OK = qw(te);
our %EXPORT_TAGS = (all => \@EXPORT_OK );

sub te {
  my @var = @_;
  printf("settingup te for %d",$var);
}

对于运行它的test.pl脚本停止给出输出装置。

1 个答案:

答案 0 :(得分:2)

这里有两个问题:

首先:

在线下

printf("settingup te for %d",$var);

应改为

printf("settingup te for %d",@var);

没有初始化要打印的$ var变量,你在子程序中使用的@var数组。

第二

你应该知道如何编写一个简单的PHP脚本。

#!/usr/bin/php

<?php
exec("perl test.pl te 1",$output);
echo '<pre>'; print_r(array_values($output)); echo '</pre>';
?>

这适用于我和输出:

<pre>Array
(
    [0] => te chosen to(1)
    [1] => settingup te for 1
)
</pre>

perl脚本:

#!/usr/bin/perl -s

# Function definition
use test_sub qw( :all ) ;

use strict;
use warnings;

if ($ARGV[0] eq "te") 
{
  printf("te chosen to(%d)\n",$ARGV[1]);
  te($ARGV[1]);
}   

perl模块:

package test_sub; 

use strict;
use warnings;

use Exporter qw(import);
use Time::HiRes qw(usleep);

our @EXPORT_OK = qw(te);
our %EXPORT_TAGS = (all => \@EXPORT_OK );

sub te {
  my @var = @_;
  printf("settingup te for %d",@var);
}

php代码:

#!/usr/bin/php

<?php
exec("perl test.pl te 1",$output);
echo '<pre>'; print_r(array_values($output)); echo '</pre>';
?>

这也应该对你有用。