admin / 09.10.2018

Использование PHP из Командной Строки

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

sudo apt-get install php5-cli

после чего можно просто прописывать путь к скрипту

php ~/me/1.php

и получать в консоли результат его выполнения. Так скрипт

<? echo ‘Привет жестокий мир’; ?>

выведет вот такое

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

<? echo ‘Привет жестокий мир’; echo «\r\n»; ?>

символы переноса строки делают свое дело, и мы получаем вполне читабельный вариант

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

php ~/me/1.php var1 var2

которые затем можно получить, разобрав массив $argv

<? print_r($argv); ?>

что выведет нам вот такой

т.е., если нам нужно получить чисто параметры, то разбор массива начинаем не с нуля, как обычно, а с 1, т.к. в нуле мы получим имя скрипта.

Как по мне, для полноценной отладки скриптов такое чудо не годится, но для каких то други задач, ну и просто мелочи какие то тестировать — вполне ничего.

Запись опубликована автором Озим в рубрике Ubuntu, Обзор софта, Программирование.

Интерактивное консольное приложение на PHP

(Я знаю, что это старый вопрос)

В SuSE существуют два разных файла конфигурации для PHP: один для Apache и один для CLI (интерфейс командной строки). В каталоге/etc/php5/вы найдете каталог «apache2» и каталог «cli». Каждый из них имеет файл «php.ini». Файлы предназначены для той же цели (конфигурация php), но применяются к двум различным способам запуска PHP. Эти файлы, среди прочего, загружают модули, используемые PHP.

Если ваша ОС похожа, эти два файла, вероятно, не совпадают. Возможно, ваш Apache php.ini загружает модуль gearman, а cli php.ini — нет.

Когда модуль был установлен (автоматический или ручной), он, вероятно, обновил только файл Apache php.ini.

Вы можете просто скопировать файл Apache php.ini в каталог cli, чтобы среда CLI была похожа на среду Apache.

Или вы можете найти строку, которая загружает модуль gearman в файл Apache и копирует/вставляет его только в файл CLI.

ответ дан Shannon White 17 мая '17 в 21:54

источникподелиться

Глава 24. Использование PHP из командной строки

Начиная с версии 4.3, РНР поддерживает новый -тип (Server Application Programming Interface) под названием , что означает Command Line Interface. Как следует из названия, главной задачей этого -типа является разработка оболочки/shell (или рабочего стола) приложений с помощью РНР. Имеются весьма небольшие отличия от других , которые будут далее рассмотрены в этой главе.

был выпущен в первый раз с , но тогда это был эксперимент, и нужно было явно включать его командой при запуске . Начиная с , больше не является экспериментальным и всегда встроен и устанавливается как двоичный исполняемый файл (называется в Windows).

Существенные отличия от других :

  • В отличие от , никакие шапки/headers не записываются в вывод.

    Хотя в имеется способ подавления HTTP-шапок, эквивалентного переключателя для их включения в нет.

  • Имеются определённые директивы , которые переопределены в , поскольку они не имеют смысла в среде окружения оболочки:

Таблица 24-1. Переопределение -директив
Директива значение по умолчанию Комментарий
html_errors Бывает довольно сложно прочитать в оболочке сообщение об ошибке, наполненное всеми этими бессмысленными -тэгами, поэтому по умолчанию значение этой директивы .
implicit_flush Желательно, чтобы любой вывод из print(), echo() и компании немедленно записывался в вывод, а не отправлялся в какой-нибудь буфер. Вы всё ещё можете пользоваться буферизацией вывода, если хотите поработать со стандартным выводом.
max_execution_time 0 (unlimited) Из-за бесконечно больших возможностей использования в среде окружения оболочки, максимальное время выполнения не ограничено. В то время как приложения, написанные для web, выполняются в течение долей секунды, приложения оболочки пытаются занять для своего выполнения максимальное время.
register_argc_argv Глобальные переменные (количество аргументов, передаваемых приложению) и (массив текущих аргументов) всегда регистрируются и заполняются соответствующими значениями при использовании .

