PHP has an exec function which lets you run a program. Why would you want to use a
PHP program to run a different program? You might want to run a file listing using
ls, or copy files using
cp, for example. When using
exec, you need to be thoughtful of the environment in which
PHP is running. A command line script that you run from a terminal, like
php test.php, runs in a different environment than a
php file run by Apache in responding to a web request. This post will take a look at the difference.
Suppose we have a little
PHP file called
whoami.php which runs the Linux
<?php $result = exec("whoami", $output, $retVar); echo "Output:".print_r($output, TRUE)."\n"; echo "retVar:".print_r($retVar, TRUE)."\n"; ?>
When I run this as a script from the command line,
php whoami.php, I see this output:
Output:Array (  => fullstackdev ) retVar:0
fullstackdev – that’s my user name on my computer.
If I put this file into my Apache root directory and run it by surfing to http://localhost/whoami.php, I see something different in my browser:
Output:Array (  => www-data ) retVar:0
If you have Apache up and running, you might want to try this for yourself.
At first, seeing this output may seem strange. Why does
whoami return a different value when I run this script in the browser? The answer is that it’s not “me” running the script. It’s Apache, or more accurately, the “Apache user”. When Apache was installed on my system (Ubuntu 16.04), an Apache “user” was created which is responsible for running the Apache web server process. This user is named “www-data”.
You can also see who the Apache user is by listing the Apache processes from the command line with
ps -ef|grep apache (or
ps -ef|grep httpd). Here’s the output on my system, which again shows the Apache user being “www-data”:
ps -ef|grep apache .. www-data 29172 29963 0 07:35 ? 00:00:00 /usr/sbin/apache2 -k start ...
This is something to keep in mind when comparing the results of a
PHP script that you run in the browser versus one you run from the command line.
Usually, when running
PHP scripts as Apache, it’s not relevant that “www-data” is running that script.
But there are cases where it does matter, and the
exec function can be one of them. For example, if your
PHP script uses
rsync, or touch files in your own personal
.ssh directory, you will probably run into trouble. The “www-data” user does not have access to your
.ssh files. That user may not even have its own home directory, where
.ssh would normally be located.
Here’s one final tip. If you’re trying to run commands that use passwordless ssh from Apache, you may want to rethink what you’re trying to do. There may be other ways to do what you want:
cron jobs, or
Got comments? Send me an email at email@example.com. If you found this interesting, you can hit the subscribe button above. I write a new post about once a week.