I have a PHP script that I will be running in one of three ways:
- interactively, from the Linux command line
- as a cron tab, on a Linux box
- as a web page, with Apache and mod_php
In order to do this I found that I can do the following:
#!/usr/bin/php -q <?php @ob_end_clean(); if (isset($argv)) { define("SHELL",true); $options = getopt("c"); if (isset($options['c'])) { echo "Running as a cron job ...\n"; define("INTERACTIVE",false); } else { echo "Running interactively ...\n"; define("INTERACTIVE",true); } } else { echo "Running via Apache... "; define("INTERACTIVE",false); define("SHELL",false); }
The general idea is:
- Line 1: tell the Linux shell that the command, when executed directly, should be interpreted by php, and not the shell that you’re running in (“-q” tells PHP to suppress any HTTP headers).
- Line 3. If the script is running via Apache then tell it to remove the first line which has already been output. Use the @ to suppress warnings as
ob_end_clean
isn’t available when running from the CLI. - Use the
$argv
array to determine if we are running via CLI, it’s not set when run through mod_php - When executed from cron, we will pass a parameter “-c” to indicate it should run in “non-interactive” mode, use
getopt
to read the parameters andisset
to check if the “-c” parameter was passed. - Now, the
SHELL
andINTERACTIVE
constants can be used to determine if we are in a shell or Apache, and interactive or cron-mode, respectively.
Finally, don’t forget to chmod the script to make it executable.
chmod 700 script.php