Как запустить php скрипт из консоли linux
Указание конкретного файла для запуска.
Оба способа (с указанием опции -f или без) запустят файл my_script.php . Нет ограничений, какой файл запускать; в частности, файлы не обязаны иметь расширение .php .
Передать PHP-код напрямую в командной строке.
Необходимо быть особо осторожным при использовании этого способа, т.к. может произойти подстановка переменных оболочки при использовании двойных кавычек.
Замечание:
Внимательно прочтите пример: в нем нет открывающих и закрывающих тегов! Опция -r просто в них не нуждается, и их использование приведёт к ошибке разбора.
Передать запускаемый PHP-код через стандартный поток ввода ( stdin ).
Это даёт мощную возможность создавать PHP-код и передавать его запускаемому файлу, как показано в этом (вымышленном) примере:
Как и любое другое консольное приложение, бинарный файл PHP принимает аргументы, но PHP-скрипт также может получать аргументы. PHP не ограничивает количество аргументов, передаваемых в скрипт (оболочка консоли устанавливает некоторый порог количества символов, которые могут быть переданы; обычно этого лимита хватает). Переданные аргументы доступны в глобальном массиве $argv . Первый индекс (ноль) всегда содержит имя вызываемого скрипта из командной строки. Учтите, что если код вызывается на лету из командной строки с помощью опции -r, значением $argv[0] будет "Стандартный поток" ("Standard input code"); до PHP 7.2.0 это был дефис ( "-" ). То же самое верно и для кода, переданного через конвейер из STDIN .
Вторая зарегистрированная глобальная переменная — это $argc , содержащая количество элементов в массиве $argv (а не количество аргументов, переданных скрипту).
Если передаваемые аргументы не начинаются с символа — , то особых проблем быть не должно. Передаваемый в скрипт аргумент, который начинается с — создаст проблемы, т.к. PHP решит, что он сам должен его обработать. Для предотвращения подобного поведения используйте разделитель списка аргументов — . После того, как этот разделитель будет проанализирован PHP, все последующие аргументы будут переданы в скрипт нетронутыми.
Пример #1 Запуск PHP-скрипта как консольного
Предполагая, что этот файл назван test и находится в текущей директории, можно сделать следующее:
Как можно увидеть, в этом случае не нужно заботиться о передаче параметров, которые начинаются с — .
Исполняемый PHP-файл может использоваться для запуска PHP-скриптов независимо от веб-сервера. В случае работы в Unix-подобной системе, необходимо добавить в первую строку файла #! (называемый также "shebang") чтобы указать, какая из программ должна запускать скрипт. На Windows-платформах можно назначить обработчик php.exe для файлов с расширениями .php или создать пакетный (.bat) файл для запуска скриптов посредством PHP. Строка, добавляемая в начале скрипта для Unix-систем, не влияет на их работу в ОС Windows, таким образом можно создавать кроссплатформенные скрипты. Ниже приведён простой пример скрипта, выполняемого из командной строки:
Пример #2 Скрипт, предназначенный для запуска из командной строки (script.php)
if ( $argc != 2 || in_array ( $argv [ 1 ], array( ‘—help’ , ‘-help’ , ‘-h’ , ‘-?’ ))) <
?>
Это консольный PHP-скрипт, принимающий один аргумент.
Использование:
<?php echo $argv [ 0 ]; ?> <option>
<option> Любое слово, которое вы хотели бы
напечатать. Опции —help, -help, -h,
или -? покажут текущую справочную информацию.
В приведённом выше скрипте в первой строке содержится shebang, указывающий что этот файл должен запускаться PHP. Работа ведётся с CLI -версией, поэтому не будет выведено ни одного HTTP -заголовка.
Скрипт сначала проверяет наличие обязательного одного аргумента (в дополнение к имени скрипта, который также подсчитывается). Если их нет, или если переданный аргумент был —help, -help, -h или -?, выводится справочное сообщение с использованием $argv[0] , которое содержит имя выполняемого скрипта. В противном случае просто выводится полученный аргумент.
Для запуска приведённого примера в Unix-системе, нужно сделать его исполняемым и просто выполнить в консоли script.php echothis или script.php -h. В Windows-системе можно создать пакетный файл:
Пример #3 Пакетный файл для запуска PHP-скрипта из командной строки (script.bat)
Также можно ознакомиться с модулем Readline для получения дополнительных функций, которые можно использовать для улучшения консольного PHP-скрипта.
В Windows запуск PHP можно настроить без необходимости указывать C:\php\php.exe или расширение .php . Подробнее эта тема описана в разделе Запуск PHP из командной строки в Microsoft Windows.
Замечание:
В Windows рекомендуется запускать PHP под актуальной учётной записью пользователя. При работе в сетевой службе некоторые операции не будут выполнены, поскольку "сопоставление имён учётных записей и идентификаторов безопасности не выполнено".
PHP через консоль в Linux / Ubuntu