Примечание: Эти директивы не могут быть инициализированы другим значением из файла конфигурации или специального файла (если специфицирован). Это является некоторым ограничением, поскольку эти значения по умолчанию применяются после разбора всех файлов конфигурации. Однако их значение может быть изменено на этапе прогона программы (что не имеет смысла для всех других директив, например, для register_argc_argv).

  • Легче работать в среде оболочки, когда определены следующие константы:

    Таблица 24-2. Специфические CLI-константы
    Константа Описание
    Уже открытый поток в . Она хранит открывшего её

    $stdin = fopen(‘php://stdin’, ‘r’);
    Уже открытый поток в . Она хранит открывшего её

    $stdout = fopen(‘php://stdout’, ‘w’);
    Уже открытый поток в . Она хранит открывшего её

    $stderr = fopen(‘php://stderr’, ‘w’);

    Имея всё это, вы не должны, например, самостоятельно открывать поток для , а просто используете константу вместо ресурса потока:

    php -r ‘fwrite(STDERR, «stderr\n»);’

    Вам не нужно явно закрывать эти потоки, это делается РНР автоматически.

  • не изменяет текущую директорию на директорию исполняемого скрипта!

    Пример, показывающий отличие :

    <?php /* Простое тестирующее приложение */ echo getcwd(), «\n»; ?>

    Когда используется -версия, на выходе будет:

    $ pwd /tmp $ php-cgi -f another_directory/test.php /tmp/another_directory

    Это ясно показывает, что изменяет свою текущую директорию на директорию исполняемого скрипта.

    Использование даёт:

    $ pwd /tmp $ php -f another_directory/test.php /tmp

    Это даёт большую гибкость при написании утилит командной строки на .

    Примечание: поддерживает поведение с помощью ключа при запуске из командной строки.

Список опций командной строки исполняемого файла может быть получен в любое время путём запуска с ключом :

Usage/Использование: php [options] [-f] <file> [args…] php [options] -r <code> [args…] php [options] [— args…] -s Отображает исходный текст с разными цветами. -w Отображает исходный текст без комментариев и пробелов. -f <file> Разбирает <file>. -v Номер версии. -c <path>|<file> Ищет файл php.ini в данной директории. -a Запустить интерактивно. -d foo[=bar] Определить INI-вхождение foo со значением ‘bar’. -e Генерировать расширенную информацию для отладчика/profiler’а. -z <file> Загрузить <file> Zend-расширения. -l Только проверить синтаксис (lint). -m Показать скомпилированные модули. -i PHP-информация. -r <code> Запустить PHP <code> без использования тэгов скрипта <?..?> -h Данный help. args… Аргументы, передаваемые скрипту. Используйте — args когда первый аргумент начинается с — или скрипт читается из stdin

имеет три разных способа получения -кода, который нужно выполнить:

  1. Сказать выполнить определённый файл.

    php my_script.php php -f my_script.php

    Оба способа (с/без использования переключателя ) выполняют данный файл . Вы можете выбрать для выполнения любой файл, названия ваших файлов скриптов не обязаны заканчиваться расширением , а могут иметь любое имя или расширение.

  2. Передать код для выполнения непосредственно из командной строки.

    php -r ‘print_r(get_defined_constants());’

    Особого внимания требует замена переменных оболочки и использование кавычек.

    Примечание: Просмотрите пример внимательно, нет начальных и конечных тэгов! Переключателю они просто не нужны. Использование их в данном случае приведёт к ошибке разборщика.

  3. Предоставить -код для выполнения через стандартный ввод ().

    Это позволяет динамически создавать -код и передавать его экзешнику, как показано в данном (надуманном) примере:

    $ some_application | some_filter | php | sort -u >final_output.txt

Вы не можете комбинировать эти три способа при выполнении кода.

Как и в любом приложении оболочки, не только сам , но и ваши скрипты также принимают аргументы. Количество передаваемых в скрипт аргументов в РНР не ограничивается (оболочка имеет ограничение на количество передаваемых символов).
Аргументы, передаваемые в ваш скрипт, доступны через глобальный массив . Нулевой индекс всегда содержит имя скрипта (которое является символом в случае, когда -код приходит со стандартного ввода или с использованием ключа командной строки ).
Вторая регистрируемая глобальная переменная это , которая содержит количество элементов в массиве (а не количество аргументов, передаваемых в скрипт).

Если аргументы, которые вы хотите передать в скрипт, не начинаются с символа дефиса , ничего специально наблюдать не надо. Передача в скрипт аргумента, начинающегося , создаст проблемы, поскольку думает, что должен сам их обработать. Чтобы предотвратить это, используйте в качестве сепаратора аргументов списка . После того как аргумент будет разобран , каждый последующий аргумент передаётся в ваш скрипт без изменений/не разобранным.

# Это не выполнит данный код, но продемонстрирует использование PHP $ php -r ‘var_dump($argv);’ -h Usage: php [options] [-f] <file> [args…] […] # Аргумент ‘-h’ будет передан в ваш скрипт, что предупредит показ PHP его использования $ php -r ‘var_dump($argv);’ — -h array(2) { [0]=> string(1) «-» [1]=> string(2) «-h» }

Однако, вот другой способ использования для скриптинга оболочки.

Вы можете написать скрипт, первая строка которого начинается с , а затем идёт нормальный -код, содержащийся между начальным и конечным тэгами , и соответствующим образом устанавливаются атрибуты выполнения файла. Таким способом он может быть исполнен как нормальный скрипт оболочки или perl:

#!/usr/bin/php <?php var_dump($argv); ?>

Приняв, что файл называется и находится в текущей директории, мы можем выполнить:

$ chmod 755 test $ ./test -h — foo array(4) { [0]=> string(6) «./test» [1]=> string(2) «-h» [2]=> string(2) «—» [3]=> string(3) «foo» }

Как вы видите, ничего особо не нужно делать при передаче параметров в скрипт, который начинается с .

Таблица 24-3. Опции командной строки
Опция Описание
-s

Отображать синтаксис в цвете.

Эта опция использует внутренний механизм разбора файла, производит его расцвеченную -версию и записывает её в стандартный вывод. Заметьте, что генерируется лишь блок -тэгов без -header.

Примечание: Эта опция не работает вместе с опцией .

-w

Отобразить исходный текст без комментариев и пробелов.

Примечание: Эта опция не работает вместе с опцией .

-f

Разбирает и выполняет данный файл. Этот переключатель является необязательным и может быть опущен. Достаточно предоставить имя файла для выполнения.

-v

Записывает PHP, PHP SAPI и Zend-версии в стандартный вывод, например:

$ php -v PHP 4.3.0-dev (cli), Copyright (c) 1997-2002 The PHP Group Zend Engine v1.2.1, Copyright (c) 1998-2002 Zend Technologies
-c

С помощью этой опции можно либо специфицировать директорию для поиска , либо специальную директорию -файла (который не обязательно называется ), например:

$ php -c /custom/directory/ my_script.php $ php -c /custom/directory/custom-file.ini my_script.php
-a

Запускает PHP интерактивно.

-d

Эта опция позволяет устанавливать специальное значение для каждой директивы конфигурации, которые допускаются в . Синтаксис таков:

-d configuration_directive[=value]

Примеры:

# Опущение части value установит данную директиву конфигурации в «1» $ php -d max_execution_time -r ‘ $foo = ini_get(«max_execution_time»); var_dump($foo);’ string(1) «1» # Передача пустой части value установит данную директиву конфигурации в «» php -d max_execution_time= -r ‘ $foo = ini_get(«max_execution_time»); var_dump($foo);’string(0) «» # В директиву конфигурации будет установлено то, что # передано после символа ‘=’ $ 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»
-e

Генерирует расширенную информацию для debugger/profiler.

-z

Загружает Zend-расширение.

Если задано только имя файла, PHP пытается загрузить данное расширение из текущего пути по умолчанию к библиотеке в вашей системе (обычно специфицируется как в Linux-системах). Передача filename с абсолютным путём не будет использовать системный путь поиска библиотеки. Относительное filename с информацией директории скажет — попытаться загрузить расширение относительно текущей директории.

-l

Эта опция предоставляет удобный способ выполнения проверки синтаксиса данного -кода.

Интерактивное консольное приложение на PHP

В случае успеха — текст записывается в стандартный вывод, а return-код оболочки будет . При неудаче — текст вместе с внутренним сообщением разборщика об ошибке записывается в стандартный вывод, а return-код оболочки будет .

Эта опция не будет находить фатальные ошибки (вроде не определённых функций). Используйте , если хотите проверить также и наличие фатальных ошибок.

Примечание: Эта опция не работает вместе с .

-m

Используя эту опцию, PHP печатает на вывод встроенные (и загруженные) модули PHP и Zend:

$ php -m [PHP Modules] xml tokenizer standard session posix pcre overload mysql mbstring ctype [Zend Modules]
-i Эта опция командной строки вызывает phpinfo() и печатает на вывод результаты. Если не работает правильно, советуем выполнить и посмотреть, выводятся ли сообщения об ошибке до или вместо таблиц информации. Имейте в виду, что вывод будет на и, следовательно довольно сумбурным.
-r

Эта опция позволяет выполнять прямо в командной строке. Начальный и конечный тэги ( и ) не нужны и вызывают ошибки разборщика.

Примечание: Нужно проявлять внимание при использовании этой формы , чтобы не было противоречий с заменой переменных командной строки, выполняемой оболочкой.

Пример, выводящий ошибку разборщика:

$ php -r «$foo = get_defined_constants();» Command line code(1) : Parse error — parse error, unexpected ‘=’

Проблема здесь в том, что sh/bash выполняет замену переменной даже при использовании двойных кавычек . Поскольку переменная вряд ли определена, она ни во что не разворачивается, что в результате даёт код, передаваемый в для выполнения, фактически прочитанный:

$ php -r » = get_defined_constants();»

Корректным будет использовать одинарные кавычки . Переменные в строках, заключённые в одинарные кавычки, не разворачиваются при работе sh/bash.

$ 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»]=> […]

Если вы используете оболочку/shell иначе, чем sh/bash, у вас могут появиться новые вопросы. Отправляйте bug report или mail по адресу phpdoc@lists.php.net. Можно легко столкнуться с проблемами при попытке получить переменные оболочки в коде или использовании обратных слэшей (/) для замен/escaping.
Вы предупреждены…

-h С помощью данной опции вы можете получить информацию о действующем списке опций командной строки и небольшое описание их работы.

Исполняемый файл PHP может быть использован для запуска PHP-скриптов абсолютно независимо от web-сервера.
Если вы работаете под Unix, вы должны добавлять специальную первую строчку в ваши PHP-скрипты и делать их исполняемыми, чтобы система знала, какая программа должна выполнять эти скрипты.
Под Windows вы можете ассоциировать с опцией двойного щелчка по файлам либо сделать batch-файл (.bat) для запуска скрипта через PHP.

Строка, добавленная в начало скрипта для работы под Unix, не помешает под Windows, поэтому вы можете писать таким образом межплатформенные программы. Ниже дан пример простой РНР-программы для выполнения из командной строки.

Пример 24-1. Скрипт, предназначенный для запуска из командной строки (script.php)
 

#!/usr/bin/php <?php if ($argc != 2 || in_array($argv[1], array(‘—help’, ‘-help’, ‘-h’, ‘-?’))) { ?> This is a command line PHP script with one option. Usage: <?php echo $argv[0]; ?> <option> <option> can be some word you would like to print out. With the —help, -help, -h, or -? options, you can get this help. <?php } else { echo $argv[1]; } ?>

Здесь мы используем специальную первую строку для указания на то, что этот файл должен быть запущен в PHP. Здесь мы работаем с CLI-версией, поэтому не выполняется вывод HTTP-шапок/header. Имеются две переменные, которые вы можете использовать при написании РНР-приложений для командной строки: и . Первая — это количество аргументов плюс 1 (имя запущенного скрипта). Вторая — это массив аргументов, начиная с имени скрипта с индексом ноль ().

Мы проверяем, имеется ли менее или более одного аргумента. Также, если аргумент был , , или , мы печатаем help-сообщение, выводя имя скрипта динамически. Если мы получили какой-либо другой аргумент, мы выводим его (echo).

Если вы хотите выполнить вышеприведённый скрипт под Unix, вам необходимо сделать его executable и просто вызвать как или . Под Windows вы можете создать batch-файл для выполнения этой задачи:

Пример 24-2. Пакетный/Batch-файл для запуска PHP-скрипта в командной строке (script.bat)
 

@c:\php\php.exe script.php %1 %2 %3 %4

Приняв, что вы назвали программу и что ваш находится в , этот batch-файл запустит её с добавленными вами опциями: или .

См. также в документации по расширению Readline о функциях, которые можно использовать для усовершенствования вашего РНР-приложения для командной строки.

Передача параметров. Работа с формами

Обработка форм

Последнее обновление: 1.11.2015

Одним из основных способов передачи данных веб-сайту является обработка форм. Формы представляют специальные элементы разметки HTML, которые содержат в себе различные элементы ввода — текстовые поля, кнопки и т.д. И с помощью данных форм мы можем ввести некоторые данные и отправить их на сервер. А сервер уже обрабатывает эти данные.

Создание форм состоит из следующих аспектов:

  • Создание элемента в разметке HTML

  • Добавление в этот элемент одно или несколько поле ввода

  • Установка метода передачи данных: или

  • Установка адреса, на который будут отправляться введенные данные

Итак, создадим новую форму.

Для этого определим новый файл form.php, в которое поместим следующее содержимое:

<!DOCTYPE html> <html> <head> <meta charset=»utf-8″> </head> <body> <h3>Вход на сайт</h3> <form action=»login.php» method=»POST»> Логин: <input type=»text» name=»login» /><br><br> Пароль: <input type=»text» name=»password» /><br><br> <input type=»submit» value=»Войти»> </form> </body> </html>

Атрибут элемента указывает, что данные формы будет обрабатывать скрипт login.php, который будет находиться с файлом form.php в одной папке. А атрибут указывает, что в качестве метода передачи данных будет применяться метод POST.

Теперь создадим файл login.php, который будет иметь следующее содержание:

<?php $login = «Не известно»; $password = «Не известно»; if(isset($_POST[‘login’])) $login = $_POST[‘login’]; if (isset($_POST[‘password’])) $password = $_POST[‘password’]; echo «Ваш логин: $login <br> Ваш пароль: $password»; ?>

Чтобы получить данные формы, используется глобальная переменная $_POST.

Как запустить php скрипт?

Она представляет ассоциативный массив данных, переданных с помощью метода POST. Используя ключи, мы можем получить отправленные значения. Ключами в этом массиве являются значения атрибутов у полей ввода формы.

Так как атрибут поля ввода логина имеет значение (), то в массиве $_POST значение этого поля будет представлять ключ «login»:

И поскольку возможны ситуации, когда поле ввода будет не установлено, например, при прямом переходе к скрипту: http://localhost:8080/login.php. В этом случае желательно перед обработкой данных проверять их наличие с помощью функции isset(). И если переменная установлена, то функция isset() возвратит значение .

Теперь мы можем обратиться к форме:

И по нажатию кнопки введенные данные методом POST будут отправлены скрипту login.php:

Необязательно отправлять данные формы другому скрипту, можно данные формы обработать в том же файле формы. Для этого изменим файл form.php следующим образом:

<!DOCTYPE html> <html> <head> <meta charset=»utf-8″> </head> <body> <div> <?php if(isset($_POST[‘login’]) && isset($_POST[‘password’])){ $login=$_POST[‘login’]; $password = $_POST[‘password’]; echo «Ваш логин: $login <br> Ваш пароль: $password»; } ?> </div> <h3>Вход на сайт</h3> <form method=»POST»> Логин: <input type=»text» name=»login» /><br><br> Пароль: <input type=»text» name=»password» /><br><br> <input type=»submit» value=»Отправить»> </form> </body> </html>

Безопасность данных

Большое значение в PHP имеет организация безопасности данных. Рассмотрим несколько простых механизмов, которые могут повысить безопасность нашего веб-сайта.

Но вначале возьмем форму из прошлой темы и попробуем ввести в нее некоторые данные. Например, введем в поле для логина «<script>alert(hi);</script>», а в поле для пароля текст «<h2>пароль</h2>»:

После отправки данных в html разметку будет внедрен код javascript, который выводит окно с сообщением.

Чтобы избежать подобных проблем с безопасностью, следует применять функцию htmlentities():

if(isset($_POST[‘login’]) && isset($_POST[‘password’])){ $login=htmlentities($_POST[‘login’]); $password = htmlentities($_POST[‘password’]); echo «Ваш логин: $login <br> Ваш пароль: $password»; }

И даже после ввода кода html или javascript все теги будут экранированы, и мы получим следующий вывод:

Еще одна функция — функция strip_tags() позволяет полностью исключить теги html:

if(isset($_POST[‘login’]) && isset($_POST[‘password’])){ $login=strip_tags($_POST[‘login’]); $password = strip_tags($_POST[‘password’]); echo «Ваш логин: $login <br> Ваш пароль: $password»; }

Результатом ее работы при том же вводе будет следующий вывод:

НазадСодержаниеВперед

FILED UNDER : IT

Submit a Comment

Must be required * marked fields.

:*
:*