Using Console_CommandLine in web environments
Introduction
So there is a nice shell script that does everything it ever should do, and other people - without shell access - have to use it now. Or the script needs to be called regularly from outside the server it is running on. What now?
If your server runs a HTTP server with PHP, the problem is already solved
because Console_Commandline supports reading HTTP
$_GET
and $_POST
variables
out of the box.
A simple example
The scripts task in this example is to print out the current time. The user may customize the output by specifying the format string.
Between shell and web access is only one difference: On the web, the text
shall be printed out in large letters by wrapping it in a
h1
tag.
Console_CommandLine by itself cares about reading
HTTP GET and POST variables when it is run through PHP's CGI or web
server (e.g. Apache with mod_php
). Let's try it:
<?php
require_once 'Console/CommandLine.php';
$parser = new Console_CommandLine();
$parser->description = 'Print out the current time';
$parser->version = '1.23';
$parser->addOption(
'format',
array(
'short_name' => '-f',
'long_name' => '--format',
'action' => 'StoreString',
'default' => 'Y-m-d H:i:s',
'description' => 'date()-compatible format string',
)
);
$result = $parser->parse();
echo date($result->options['format']) . "\n";
?>
Shell output
$ php web.php
2009-06-13 10:10:15
$ php web.php --help
Print out the current time
Usage:
web.php [options]
Options:
-f format, --format=format date()-compatible format string
-h, --help show this help message and exit
-v, --version show the program version and exit
$ php web.php --format=d.m.Y
13.06.2009
Web output without parameters
2009-06-13 10:10:15
Web output for web.php?--help
Print out the current time Usage: --help [options]
Options: -f format, --format=format date()-compatible format string -h,
--help show this help message and exit -v, --version show the program
version and exit
Web output for web.php?format=d.m.Y
13.06.2009
The functionality is there, but it does not look nice.
When using
GET
andPOST
parameters, Console_CommandLine accepts three types of parameter names:
short_name
as configured for the option
long_name
as configuredoption name as passed as first parameter to Console_CommandLine::addOption().
So in our example, one can call
web.php?-f=d.m.Y
web.php?--format=d.m.Y
web.php?format=d.m.Y
For arguments, the argument name has to be used as GET or POST key.
A prettier example
Building upon our previous example, we care about pretty output here:
-
Time wrapped in
h1
tags. -
Monospaced help text
-
Monospaced error text
While we did not catch any errors - as there are nearly none to produce in that example - the code contains it now for completeness.
First and foremost, we check if we are in an HTTP environment by checking
the SAPI (Server API) name. If we are not in CLI, we echo out
<h1>
and </h1>
.
To get the help text printed with monospaced text, a custom renderer is defined. For the sake of easiness, the default console renderer is extendet since it does nearly everything we need here.
<?php
require_once 'Console/CommandLine.php';
$parser = new Console_CommandLine();
$parser->description = 'Print out the current time';
$parser->version = '1.23';
$parser->addOption(
'format',
array(
'short_name' => '-f',
'long_name' => '--format',
'action' => 'StoreString',
'default' => 'Y-m-d H:i:s',
'description' => 'date()-compatible format string',
)
);
class HtmlRenderer extends Console_CommandLine_Renderer_Default
{
public function usage()
{
return '<pre>' . parent::usage() . '</pre>';
}
public function error($error)
{
return '<pre>' . parent::error($error) . '</pre>';
}
}
$parser->accept(new HtmlRenderer());
$http = (php_sapi_name() != 'cli');
try {
$result = $parser->parse();
if ($http) {
echo '<h1>';
}
echo date($result->options['format']) . "\n";
if ($http) {
echo '</h1>';
}
} catch (Exception $exc) {
$parser->displayError($exc->getMessage());
}
?>