Лекция
Привет, Вы узнаете о том , что такое внешние переменные переменные вне php использование php из командной строки, Разберем основные их виды и особенности использования. Еще будет много подробных примеров и описаний. Для того чтобы лучше понимать что такое внешние переменные переменные вне php использование php из командной строки , настоятельно рекомендую прочитать все из категории Выполнение скриптов на стороне сервера PHP (LAMP) NodeJS (Backend) .
Web-программирование в большей части представляет собой как раз обработку различных данных, введенных пользователем — т. е., обработку HTML-форм.
Пожалуй, нет другого такого языка, как PHP, который бы настолько облегчил вам задачу обработки и разбора внешних переменных, т.е. переменных, которые поступили из HTML-форм (из браузера пользователя). Дело в том, что в язык PHP встроены все необходимые возможности, так что вам не придется даже и задумываться над особенностями протокола HTTP и размышлять, как же происходит отправка и прием POST-форм или даже загрузка файлов.Разработчики PHP все предусмотрели.
Здесь мы не будем подробно останавливаться на механизе работы протокола HTTP, который отвечает за доставку данных из браузера на сервер и обратно, этому посвящен специальный раздел PHP и HTTP. Там же глубоко рассмотрены принципы работы с HTML-формами.
Сейчас мы рассмотрим эти механизмы лишь с прикладных позиций, не углубляясь в теорию.
Для того, чтобы принимать данные от пользователей, нам необходимо интерактивное взаимодействие с ними.
А теперь попробуем написать сценарий, который принимает в параметрах имя пользователя и выводит:
"Привет, <имя>!".
Сначала рассмотрим наиболее простой способ передачи имени сценарию — непосредственный набор его в URL после знака? — например, в формате name=имя. Вот пример:
http://localhost/script.php?name=имя
Наш сценарий должен распознать параметр name. То есть, говоря проще, сценарий (скрипт) должен принять параметрname в виде переменной name, а затем вывести в браузер пользоватея строку "Привет, <имя>!". Сделать это можно таким образом:
Пишем скрипт, принимающий параметр name и выводящий результат в браузер пользователя, а затем сохраняем его под именем script.php:
<?php
echo "Привет, $_GET['name'] !";
?>
В нашем примере мы использовали предопределенную переменную $_GET['name'], чтобы "принять" параметр name. Теперь, передав через GET-запрос параметр name=Саша, мы получим следующий результат:
Привет, Саша !
А теперь попробуем передать параметр name не из строки запроса браузера, а через HTML-форму. Создаем HTML-документ следующего содержания:
<form action="http://localhost/script.php" method="GET">
Name: <input type=text name=name><br><input type=submit value="GO!">
</form>
Теперь сохраним данный HTML-документ на нашем тестовом сервере (localhost) под именем send.html в той же директории, где у нас уже сохранен сценарий script.php.
Теперь запускаем HTML-документ в браузере:
http://localhost/send.html
Вводим имя в поле и нажимаем кнопку "GO!". Форма передаст через GET-запрос параметр name нашему скриптуscript.php. Если вы все сделали правильно и ваш web-сервер работает нормально, вы увидете введенное вами в поле формы имя! В адресной строке браузера вы увидете путь и переданный вами параметр name.
Теперь мы должны понять, как мы можем передать множество параметров, для начала хотя-бы два.
Итак, нам нужно, чтобы скрипт выводил следующее:
"Привет, <имя>! Вам <возраст> лет!".
То есть нам нужно передать в скрипт 2 параметра: name и age.
Теперь мы напишем скрипт script.php, принимающий два параметра: name и age, а также HTML-документ с формой, которая эти два параметра будет передавать в наш новый скрипт:
<?php
echo "Привет, $_GET['name'] ! Вам $_GET['age'] лет !";
?>
А вот и HTML-документ send.html, с помощью которого мы параметры name и age передадим нашему скрипту:
<html><body>
<form action="script.php">
Введите имя: <input type=text name="name"><br>
Введите возраст: <input type=text name="age"><br>
<input type=submit value="GO!">
</form>
</body></html>
Теперь наш скрипт принимает два параметра name и age и выводит в браузер результат формата: "Привет, <имя>! Вам <возраст> лет!".
Обратите внимание на адресную строку браузера после передачи параметров сценарию, она будет выглядить примерно следующим образом (без URL-кодирования кириллицы):
http://localhost/script.php?name=Саша&age=23
В зависимости от установок вашего интерпретатора, существует несколько способов доступа к данным из ваших HTML-форм. Вот несколько примеров:
<?php
// Доступно, начиная с PHP 4.1.0
echo $_GET['username'];
echo $_POST['username'];
echo $_REQUEST['username'];
import_request_variables('p', 'p_');
echo $p_username;
// Доступно, начиная с PHP 3. Начиная с PHP 5.0.0, эти длинные предопределенные
// переменные могут быть отключены директивой register_long_arrays.
echo $HTTP_GET_VARS['username'];
// Доступно, если директива PHP register_globals = on. Начиная
// с PHP 4.2.0, значение по умолчанию register_globals = off.
// Использование/доверие этому методу непредпочтительно.
echo $username;
?>
Вот как обычно бывает: Нам нужно написать малюсенький консольный скрипт бекапа, который, может запускаться из крона, и при этом скрипт должен принимать параметры для соединения с базой данных.
Самое простейшее что мы начнем писать будет выглядеть примерно так:
cli-argv-argc.php
<?php // Ожидаем что скрипт будет вызываться с такими параметрами: // php backup.php dbuser dbpassword database host if ($argc != 5) { die(PHP_EOL . 'Use: php backup.php dbuser dbpassword database host' . PHP_EOL); } $dbuser = $argv[1]; $dbpassword = $argv[2]; $database = $argv[3]; $host = $argv[4]; $mysql = mysql_connect($host, $dbuser, $dbpassword); mysql_select_db($database, $mysql); // ...
Тут мы использовали системную переменную argс для получения количества всех параметров. Запомните, что нулевой параметр (имя скрипта) тут тоже учитывается.
И системную переменную argv с массивом всех параметров.
Для простейшего скрипта этого хватит, но что если мы захотим поддерживать и отдать этот скрипт другим разработчикам?
Скорее всего будет куча ругани в нашу сторону, потому что очень легко можно ошибиться и перепутать местами пароль и базу данных и заметить ошибку будет крайне сложно. Посмотрите:
php backup.php dbuser database dbpassword host
Вот тут нам на помощь приходит крайне удобная функция разбора параметров: getopt
Основная мощь getopt в том, что она позволяет нам использовать флаги, обязательные и необязательные параметры в произвольном порядке.
Давайте напишем простой, но очень выразительный пример использования getopt, а потом, посмотрите как люди раньше мучались с регулярками, что бы разобрать командную строку :)
backup.php
<?php // Тут показаны две формы записи аргументов: короткая и полная // При этом, если после параметра стоит два двоеточия, значит параметр необязательный, // а если одно двоеточие - значит обязательный. // все параметры которые не указаны в конфигурации будут проигнорированы $params = array( '' => 'help', 'h::' => 'host::', 'u:' => 'user:', 'p::' => 'password::', 'd:' => 'database:', ); // Default values $host = 'localhost'; $user = 'root'; $password = null; $database = ''; $errors = array(); $options = getopt( implode('', array_keys($params)), $params ); if (isset($options['host']) || isset($options['h'])) { $host = isset( $options['host'] ) ? $options['host'] : $options['h']; } if (isset($options['user']) || isset($options['u'])) { $port = isset( $options['user'] ) ? $options['user'] : $options['u']; } else { $errors[] = 'user required'; } if (isset($options['password']) || isset($options['p'])) { $socket = isset( $options['password'] ) ? $options['password'] : $options['p']; } if (isset($options['database']) || isset($options['d'])) { $database = isset( $options['database'] ) ? $options['database'] : $options['d']; } else { $errors[] = 'database required'; } if ( isset($options['help']) || count($errors) ) { $help = " usage: php backup.php [--help] [-h|--host=127.0.0.1] [-u|--user=root] [-p|--password=secret] [-d|--database] Options: --help Show this message -h --host Server hostname (default: localhost) -u --user User -p --password Password (default: no password) -d --database Database Example: php backup.php --user=root --password=secret --database=blog "; if ( $errors ) { $help .= 'Errors:' . PHP_EOL . implode("\n", $errors) . PHP_EOL; } die($help); } $mysql = mysql_connect($host, $user, $password); mysql_select_db($database, $mysql); // ....
Теперь запустим наш скрипт с параметром –help и порадуемся что хорошо поддерживаемую и понятную программу так легко написать
php backup.php --help
Если вкратце, то getopt принимает все аргументы из командной строки и складывает валидные параметры в массив $options. Об этом говорит сайт https://intellect.icu . А из уже получившегося массива мы можем получить все аргументы и в зависимости от них выдать результат.
Давайте еще добавим последний штрих, который должен быть во всех наших скриптах:
1. Можно убрать расширение php
2. В начало каждого скрипта добавим опцию для интерпритатора#!/usr/bin/env php
3. Сделаем наши скрипты исполняемыми chmod +x backup.php
После этого можно пользоваться получившимся скриптом как настоящей юникс-программой:
./backup --help
или
./backup --user=ukko --password=password --database=db1
Глава 24. Использование PHP из командной строкиНачиная с версии 4.3, РНР поддерживает новый SAPI-тип (Server Application Programming Interface) под названием CLI, что означает Command Line Interface. Как следует из названия, главной задачей этого SAPI-типа является разработка оболочки/shell (или рабочего стола) приложений с помощью РНР. Имеются весьма небольшие отличияCLI SAPI от других SAPI, которые будут далее рассмотрены в этой главе. CLI SAPI был выпущен в первый раз с PHP 4.2.0, но тогда это был эксперимент, и нужно было явно включать его командой --enable-cli при запуске ./configure. Начиная с PHP 4.3.0, CLI SAPI больше не является экспериментальным и всегда встроен и устанавливается как двоичный исполняемый файл php (называется php.exe в Windows). Существенные отличия CLI SAPI от других SAPI:
Таблица 24-1. Переопределение php.ini-директив
Список опций командной строки исполняемого файла PHP может быть получен в любое время путем запуска PHP с ключом -h:
CLI SAPI имеет три разных способа получения PHP-кода, который нужно выполнить:
Вы не можете комбинировать эти три способа при выполнении кода. Как и в любом приложении оболочки, не только сам PHP, но и ваши скрипты PHP также принимают аргументы. Количество передаваемых в скрипт аргументов в РНР не ограничивается (оболочка имеет ограничение на количество передаваемых символов). Если аргументы, которые вы хотите передать в скрипт, не начинаются с символа дефиса (-), ничего специально наблюдать не надо. Передача в скрипт аргумента, начинающегося с - , создаст проблемы, поскольку PHP думает, что должен сам их обработать. Чтобы предотвратить это, используйте в качестве сепаратора аргументов списка --. После того как аргумент будет разобран PHP, каждый последующий аргумент передается в ваш скрипт без изменений/не разобранным.
Однако, вот другой способ использования PHP для скриптинга оболочки. Вы можете написать скрипт, первая строка которого начинается с #!/usr/bin/php, а затем идет нормальный PHP-код, содержащийся между начальным и конечным тэгами PHP, и соответствующим образом устанавливаются атрибуты выполнения файла. Таким способом он может быть исполнен как нормальный скрипт оболочки или perl:
Приняв, что файл называется test и находится в текущей директории, мы можем выполнить:
Как вы видите, ничего особо не нужно делать при передаче параметров в скрипт, который начинается с -. Таблица 24-3. Опции командной строки
Исполняемый файл PHP может быть использован для запуска PHP-скриптов абсолютно независимо от web-сервера.
Здесь мы используем специальную первую строку для указания на то, что этот файл должен быть запущен в PHP. Здесь мы работаем с CLI-версией, поэтому не выполняется вывод HTTP-шапок/header. Имеются две переменные, которые вы можете использовать при написании РНР-приложений для командной строки: $argc и $argv. Первая - это количество аргументов плюс 1 (имя запущенного скрипта). Вторая - это массив аргументов, начиная с имени скрипта с индексом ноль ($argv[0]). Мы проверяем, имеется ли менее или более одного аргумента. Также, если аргумент был --help, -help, -h или -?, мы печатаем help-сообщение, выводя имя скрипта динамически. Если мы получили какой-либо другой аргумент, мы выводим его (echo). Если вы хотите выполнить вышеприведенный скрипт под Unix, вам необходимо сделать его executable и просто вызвать как script.php echothis или script.php -h. Под Windows вы можете создать batch-файл для выполнения этой задачи:
Приняв, что вы назвали программу script.php и что ваш php.exe находится в c:\php\php.exe, этот batch-файл запустит ее с добавленными вами опциями: script.bat echothis или script.bat -h. |
В заключение, эта статья об внешние переменные переменные вне php использование php из командной строки подчеркивает важность того что вы тут, расширяете ваше сознание, знания, навыки и умения. Надеюсь, что теперь ты понял что такое внешние переменные переменные вне php использование php из командной строки и для чего все это нужно, а если не понял, или есть замечания, то не стесняйся, пиши или спрашивай в комментариях, с удовольствием отвечу. Для того чтобы глубже понять настоятельно рекомендую изучить всю информацию из категории Выполнение скриптов на стороне сервера PHP (LAMP) NodeJS (Backend)
Ответы на вопросы для самопроверки пишите в комментариях, мы проверим, или же задавайте свой вопрос по данной теме.
Комментарии
Оставить комментарий
Выполнение скриптов на стороне сервера PHP (LAMP) NodeJS (Backend)
Термины: Выполнение скриптов на стороне сервера PHP (LAMP) NodeJS (Backend)