PHP is most commonly used for web development, but it also has a powerful Command Line Interface (CLI). This allows developers to run PHP scripts directly in the terminal, automate tasks, interact with the shell, and even run PHP without a web server.


Running PHP Scripts from the Command Line

The basic way to execute a PHP script is:

php script.php
  • php is the interpreter.
  • script.php is the file containing PHP code.

If the script does not have the .php extension, you can still run it as long as it contains valid PHP code.

You can also run inline code:

php -r "echo 1;"

Here, -r runs the code without needing <?php ... ?> tags.


Command-Line Options

The list of command line options provided by the PHP binary can be queried at any time by running PHP with the -h switch:

>php -h
Usage: php [options] [-f] <file> [--] [args...]
   php [options] -r <code> [--] [args...]
   php [options] [-B <begin_code>] -R <code> [-E <end_code>] [--] [args...]
   php [options] [-B <begin_code>] -F <file> [-E <end_code>] [--] [args...]
   php [options] -S <addr>:<port> [-t docroot] [router]
   php [options] -- [args...]
   php [options] -a

  -a               Run as interactive shell (requires readline extension)
  -c <path>|<file> Look for php.ini file in this directory
  -n               No configuration (ini) files will be used
  -d foo[=bar]     Define INI entry foo with value 'bar'
  -e               Generate extended information for debugger/profiler
  -f <file>        Parse and execute <file>.
  -h               This help
  -i               PHP information
  -l               Syntax check only (lint)
  -m               Show compiled in modules
  -r <code>        Run PHP <code> without using script tags <?..?>
  -B <begin_code>  Run PHP <begin_code> before processing input lines
  -R <code>        Run PHP <code> for every input line
  -F <file>        Parse and execute <file> for every input line
  -E <end_code>    Run PHP <end_code> after processing all input lines
  -H               Hide any passed arguments from external tools.
  -S <addr>:<port> Run with built-in web server.
  -t <docroot>     Specify document root <docroot> for built-in web server.
  -s               Output HTML syntax highlighted source.
  -v               Version number
  -w               Output source with stripped comments and whitespace.
  -z <file>        Load Zend extension <file>.

  args...          Arguments passed to script. Use -- args when first argument
                   starts with - or script is read from stdin

  --ini            Show configuration file names

  --rf <name>      Show information about function <name>.
  --rc <name>      Show information about class <name>.
  --re <name>      Show information about extension <name>.
  --rz <name>      Show information about Zend extension <name>.
  --ri <name>      Show configuration for extension <name>.

Input/Output Streams

PHP CLI works with standard I/O streams:

  • STDIN - Standard input (read).
  • STDOUT - Standard output (write).
  • STDERR - Error output.

Usage example:

echo "Enter your name: ";
$name = trim(fgets(STDIN));
fwrite(STDOUT, "Hello, $name!\n");
fwrite(STDERR, "This is an error message\n");

Run it:

php input.php

Enter your name: Orkhan
Hello, Orkhan!
This is an error message

Interactive Shell (REPL)

PHP CLI provides an interactive shell mode:

php -a

Allows entering PHP code line by line, similar to Python's REPL (Read - Eval - Print Loop).

php -a
Interactive shell

php > echo 2+3;
5
php > echo strtoupper("cli");
"CLI"

Built-in Web Server

Since PHP 5.4, CLI includes a lightweight web server for development:

php -S localhost:8000
  • Serves files in the current directory.
  • Useful for testing quickly without Apache/Nginx.
  • Optionally specify a router script:
php -S localhost:8000 router.php

router.php can control how requests are handled (useful for frameworks).


php.ini Settings for CLI

PHP CLI uses its own php.ini file (separate from Apache/Nginx).

Check with:

php --ini

You might see:

Configuration File (php.ini) Path: /etc/php/8.2/cli
Loaded Configuration File:         /etc/php/8.2/cli/php.ini

Common CLI-related settings:

  • memory_limit - Limit memory for scripts.
  • max_execution_time - Default is 0 (unlimited in CLI).
  • error_reporting - Control verbosity of error messages.
  • display_errors - Show or hide errors.
  • include_path - Paths where PHP looks for included files.
  • auto_prepend_file / auto_append_file - Automatically include scripts.

CLI usually ignores timeouts (max_execution_time) since it's meant for long-running scripts.


Execute PHP Script as Shell Script

You can run a PHP file like a shell script by using a shebang and making the file executable.

Put a shebang as the very first line:

#!/usr/bin/env php
<?php
// your PHP code...

Make the file executable:

chmod +x myscript.php

Run it:

./myscript.php arg1 arg2

Source: Orkhan Alishov's notes