mfischer Fri May 10 17:11:06 2002 EDT Modified files: /phpdoc/en/features commandline.xml Log: - Initial cli documentation. # Now let's get this into the right place
Index: phpdoc/en/features/commandline.xml diff -u phpdoc/en/features/commandline.xml:1.1 phpdoc/en/features/commandline.xml:1.2 --- phpdoc/en/features/commandline.xml:1.1 Mon May 6 06:43:56 2002 +++ phpdoc/en/features/commandline.xml Fri May 10 17:11:05 2002 @@ -1,18 +1,632 @@ <?xml version="1.0" encoding="iso-8859-1"?> -<!-- $Revision: 1.1 $ --> -<!-- - TODO: - - The command line options not in the - list, but in the -h output below: - - -e, -z - - It would be best to document these, and - collect more info about -c and -d! ---> +<!-- $Revision: 1.2 $ --> <chapter id="features.commandline"> <title>Using PHP from the command line</title> + <!-- NEW DOCUMENTATION STARTS --> + <para> + Since version 4.3, <literal>PHP</literal> supports a new + <literal>SAPI</literal> type (Server Application Programming Interface) + named <literal>CLI</literal> which means <emphasis>Command Line + Interface</emphasis>. As the name implies, this <literal>SAPI</literal> type + main focus is on developing shell (or desktop as well) applications with + <literal>PHP</literal>. There are quite some differences between the + <literal>CLI SAPI</literal> and other <literal>SAPI</literal>s which are + further explained throughout this chapter. + </para> + <para> + The <literal>CLI SAPI</literal> was released for the first time with + <literal>PHP 4.2.0</literal>, but was still experimental back then and had + to be explicitely enabled with <literal>--enable-cli</literal> when running + <literal>./configure</literal>. Since <literal>PHP 4.3.0</literal> the + <literal>CLI SAPI</literal> is no longer experimental and is therefore + <emphasis role="strong">always</emphasis> built and installed as the + <filename>php</filename> (called <filename>php.exe</filename> on Windows) + binary. + </para> + <para> + Remarkable differences of the <literal>CLI SAPI</literal> compared to other + <literal>SAPI</literal>s: + <itemizedlist> + <listitem> + <para> + Unlikely the <literal>CGI SAPI</literal>, no headers are written to the + output. + </para> + <para> + Though the <literal>CGI SAPI</literal> provies a way to suppress HTTP + headers, there's not equivalent switch to enable them in the <literal>CLI + SAPI</literal>. + </para> + </listitem> + <listitem> + <para> + The are certain &php.ini; directives which are overriden by the <literal>CLI + SAPI</literal> because the do not make sense in shell environments: + <table> + <title>Overriden &php.ini; directives</title> + <tgroup cols="3"> + <thead> + <row> + <entry>Directive</entry> + <entry><literal>CLI SAPI</literal> default value</entry> + <entry>Comment</entry> + </row> + </thead> + <tbody> + <row> + <entry><link linkend="ini.html-errors">html_errors</link></entry> + <entry>&false;</entry> + <entry> + It can be quite hard to read the error message in your shell when + it's cluttered with all those meaningless <literal>HTML</literal> + tags, therefore this directive defaults to &false;. + </entry> + </row> + <row> + <entry><link linkend="ini.implicit-flush">implicit_flush</link></entry> + <entry>&true;</entry> + <entry> + It is desired that any output coming from + <function>print</function>, <function>echo</function> and friends is + immidiately written to the output and not cached in any buffer. + </entry> + </row> + <row> + <entry><link +linkend="ini.max-execution-time">max_execution_time</link></entry> + <entry>0 (unlimited)</entry> + <entry> + Due to endless possibilities of using <literal>PHP</literal> in + shell environments, the maximum execution time has been set to + unlimited. Whereas applications written for the web are executed + within splits of a seconds, shell application tend to have a much + longer execution time. + </entry> + </row> + <row> + <entry><link +linkend="ini.register-argc-argv">register_argc_argv</link></entry> + <entry>&true;</entry> + <entry> + The global <literal>PHP</literal> variables <literal>$argc</literal> + (number of arguments passed to the application) and + <literal>$argv</literal> (array of the actual arguments) are always + registered and filled in with the appropriate values when using the + <literal>CLI SAPI</literal>. + </entry> + </row> + </tbody> + </tgroup> + </table> + </para> + <note> + <para> + This directives cannot be initialzied with another value from the + configuration file &php.ini; or a custom one (if specified). This is a + limitation because those default values are applied after all + configuration files have been parsed. However, their value can be changed + during runtime (which does not make sense for all of those directives, + e.g. <link linkend="ini.register-argc-argv">register_argc_argv</link>). + </para> + </note> + </listitem> + <listitem> + <para> + The <literal>CLI SAPI</literal> does <emphasis + role="strong">not</emphasis> change the current directory to the directory + of the executed script ! + </para> + <para> + Example showing the difference to the <literal>CGI SAPI</literal>: + <programlisting role="php"> +<![CDATA[ +<? + /* Our simple test application */ + echo getcwd(), "\n"; +?> +]]> + </programlisting> + </para> + <para> + When using the <literal>CGI</literal> version, the output is + <screen> +<![CDATA[ +$ pwd +/tmp +$ php-cgi -f another_directory/test.php +/tmp/another_directory +]]> + </screen> + This clearly shows that <literal>PHP</literal> changes its current + directory to the one of the executed script. + </para> + <para> + Using the <literal>CLI SAPI</literal> yields: + <screen> +<![CDATA[ +$ pwd +/tmp +$ php -f another_directory/test.php +/tmp +]]> + </screen> + This allows for greater flexibility when writing shell tools in + <literal>PHP</literal>. + </para> + <note> + <para> + The <literal>CGI SAPI</literal> supports the <literal>CLI SAPI</literal> + behaviour by means of the <literal>-C</literal> switch when ran from the + command line. + </para> + </note> + </listitem> + </itemizedlist> + </para> + <para> + The list of command line options provided by the <literal>PHP</literal> + binary can be queryied anytime by running <literal>PHP</literal> with the + <literal>-h</literal> switch: + <screen> +<![CDATA[ +Usage: php [options] [-f] <file> [args...] + php [options] -r <code> [args...] + php [options] [-- args...] + -s Display colour syntax highlighted source. + -w Display source with stripped comments and whitespace. + -f <file> Parse <file>. + -v Version number + -c <path>|<file> Look for php.ini file in this directory + -a Run interactively + -d foo[=bar] Define INI entry foo with value 'bar' + -e Generate extended information for debugger/profiler + -z <file> Load Zend extension <file>. + -l Syntax check only (lint) + -m Show compiled in modules + -i PHP information + -r <code> Run PHP <code> without using script tags <?..?> + -h This help + + args... Arguments passed to script. Use -- args when first argument + starts with - or script is read from stdin +]]> + </screen> + </para> + <para> + The <literal>CLI SAPI</literal> has three different ways of getting the + <literal>PHP</literal> code you want to execute: + <orderedlist> + <listitem> + <para> + Telling <literal>PHP</literal> to execute a certain file. + </para> + <para> + <screen> +<![CDATA[ +php my_script.php + +php -f my_script.php +]]> + </screen> + Both ways (using the <literal>-f</literal> switch or not) execute the + given file <filename>my_script.php</filename>. You can choose any file to + execute, your <literal>PHP</literal> scripts do not have to end with the + <filename>.php</filename> extension but can give them any name or extension + you want them to have. + </para> + </listitem> + <listitem> + <para> + Pass the <literal>PHP</literal> code to execute directly on the command + line. + </para> + <para> + <screen> +<![CDATA[ +php -r 'print_r(get_defined_constants());' +]]> + </screen> + Special care has to be taken in regards of shell variable substitution and + quoting usage. + </para> + <note> + <para> + Read the example carefully, thera are no beginning or end tags! The + <literal>-r</literal> switch simply does not need them. Using them will + lead to a parser error. + </para> + </note> + </listitem> + <listitem> + <para> + Provide the <literal>PHP</literal> code to execute via standard input + (<literal>stdin</literal>). + </para> + <para> + This gives the powerful ability to dynamically create + <literal>PHP</literal> code and feed it to the binary, as shown in this + (fictional) example: + <screen> +<![CDATA[ +$ some_application | some_filter | php | sort -u >final_output.txt +]]> + </screen> + </para> + </listitem> + </orderedlist> + You cannot combine any of the three ways to execute code. + </para> + <para> + Like every shell application not only the <literal>PHP</literal> binary + accepts a number of arguments but also your <literal>PHP</literal> script + can receive them. The number of arguments which can be passed to your script + is not limited by <literal>PHP</literal> (the shell has a certain size limit + in numbers of characters which can be passed, usually you won't hit this + limit). The arguments passed to your script are available in the global + array <literal>$argv</literal>. The zero index always contains the script + name (which is <literal>-</literal> in case the <literal>PHP</literal> code + is coming from either standard input or from the command line switch + <literal>-r</literal>). The second registered global variable is + <literal>$argc</literal> which contains the number of elements in the + <literal>$argv</literal> array (<emphasis role="strong">not</emphasis> the + number of arguments passed to the script). + </para> + <para> + As long as the arguments you want to pass to your script do not start with + the <literal>-</literal> character, there's nothing special to whatch out + for. Passing an argument to your script which starts with a + <literal>-</literal> will cause trouble because <literal>PHP</literal> + thinks it has to handle it. To prevent this use the argument list separator + <literal>--</literal>. After argument has been parsed by + <literal>PHP</literal>, every argument following it is passed + untoched/unparsed to your script. + </para> + <screen> +<![CDATA[ +# This will not execute the given code but will show the PHP usage +$ php -r 'var_dump($argv);' -h +Usage: php [options] [-f] <file> [args...] +[...] + +# This will pass the '-h' argument to your script and prevent PHP from showing it's +usage +$ php -r 'var_dump($argv);' -- -h +array(2) { + [0]=> + string(1) "-" + [1]=> + string(2) "-h" +} +]]> + </screen> + <para> + But, there's another way of using <literal>PHP</literal> for shell + scripting. You can write a script whose first line starts with + <literal>#!/usr/bin/php</literal> and then following the normal + <literal>PHP</literal> code included within the <literal>PHP</literal> + starting and end tags and set the execution attributes of the file + appropriately. This way it can be executed like a normal shell or perl + script: + <programlisting role="php"> +<![CDATA[ +#!/usr/bin/php +<? + var_dump($argv); +?> +]]> + </programlisting> + Assuming this file is named <filename>test</filename> in the current + directory, we can now do the following: + <screen> +<![CDATA[ +$ chmod 755 test +$ ./test -h -- foo +array(4) { + [0]=> + string(6) "./test" + [1]=> + string(2) "-h" + [2]=> + string(2) "--" + [3]=> + string(3) "foo" +} +]]> + </screen> + As you see no care has to be taken when passing parameters to your script + which start with <literal>-</literal>. + </para> + <para> + <table> + <title>Command line options</title> + <tgroup cols="2"> + <thead> + <row> + <entry>Option</entry> + <entry>Description</entry> + </row> + </thead> + <tbody> + <row> + <entry>-s</entry> + <entry> + <para> + Display colour syntax highlighted source. + </para> + <para> + This option uses the internal mechanism to parse the file and produces + a <literal>HTML</literal> highlighted version of it and writes it to + standard output. Note that all it does it to generate a block of + <literal><code> [...] </code></literal> + <literal>HTML</literal> tags, no <literal>HTML</literal> headers. + </para> + <note> + <para> + This option does not work together with the <literal>-r</literal> + option. + </para> + </note> + </entry> + </row> + <row> + <entry>-w</entry> + <entry> + <para> + Display source with stripped comments and whitespace. + </para> + <note> + <para> + This option does not work together with the <literal>-r</literal> + option. + </para> + </note> + </entry> + </row> + <row> + <entry>-f</entry> + <entry> + <para> + Parses and executed the given filename to the <literal>-f</literal> + option. This switch is optional and can be left out. Only providing + the filename to execute is sufficient. + </para> + </entry> + </row> + <row> + <entry>-v</entry> + <entry> + <para> + Writes the PHP and Zend version to standard output, e.g. + <screen> +$ php -v +PHP 4.3.0-dev (cli) +Zend Engine v1.2.1, Copyright (c) 1998-2002 Zend Technologies + </screen> + </para> + </entry> + </row> + <row> + <entry>-c</entry> + <entry> + <para> + With this option one can either specify a directory where to look for + &php.ini; or you can specify a custom <literal>INI</literal> file + directly (which does not need to be named &php.ini;), e.g.: + <screen> +$ php -c /custom/directory/ my_script.php + +$ php -c /custom/directory/custom-file.ini my_script.php + </screen> + </para> + </entry> + </row> + <row> + <entry>-a</entry> + <entry> + <para> + Runs PHP interactively. + <!-- + mfischer, 20020510: Couldn't come up with a decent useful description + of the current implementation of the interactive mode. + --> + </para> + </entry> + </row> + <row> + <entry>-d</entry> + <entry> + <para> + This option allows to set a custom value for any of the configuration + directives allowed in &php.ini;. The syntax is: + <screen> +<![CDATA[ +-d configuration_directive[=value] +]]> + </screen> + </para> + <para> + Examples: + <screen> +<![CDATA[ +# Ommiting the value part will set the given configuration directive to "1" +$ php -d max_execution_time -r '$foo = ini_get("max_execution_time"); var_dump($foo);' +string(1) "1" + +# Passing an empty value part will set the configuration directive to "" +php -d max_execution_time= -r '$foo = ini_get("max_execution_time"); var_dump($foo);' +string(0) "" + +# The configuration directive will be set to anything passed after the '=' character +$ php -d max_execution_time=20 -r '$foo = ini_get("max_execution_time"); +var_dump($foo);' +string(2) "20" +$ php -d max_execution_time=doesntmakesense -r '$foo = +ini_get("max_execution_time"); var_dump($foo);' +string(15) "doesntmakesense" +]]> + </screen> + </para> + </entry> + </row> + <row> + <entry>-e</entry> + <entry> + <para> + Generate extended information for debugger/profiler. + <!-- + mfischer, 20020510: Anyone who can provide more information what it + really does (even if it's only for developers) ? + --> + </para> + </entry> + </row> + <row> + <entry>-z</entry> + <entry> + <para> + Load Zend extension. If only a filename is given, PHP tries to load + this extension from the current default library path on your system + (usually specified <filename>/etc/ld.so.conf</filename> on Unix + systems). Passing a filename with an absolute path information will + not use the systems library search path. A relative filename with a + directory information will tell <literal>PHP</literal> only to try to + load the extension relative to the current directory. + </para> + </entry> + </row> + <row> + <entry>-l</entry> + <entry> + <para> + This option provides a convenient way to only perform a syntax check + on the given <literal>PHP</literal> code. On succes, the text + <literal>No syntax errors detected in <filename></literal> is + written to standard output and the shell return code is + <literal>0</literal>. On failure, the text <literal>Errors parsing + <filename></literal> in addition to the internal parser error + message is written to standard output and the shell return code is set + to <literal>255</literal>. + </para> + <para> + This option won't find fatal errors (like undefined functions). Use + <literal>-f</literal> if you would like to test for fatal errors too. + </para> + <note> + <para> + This option does not work together with the <literal>-r</literal> + option. + </para> + </note> + </entry> + </row> + <row> + <entry>-m</entry> + <entry> + <para> + Using this option, PHP prints out the built in (and loaded) PHP and + Zend modules: + <screen> +$ php -m +[PHP Modules] +xml +tokenizer +standard +session +posix +pcre +overload +mysql +mbstring +ctype + +[Zend Modules] + + </screen> + </para> + </entry> + </row> + <row> + <entry>-i</entry> + <entry> + This command line option calls <function>phpinfo</function>, and prints + out the results. If <literal>PHP</literal> is not working well, it is + advisable to make a <literal>php -i</literal> and see if any error + messages are printed out before or in place of the information tables. + Beware that the output is in <literal>HTML</literal> and therefore + quite huge. + </entry> + </row> + <row> + <entry>-r</entry> + <entry> + <para> + This option allows execution of <literal>PHP</literal> right from + within the command line. The <literal>PHP</literal> start and end tags + (<literal><?php</literal> and <literal>?></literal>) are + <emphasis role="strong">not needed</emphasis> and will cause a parser + errors. + </para> + <note> + <para> + Care has to be taken when using this form of <literal>PHP</literal> + to not collide with command line variable substitution done by the + shell. + </para> + <para> + Example showing a parser error + <screen> +<![CDATA[ +$ php -r "$foo = get_defined_constants();" +Command line code(1) : Parse error - parse error, unexpected '=' +]]> + </screen> + The problem here is that the shell performs variable substritution + even when using double quotes <literal>"</literal>. Since the + variable <literal>$foo</literal> is unlikely to be defined, it + expands to nothing which results in being the code passed to + <literal>PHP</literal> for executin in fact reads: + <screen> +<![CDATA[ +$ php -r " = get_defined_constants();" +]]> + </screen> + The correct way would be to use single quotes <literal>'</literal>. + The shell doesn't expand variables in strings quoted with single + quotes: + <screen> +<![CDATA[ +$ php -r '$foo = get_defined_constants(); var_dump($foo);' +array(370) { + ["E_ERROR"]=> + int(1) + ["E_WARNING"]=> + int(2) + ["E_PARSE"]=> + int(4) + ["E_NOTICE"]=> + int(8) + ["E_CORE_ERROR"]=> + [...] +]]> + </screen> + One still can easily run intro troubles when trying to get shell + variables into the code or using backslashes for escaping. You've + been warned. <!-- :-) --> + </para> + </note> + </entry> + </row> + <row> + <entry>-h</entry> + <entry> + With this option, you can get information about the actual list of + command line options and some one line descriptions about what they do. + </entry> + </row> + </tbody> + </tgroup> + </table> + </para> + <!-- NEW DOCUMENTATION ENDS --> + + <!-- OLD DOCUMENTED STARTS + mfischer, 20020510: I've commented out the start paragraphs of the old + documentation as it is meant to be replaced by the new one. <para> The command line options of the PHP executable are useful if you would like to debug or test your PHP setup, but they @@ -179,18 +793,17 @@ </tgroup> </table> </para> + --> <para> - The PHP executable can be used to run PHP scripts absolutely - independent from the web server. If you are on a Unix system, - you should add a special first line to your PHP script, and - make it executable, so the system will know, what program - should run the script. On a Windows platform you can associate - <literal>php.exe -q</literal> with the double click option of - the <literal>.php</literal> files, or you can make a batch file - to run the script through PHP. The first line added to the - script to work on Unix won't hurt on Windows, so you can write - cross platform programs this way. A simple example of writing - a command line PHP program can be found below. + The PHP executable can be used to run PHP scripts absolutely independent + from the web server. If you are on a Unix system, you should add a special + first line to your PHP script, and make it executable, so the system will + know, what program should run the script. On a Windows platform you can + associate <literal>php.exe</literal> with the double click option of the + <literal>.php</literal> files, or you can make a batch file to run the + script through PHP. The first line added to the script to work on Unix won't + hurt on Windows, so you can write cross platform programs this way. A simple + example of writing a command line PHP program can be found below. </para> <example> <title>Script intended to be run from command line (script.php)</title>