Для того, чтобы иметь возможность выполнять php скрипты через консоль, необходимо установить программу php cli. Делается это командой
после чего можно просто прописывать путь к скрипту
и получать в консоли результат его выполнения. Так скрипт

выведет вот такое
такое, конечно же, не очень удобно читать, поэтому мы приведем его к такому виду

символы переноса строки делают свое дело, и мы получаем вполне читабельный вариант
а вот с передачей GET параметров они накосячили.. Для того, чтобы получить то, что было передано в GET, нужно, во-первых, передавать параметры не так, как мы привыкли, а просто прописав значения через пробел после имени скрипта
которые затем можно получить, разобрав массив $argv

что выведет нам вот такой
т.е., если нам нужно получить чисто параметры, то разбор массива начинаем не с нуля, как обычно, а с 1, т.к. в нуле мы получим имя скрипта.
Как по мне, для полноценной отладки скриптов такое чудо не годится, но для каких то други задач, ну и просто мелочи какие то тестировать – вполне ничего.
Программирование в PHP для командной строки
Наверное, ни для кого не секрет, что достаточно просто в первой строке PHP скрипта написать
#!/usr/bin/env php
и такой скрипт можно будет выполнить как обычную программу в Linux.
Прежде всего, нам нужно проверить, есть ли у нас право на запись в ту самую папку, которая содержит в себе конфиги виртуальных хостов, а обычно для этого нужны root права. Проверить это довольно просто:
- $virtual_hosts_dir = "/etc/apache2/sites-available/" ;
- if ( ! is_dir ( $virtual_hosts_dir ) || ! is_writable ( $virtual_hosts_dir ) )
- <
- echo "You must run this script as root! \n " ;
- exit ;
- >
Получение информации из параметров
- if ( $argc > 1 )
- <
- for ( $i = 1 ; $i < $argc ; $i ++ )
- <
- $option = explode ( "=" , $argv [ $i ] ) ;
- switch ( $option [ 0 ] )
- <
- case "-h" :
- case "—add-to-hosts" :
- $add_to_hosts = true ;
- break ;
- case "-n" :
- case "—no-add-to-hosts" :
- $add_to_hosts = false ;
- break ;
- case "-a" :
- case "—server-alias" :
- if ( isset ( $option [ 1 ] ) )
- <
- $server_alias = $option [ 1 ] ;
- >
- else
- <
- echo "Wrong option: < $argv [ $i ]>\n " ;
- >
- break ;
- case "-d" :
- case "—document-root" :
- if ( isset ( $option [ 1 ] ) )
- <
- if ( $option [ 1 ] == "default" )
- <
- $document_root = $default_doc_root
- >
- else if ( is_dir ( dirname ( $option [ 1 ] ) ) )
- <
- $document_root = $option [ 1 ] ;
- >
- >
- else
- <
- echo "Wrong option: < $argv [ $i ]>\n " ;
- >
- break ;
- default :
- if ( substr ( $argv [ $i ] , 1 , 1 ) == ‘-‘ )
- <
- echo "Unknown option: < $argv [ $i ]>\n " ;
- >
- break ;
- >
- >
- >
Потоки ввода\вывода
- $line = fgets ( STDIN ) ;
- $stdin = fopen ( "php://stdin" , "r" ) ;
- $line1 = gets ( $stdin ) ;
- $line2 = gets ( $stdin ) ;
- fclose ( $stdin ) ;
В данном случае мы сначала открываем поток, считываем из него две строки и закрываем его.
С записью аналогично, хотя я предпочитаю для вывода на экран просто использовать echo.
Продолжаем писать наш скрипт. Пока у нас нет хоть какой-то строки в качестве имени хоста, продолжаем просить пользователя, чтобы он что-то ввел:
- while ( ! $server_alias )
- <
- echo "Enter your hostname: " ;
- $server_alias = trim ( fgets ( STDIN ) ) ;
- >
Теперь, спросим у пользователя, нужно ли добавлять информацию о этом хосте в /etc/hosts, но спрашиваем только в том случае, если эта информация не была передана в качестве параметра. Так как скрипт я писал себе для повседневной работы, то никаких реальных сайтов у меня не будет и чаще всего нужно будет добавлять хост в /etc/hosts, поэтому если мы ничего не вводим, а просто нажимаем Enter то это принимается как согласие:
- if ( $add_to_hosts === null )
- <
- echo "Add $server_alias to your /etc/hosts ? (Y/N) [Y]: " ;
- $line = trim ( fgets ( STDIN ) ) ;
- if ( $line == ‘n’ || $line == ‘N’ )
- <
- $add_to_hosts = false ;
- >
- else
- <
- $add_to_hosts = true ;
- >
- >
То же самое и с корневой директорией сайта:
- if ( ! $document_root )
- <
- $default_doc_root = $default_doc_root . ‘/’ . $server_alias ;
- echo "Enter your document root [ $default_doc_root ]: " ;
- $line = trim ( fgets ( STDIN ) ) ;
- if ( $line && is_dir ( dirname ( $line ) ) )
- <
- $document_root = $line ;
- >
- else
- <
- $document_root = $default_doc_root ;
- >
- >
Генерация конфиг-файла
- if ( ! is_dir ( $document_root ) )
- <
- mkdir ( $document_root ) ;
- >
Мы спрашивали у пользователя по поводу добавления хоста в /etc/hosts. Сделаем это, если он согласился:
- if ( $add_to_hosts )
- <
- $hosts = file_get_contents ( "/etc/hosts" ) ;
- $hosts .= "127.0.0.1 \t $server_alias \n " ;
- file_put_contents ( "/etc/hosts" , $hosts ) ;
- >
Собственно так выглядит шаблон нашего конфига:
- $host_template = <<<HOST
- <VirtualHost *:80>
- ServerAdmin i@bogus.in
- ServerAlias $server_alias
- DocumentRoot $document_root
- <Directory $document_root>
- Options Indexes FollowSymLinks MultiViews
- AllowOverride All
- Order allow,deny
- allow from all
- </Directory>
- ErrorLog \$
/$server_alias-error.log; - LogLevel warn
- CustomLog \$
/$server_alias-access.log combined - </VirtualHost>
- HOST ;
Ну и теперь просто запишем конфиг в файл и напомним пользователю о том, что конфиг теперь нужно еще и активировать с помощью a2ensite:
- file_put_contents ( "/etc/apache2/sites-available/ $server_alias " , $host_template ) ;
- echo "Apache config for this hostname created successfully! Don’t forget to run a2ensite $server_alias \n " ;
Скрипт написан. Нужно сохранить его в файл и не забыть установить флаг +x, чтобы его можно было запускать как программу:
chmod +x a2addsite
Использование
Теперь скрипт можно использовать. Можно как вводить всю информацию в консоли:
% sudo ./a2addsite
Add test.local to your /etc/hosts? (Y/N) [Y]:
Enter your document root [/home/www/test.local]:
Apache config for this hostname created successfully! Don’t forget to run a2ensite test.local
так передавать всю или часть информации скрипту в качестве параметров при вызове:
% sudo ./a2addsite —server-alias=test2.local —add-to-hosts —document-root=default
Apache config for this hostname created successfully! Don’t forget to run a2ensite test2.local
Выводы
PHP можно использовать не только для разработки сайтов, но и для решения мелких локальных задач на компьютере. Скрипт я писал под себя и, наверняка, кто-то из Вас переделает его под свои нужды.
Исходный код скрипта
php в командной строке linux
Хотя в CGI SAPI имеется способ подавления HTTP-шапок, эквивалентного переключателя для их включения в CLI SAPI нет.
Примечание: Эти директивы не могут быть инициализированы другим значением из файла конфигурации php.ini или специального файла (если специфицирован). Это является некоторым ограничением, поскольку эти значения по умолчанию применяются после разбора всех файлов конфигурации. Однако их значение может быть изменено на этапе прогона программы (что не имеет смысла для всех других директив, например, для register_argc_argv).
Легче работать в среде оболочки, когда определены следующие константы:
Таблица 24-2. Специфические CLI-константы
Вам не нужно явно закрывать эти потоки, это делается РНР автоматически.
CLI SAPI не изменяет текущую директорию на директорию исполняемого скрипта!
Пример, показывающий отличие CGI SAPI :
Это ясно показывает, что PHP изменяет свою текущую директорию на директорию исполняемого скрипта.
Использование CLI SAPI даёт:
Сказать PHP выполнить определённый файл.
Передать PHP код для выполнения непосредственно из командной строки.
Особого внимания требует замена переменных оболочки и использование кавычек.
Вы не можете комбинировать эти три способа при выполнении кода.
Приняв, что файл называется test и находится в текущей директории, мы можем выполнить:
Таблица 24-3. Опции командной строки
Отображать синтаксис в цвете.
Отобразить исходный текст без комментариев и пробелов.
Разбирает и выполняет данный файл. Этот переключатель является необязательным и может быть опущен. Достаточно предоставить имя файла для выполнения.
Запускает PHP интерактивно.
Генерирует расширенную информацию для debugger/profiler.
Пример, выводящий ошибку разборщика:
Если вы используете оболочку/shell иначе, чем sh/bash, у вас могут появиться новые вопросы. Отправляйте bug report или mail по адресу phpdoc@lists.php.net. Можно легко столкнуться с проблемами при попытке получить переменные оболочки в коде или использовании обратных слэшей (/) для замен/escaping.
Вы предупреждены.
| Пример 24-1. Скрипт, предназначенный для запуска из командной строки (script.php) |
| Пример 24-2. Пакетный/Batch-файл для запуска PHP-скрипта в командной строке (script.bat) |
См. также в документации по расширению Readline о функциях, которые можно использовать для усовершенствования вашего РНР-приложения для командной строки.
Как запустить PHP скрипт в командной строке (без веб-сервера)
Как запустить PHP скрипт в командной строке Windows
Для запуска PHP в командной строке необязательно устанавливать веб-сервер, достаточно скачать и распаковать архив с PHP интерпретатором. О том, где скачать PHP с официального сайта и как разобраться с версиями, смотрите эту статью.
Если вы часто будете запускать PHP скрипты из командной строки Windows, то настоятельно рекомендуется Добавить путь до PHP в переменную окружения PATH в Windows. Благодаря этому не придётся каждый раз указывать полный путь до файла php.exe.
Теперь, когда PHP установлен и путь до php.exe добавлен в переменную окружения Windows, открываем командную строку, для этого нажмите сочетание клавиш Win+x и выберите Windows PowerShell.
Для проверки, что нормально установилось, посмотрим справку по PHP:

