0

My OS is Ubuntu, 14.04, I have lampp. I want to execute a perl file from PHP through my browser. I simply use the exec function (in PHP) to do that and it works. I have seen similar questions in stackoverflow but they aren't related to this.

Example Perl File named test.pl:

#!usr/bin/perl
print "This is a perl file";

Example PHP File named test.php:

<?php
$perl=exec('perl test.pl',$out,$r); //Works successfully
print_r($out); //Outputs Array ( [0]=>This is a perl file )
?>

But I need to execute some other perl file. I can execute that successfully from the command line. Lets assume name of that file is: test2.pl

When command is given in command line as

perl test2.pl -u argument1 -m argument2 -p testresult

It takes a fraction of second to execute the above command. I get the output in command line.

But when I execute the same command from PHP as:

<?php
$perl=exec('perl test2.pl -u argument1 -m argument2 -p testresult',$out,$r);
print_r($out); //Outputs Array (  )
?>

My output is

Array
(
)

Now I am not getting the output, however the perl file is executing, but I am unable to get the output in $out . I can assure you that the perl file was executed because it also makes some kind of file after execution.

I don't understand why its not giving me the output.

I have also tried following functions in php already:,

exec
system
shell_exec

None of them is giving me the output, they are working fine for test.pl but not for test2.pl (test.pl and test2.pl are mentioned above).

My objective is to get the output.

edit: Solved. Thanks to hrunting's answer.

1 Answers1

2

Your second Perl script isn't outputting anything to STDOUT. In your first Perl script, the print statement specifies no output destination, so it will default to STDOUT. In the second Perl script, every print statement either goes to a file or goes to STDERR (with the exception of your --help message). As the PHP exec() function only captures output on STDOUT, you get no output in PHP when you run it, even though you see output when you run it manually.

You have a few options. Two are presented below:

  1. Redirect STDERR to STDOUT when calling exec()

    `exec('perl test.pl 2>&1', $out, $r);`
    
  2. Write output messages to STDOUT in your Perl script

    If the output is expected, I would change your print STDERR calls to simple print calls.

There are more options in this Stack Overflow answer:

Community
  • 1
  • 1
hrunting
  • 3,857
  • 25
  • 23
  • That solved it! I had almost given up all hope and thought that such kind of perl script cannot be executed. Thanks a lot. I tried it and it did the trick. – Candice Williams Jul 20 '14 at 14:40