vote up 2 vote down star

I am trying to invoke a script which takes several seconds (web services with 3rd party) using the PHP exec call. After much struggling, I reduced this to the classic hello world example. The calling script looks like:

exec('/usr/bin/php /home/quote2bi/tmp/helloworld.php > /tmp/execoutput.txt 2>&1 &');

When I run this, the output (execoutput.txt) contains a copy of the invoking script page, not "hello world" as I expected.

Why can't I get this PHP script to execute using exec? Note that when I change the command to something like "ls -l", the output is a directory listing as expected. btw, in case it matters, I did chmod the called script to 755...

Update - I moved the exec call to the end of the calling script and at least now I don't see the calling script executed in the output. Thx to posters and I will try some of these ideas.

Help!

Thanks Steve

flag

4 Answers

vote up 7 vote down

What exec is doing is taking the rightmost command and appending it to your destination. If you have the shebang line in your php script, you shouldn't need to include the binary directive of the php interpreter.

if you just want the script's output, try:

exec('/home/quote2bi/tmp/helloworld.php > /tmp/execoutput.txt 2>&1 &')

however if you do not want the errors to be in the file, you should redirect the STDERR prior to outputting to the file. Like so:

exec('/home/quote2bi/tmp/helloworld.php 2> /dev/null > /tmp/execoutput.txt')

the above should only output the "Hello World" to the execoutput.

Edit:

Interesting you are getting this behaviour. You stated the command "ls" worked. Try making an alias for this and forward it to a file like so:

alias pexec='php /home/quote2bi/tmp/helloworld.php'

then

exec('pexec > /tmp/execoutput.txt 2>&1 &')

it seems to be a problem with the way exec handles input as opposed to the shell itself.

-John

link|flag
John - thanks for your reply, but unfortunately, it didn't work for me. When I tried: exec('/home/quote2bi/tmp/helloworld.php > /tmp/execoutput.txt 2>&1 &') ... I got the same results (current page in output file). The second exec blocked (missing the &) - when added I got the same results. – Steve Feb 19 '09 at 18:13
vote up 2 vote down

The problem is with PHP itself, it treats everything as $argv in the script. It doesn´t redirect the output to a file ou to /dev/null.

I faced the same problem some time ago. What I did is to create a runscript.php in /opt/php-bin and then inside this script run what It should be running. Something like this:

$script = $argv[1]
$params = implode(' ', array_slice($argv, 2));
$cmd    = "{$script} {$params} > /dev/null &";

$output = array();
$return = 0;
exec("php {$cmd}", $output, $return);

exit((int)$return);

And then you call it using:

exec('/opt/php-bin/runscript.php /path/to/your/script.php arg1 arg2')

It´s the only way I managed to get this working.

link|flag
vote up 0 vote down

Instead of just calling ".../file.php", try "php .../file.php" so that it knows how to run the file.

exec('php /usr/bin/php /home/quote2bi/tmp/helloworld.php');
link|flag
vote up 0 vote down

To avoid the stated problems of PHP in this area, why not put this in inside a shell script? PHP can then execute the shell script which has all the redirections handled internally.

If you need to dynamically change things, then why not write the shell script and then execute it (and of course, clean up afterwards)?

link|flag

Your Answer

Get an OpenID
or
never shown

Not the answer you're looking for? Browse other questions tagged or ask your own question.