На самом деле, мы запускаем файл php.exe, но расширение можно отбросить. То есть предыдущая запись эквивалентна
Опцию -f можно отбросить, то есть предыдущая и следующая команды равнозначны:
Я создал тестовый файл, который расположен по пути C:\Users\Alex\Documents\PHP\test.php тогда я могу запустить его в PHP так:
Как передать аргументы PHP скрипту в командной строке
Для передачи скрипту аргументов, перечислите их после имени файла, разделяя пробелом. Если сами аргументы содержат пробелы или другие символы, которые имеют особое значение для оболочки командной строки, то поместите эти аргументы и одинарные или двойные кавычки.
Пример запуска PHP скрипта с тремя аргументами:
Как в PHP скрипте обратиться к аргументам
Переданные аргументы содержаться в массиве $argv. Причём, порядковый номер аргумента соответствует номеру в массиве. То есть первый аргумент будет помещён в $argv[1], второй в $argv[2] и так далее.
Самый первый элемент массива $argv[0] содержит полный путь до запускаемого скрипта.
Содержимое файла test.php:
Запустим его и передадим в скрипт три аргумента:

Как в PHP получить данные от пользователя в консоли
Благодаря передаваемым аргументам, скрипт может выполнять действия не только с прописанными в нём данными, но и с другими значениями, указанными при запуске скрипта.
Кстати, при работе в окружении веб-сервера, то есть когда PHP скрипт выполняет задачи для веб-сайта, возможность передать ему аргументы реализована с помощью HTTP методов GET и POST. Эти аргументы передаются перед запуском скрипта, и уже после запуска PHP скрипта новые данные отправить нельзя — нужно ждать завершения работы программы, и при необходимости запустить её ещё раз с новыми данными.
Во время работы скрипта может потребоваться ввод новых данных, в консоли это достигается с помощью строки запроса, в которую пользователь может ввести значение и нажать Enter для передачи его скрипту. В контексте веб-сайта такой возможности — передать данные уже во время выполнения скрипта — нет. То есть консольный запуск PHP скриптов с аргументами не только проще (не нужно возиться с HTML формой), но и даже более гибкий.
В PHP для запроса пользователю используется функция readline.
Эта функция одинаково работает и на Windows и на Linux. Причём на Linux она имеет интерактивные возможности Bash, например, сохраняет историю ввода, к которой можно вернуться с помощью стрелок. На Windows эта возможность появилась начиная с PHP 7.1.
Если сильно надо, можно настроить автозавершение вводимых данных. Все функции GNU Readline рассмотрены здесь. Я же коснусь только readline, которая считывает введённую пользователем строку. С этой функцией можно указать один опциональный аргумент — строку, которая будет показана пользователю в приглашении.
Пример консольного PHP скрипта, которые запрашивает у пользователя данные в приглашении командной строки:

Выполнение команд PHP в интерактивном режиме
Если вам это нужно, то можно работать с интерпретатором PHP в интерактивном режиме, вводя код построчно. При этом код выполняется после нажатия кнопки Enter, но значения переменных сохраняются в рамках одной сессии. То есть вы можете присвоить значение какой-либо переменной, а затем использовать его в других строках.
Для запуска интерактивного шелла:

Запуск отдельных команд PHP
Для выполнения отдельных команд используйте опцию -r:
Linux.yaroslavl.ru
Хотя в CGI SAPI имеется способ подавления HTTP-шапок, эквивалентного переключателя для их включения в CLI SAPI нет.
Примечание: эти директивы не могут быть инициализированы другим значением из файла конфигурации php.ini или специального файла (если специфицирован). Это является некоторым ограничением, поскольку эти значения по умолчанию применяются после разбора всех файлов конфигурации. Однако их значение может быть изменено на этапе прогона программы (что не имеет смысла для всех других директив, например, для register_argc_argv).
Легче работать в среде оболочки, когда определены следующие константы:
Таблица 24-2. Специфические CLI-константы
Вам не нужно явно закрывать эти потоки, это делается РНР автоматически.
CLI SAPI не изменяет текущую директорию на директорию исполняемого скрипта!
Пример, показывающий отличие CGI SAPI :
Это ясно показывает, что PHP изменяет свою текущую директорию на директорию исполняемого скрипта.
Использование CLI SAPI даёт:
Сказать PHP выполнить определённый файл.
Передать PHP код для выполнения непосредственно из командной строки.
Особого внимания требует замена переменных оболочки и использование кавычек.
Вы не можете комбинировать эти три способа при выполнении кода.
Приняв, что файл называется test и находится в текущей директории, мы можем выполнить:
Таблица 24-3. Опции командной строки
Отображать синтаксис в цвете.
Отобразить исходный текст без комментариев и пробелов.
Разбирает и выполняет данный файл. Этот переключатель является необязательным и может быть опущен. Достаточно предоставить имя файла для выполнения.
Запускает PHP интерактивно.
Генерирует расширенную информацию для debugger/profiler.
Пример, выводящий ошибку разборщика:
Если вы используете оболочку/shell иначе, чем sh/bash, у вас могут появиться новые вопросы. Отправляйте bug report или mail по адресу phpdoc@lists.php.net. Можно легко столкнуться с проблемами при попытке получить переменные оболочки в коде или использовании обратных слэшей (/) для замен/escaping.
Вы предупреждены.
Пример 24-1. Скрипт, предназначенный для запуска из командной строки (script.php)
Пример 24-2. Пакетный/Batch-файл для запуска PHP-скрипта в командной строке (script.bat)
См. также в документации по расширению Readline о функциях, которые можно использовать для усовершенствования вашего РНР-приложения для командной строки.
Php в командной строке linux
| Опция | Полное название | Описание |
|---|---|---|
| -a | —interactive |
