Интерактивное консольное приложение на PHP
PHP является одним из наиболее популярных языков программирования в вебе. Своей популярностью он в первую очередь обязан легкости в изучении и многофункциональности. Но сфера его применения не заканчивается только на создании простых веб-страничек. PHP-скрипты можно запускать из командной строки, что позволяет писать на нем полноценные консольные приложения.
Как запустить php-скрипт из командной строки?
Независимо от используемой операционной системы, для запуска скрипта необходимо набрать в консоли следующую команду:
Ваша ОС может выдать сообщение о том, что команда php ей неизвестна. В таком случае, и если вы уверены, что сам интерпретатор PHP установлен корректно, поможет указание полного пути к интерпретатору во время запуска скрипта.
Для UNIX-подобных систем:
Обратите внимание, что путь к интерпретатору PHP на вашей системе может быть другим, поэтому это тоже надо учесть. Например, для пользователей популярного пакета WampServer путь может быть таким:
Ну и наконец, чтобы не вводить полный путь каждый раз, следует добавить путь к интерпретатору в переменную окружения PATH вашей операционной системы.
Пишем простой скрипт для проверки кода ответа сервера
Для того, чтобы показать особенности работы скрипта из командной строки, напишем простое приложение, которое будет брать текстовый файл со ссылками и проверять код ответа сервера для каждой из этих ссылок. Причем предусмотрим возможность выбора нужного файла в интерактивном режиме, чтобы заодно узнать, как это делается.
Сразу после запуска скрипт выбирает все файлы с расширением *.txt из папки files . Затем выводит данный список пользователю в формате номер => имя и ждет от пользователя ввода номера интересующего его файла.
Получение всех файлов по маске делается просто, для этого воспользуемся стандартной функцией glob , а вот с чтением данных из консоли всё немного интересней. Дело в том, что после запуска скрипта из командной строки в нем открываются три стандартных потока: для вывода (STDOUT), ввода (STDIN) и ошибок (STDERR). Указатели на эти потоки доступны для скрипта в виде одноименных констант и работать с ними можно так же как, например, с обычными файлами. Таким образом, чтобы прочитать данные из консоли достаточно просто прочитать строку из потока ввода: fgets(STDIN) .
После того, как пользователь сделал свой выбор и проверки правильности выбора, мы можем открыть файл для чтения.
С помощью цикла while начинаем перебирать все строки в файле. Строки должны быть корректными url-адресами иначе мы не сможем определить правильный код ответа сервера. Заголовки для каждого адреса получаем с помощью стандартной функции get_headers , а код ответа находится обычно в первой строке заголовка.
В итоге после обработки файла, можно вывести небольшую статистику о том, сколько заняла обработка по времени и какие коды ответа сколько раз встречались.
Результатом работы такого приложения может быть, например, такой вывод:
Выводы
Вот и всё, простое и интерактивное консольное приложение на PHP готово. Мне не хотелось писать какую-нибудь совершенно бесполезную программу, поэтому этот скрипт подходит не только для изучения, но и для использования. Например, если сохранить в текстовый файл карту сайта, то скрипт поможет определить возможные ошибки с ссылками, а если его немного доработать, то даже укажет с какими именно :).
Командная строка PHP в Microsoft Windows
В этом разделе содержатся заметки и советы по работе PHP, запущенного из командной строки.
PHP, запущенный из командной строки, может выполняться без каких-либо изменений в Windows.
Но есть несколько простых шагов, которые могут упростить задачу. Некоторые из этих шагов уже могли быть выполнены, но будут приведены здесь для того, чтобы последовательность операций не была нарушена.
Как PATH , так и PATHEXT являются важными системные переменными в Windows, поэтому важно не затереть их текущее значение, а только дописать нужные данные в конец.
Допишите расположение исполняемых файлов php ( php.exe , php-win.exe или php-cli.exe в зависимости от ваших предпочтений и версии PHP) в конец переменной окружения PATH . О том, как добавить вашу директорию к PATH читайте в соответствующем разделе FAQ.
Допишите .PHP расширение в конец переменной окружения PATHEXT . Это может быть сделано при изменении переменной PATH . Сделайте те же шаги, которые описаны в FAQ, но измените переменную PATHEXT вместо PATH .
Позиция, в которой вы разместите .PHP, будет определять, какой скрипт или программа будут запущенны для обработки файла с соответствующим расширением. Например, разместив .PHP перед .BAT, сначала будет запущен ваш скрипт, а не пакетный файл, если есть исполняемый файл с тем же именем.
Ассоциируйте расширение .PHP с конкретным типом файла. Это можно сделать выполнив следующую команду:
Ассоциируйте тип файла phpfile с соответствующим исполняемым PHP файлом. Это можно сделать выполнив команду:
Выполнение этих шагов позволит PHP скриптам выполняться из любой директории без необходимости указывать исполняемый PHP файл или расширение .PHP, а все параметры будут переданы в скрипт для обработки.
В примере ниже описываются некоторые изменения реестра, которые могут быть сделаны вручную.
Пример #1 Изменения реестра
С этими изменениями команда может быть записана как:
Возникает небольшая проблема, если вы собираетесь использовать эту технику и используете ваши PHP-скрипты как фильтры командной строки, как в примере ниже:
Как запускать PHP-код
Данную статью я решил посветить всем начинающим изучать PHP, потому что у всех возникает одна и та же ошибка. Почему её допускают, не знаю, но допускают постоянно. Я без преувеличений скажу, что получил уже около сотни вопросов, на которые ответ будет дан в этой статье. Эта ошибка связана с неправильным запуском в PHP.
Как делают практически все новички:
- Создают PHP-файл (иногда HTML-файл, но это самые новички).
- Записывают туда PHP-код.
- И двойным кликом пытаются открыть его в браузере.
Результат, браузер код открывает, но исполнять его не торопится. А просто выводит какие-то куски кода обычным текстом, либо вообще ничего не выводит.
Ошибка данного подхода состоит в том, что ученик не понимает, что PHP — это серверный язык, а не клиентский. Это HTML или JavaScript клиентские языки, они, конечно, обрабатываются браузером. Но для PHP нужен интерпритатор. И вот данный интерпритатор запускается сервером.
Вывод: запускать PHP-код надо через сервер. Если у Вас Denwer, значит, через него.
Теперь, как запускать PHP-код через Denwer. Большинство новичков вновь делают ошибку. Они вроде бы всё делают правильно, создают нужные папки, перезапускают Denwer и вроде бы, осталось только правильно вызвать файл. Но тут снова ошибка: они вновь открывают файл просто в браузере (либо перетаскиванием файла в браузер, либо двойным кликом). Это легко можно заметить по адресу в адресной строке. Там будет что-то наподобие: file:///Z:\home\mysite.local\www\script.php.
А правильно запускать надо, вводя адрес виртуального хоста. То есть прямо в адресной строке браузера вводите: http://mysite.local/script.php — всё, теперь скрипт запустится и выведет свой результат.
Надеюсь, данная статья поможет многим новичкам, только начинающим изучать PHP.
Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!
Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.
Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления
Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.
Порекомендуйте эту статью друзьям:
Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):
Она выглядит вот так:
Комментарии ( 49 ):
А как можно исправить код на сайте на вордпресс? Если надо изменить немного шапку в шаблоне? Мой сайт http://ubolika.ru — В каком там файле надо вносить изменения?
Найдите файл index.php в папке с темой Вашего шаблона. Данный файл и нужно править.
Установил Denwer, всё сделал как сказано, но PHP в браузере не выводится
Файлы имеют расширение php? Сайты вообще открываются (например, HTML-код)? Если всё так, то скопируйте адрес из адресной строки и покажите его.
Здравствуйте Михаил! Создал на диске С папку WebServers. Установил туда Denwer. После установки было написано, что Denwer успешно установлен. Набрал в браузере адрес тестового сайта: test1.ru Браузер мне выдал: Это файл /home/test1.ru/www/index.html. Всё вроде бы работает. Создал папку с сайтом: C:\WebServers\home\test2.ru Перезапустил Denwer. В папке с сайтом test2.ru создал папку www. В ней создал документ index.html В html всё работает хорошо. Создают второй документ с расширением php. Пишу для проверки такой php-код: В браузере, если я понимаю правильно, я должен увидеть 5. Но ничего нет. В программе Notepad++ открывают документ в браузере. Путь такой: file:///C:/WebServers/home/test2.ru/www/index2.php
Во-первых, перезапускать сервер надо было после создания www. А что касается пути, то внимательнее прочитайте статью, как раз о Вашей ошибке там и говорится.
Перезапустил Denwer после того, как создал папку www. Создал в этой папке файл с расширением php. Вы могли бы мне подсказать, что я должен ввести в браузере из ходя из того пути, который я вам написал?
Большое Вам спасибо Михаил! С вашей помощью мне наконец удалось решить данную проблему.
Михаил, для меня PHP ещё тёмный лес. Как я понял, для выполнения кода PHP страница должна иметь расширение *.php. А почему тогда у вас страницы на сайте с расширением *.html?
Здравствуйте Михаил!я пробовал все что сказано в коментариях и все получилась! за этоспасибо большое . теперь пишу вот такой простинкий код
Как запускать php скрипты windows
Указание конкретного файла для запуска.
Оба способа (с указанием опции -f или без) запустят файл my_script.php . Нет ограничений, какой файл запускать; в частности, файлы не обязаны иметь расширение .php .
Если необходимо передать аргументы в скрипт, то при использовании опции -f первым аргументом должен быть — .
Передать PHP-код напрямую в командной строке.
Необходимо быть особо осторожным при использовании этого способа, т.к. может произойти подстановка переменных оболочки при использовании двойных кавычек.
Внимательно прочтите пример: в нем нет открывающих и закрывающих тегов! Опция -r просто в них не нуждается, и их использование приведёт к ошибке разбора.
Передать запускаемый PHP-код через стандартный поток ввода ( stdin ).
Это даёт мощную возможность создавать PHP-код и передавать его запускаемому файлу, как показано в этом (вымышленном) примере:
Как и любое другое консольное приложение, бинарный файл PHP принимает аргументы, но PHP-скрипт также может получать аргументы. PHP не ограничивает количество аргументов, передаваемых в скрипт (оболочка консоли устанавливает некоторый порог количества символов, которые могут быть переданы; обычно этого лимита хватает). Переданные аргументы доступны в глобальном массиве $argv . Первый индекс (ноль) всегда содержит имя вызываемого скрипта из командной строки. Учтите, что если код вызывается на лету из командной строки с помощью опции -r, значением $argv[0] будет просто дефис ( — ). То же самое верно и для кода, переданного через конвейер из STDIN .
Вторая зарегистрированная глобальная переменная — это $argc , содержащая количество элементов в массиве $argv (а не количество аргументов, переданных скрипту).
Если передаваемые аргументы не начинаются с символа — , то особых проблем быть не должно. Передаваемый в скрипт аргумент, который начинается с — создаст проблемы, т.к. PHP решит, что он сам должен его обработать. Для предотвращения подобного поведения используйте разделитель списка аргументов — . После того, как этот разделитель будет проанализирован PHP, все последующие аргументы будут переданы в скрипт нетронутыми.
Пример #1 Запуск PHP-скрипта как консольного
Предполагая, что этот файл назван test и находится в текущей директории, можно сделать следующее:
Как можно увидеть, в этом случае не нужно заботиться о передаче параметров, которые начинаются с — .
Исполняемый PHP-файл может использоваться для запуска PHP-скриптов независимо от веб-сервера. В случае работы в Unix-подобной системе, необходимо добавить в первую строку файла #! (называемый также «shebang») чтобы указать, какая из программ должна запускать скрипт. На Windows-платформах можно назначить обработчик php.exe для файлов с расширениями .php или создать пакетный (.bat) файл для запуска скриптов посредством PHP. Строка, добавляемая в начале скрипта для Unix-систем, не влияет на их работу в ОС Windows, таким образом можно создавать кроссплатформенные скрипты. Ниже приведён простой пример скрипта, выполняемого из командной строки:
Пример #2 Скрипт, предназначенный для запуска из командной строки (script.php)
#!/usr/bin/php
if ( $argc != 2 || in_array ( $argv [ 1 ], array( ‘—help’ , ‘-help’ , ‘-h’ , ‘-?’ ))) <
?>
Это консольный PHP-скрипт, принимающий один аргумент.
Использование:
echo $argv [ 0 ]; ?>
Любое слово, которое вы хотели бы
напечатать. Опции —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 под актуальной учётной записью пользователя. При работе в сетевой службе некоторые операции не будут выполнены, поскольку «сопоставление имён учётных записей и идентификаторов безопасности не выполнено».
User Contributed Notes 7 notes
On Linux, the shebang (#!) line is parsed by the kernel into at most two parts.
For example:
1: #!/usr/bin/php
2: #!/usr/bin/env php
3: #!/usr/bin/php -n
4: #!/usr/bin/php -ddisplay_errors=E_ALL
5: #!/usr/bin/php -n -ddisplay_errors=E_ALL
1. is the standard way to start a script. (compare «#!/bin/bash».)
2. uses «env» to find where PHP is installed: it might be elsewhere in the $PATH, such as /usr/local/bin.
3. if you don’t need to use env, you can pass ONE parameter here. For example, to ignore the system’s PHP.ini, and go with the defaults, use «-n». (See «man php».)
4. or, you can set exactly one configuration variable. I recommend this one, because display_errors actually takes effect if it is set here. Otherwise, the only place you can enable it is system-wide in php.ini. If you try to use ini_set() in your script itself, it’s too late: if your script has a parse error, it will silently die.
5. This will not (as of 2013) work on Linux. It acts as if the whole string, «-n -ddisplay_errors=E_ALL» were a single argument. But in BSD, the shebang line can take more than 2 arguments, and so it may work as intended.
Summary: use (2) for maximum portability, and (4) for maximum debugging.
A gotcha when using #!/usr/bin/php at the start of the file as noted above:
if you originally edited the file on Windows and then attempt to use it on Unix, it won’t work because the #! line requires a Unix line ending. Bash gives you the following error message if it has DOS line endings:
«bash: /usr/local/bin/wpreplace.php: /usr/bin/php^M: bad interpreter: No such file or directory»
(In Emacs I used «CTRL-X ENTER f» then type «unix» and ENTER to convert)
In both Linux and Windows, when you execute a script in CLI with:
then PHP will ignore the very first line of your script if it starts with:
So, this line is not only absorbed by the kernel when the script file is executable, but it is also ignored by the PHP engine itself.
However, the engine will NOT ignore the first #! line of any included files withing your «outer» script.php.
Any «shebang» line in an included script, will result in simply outputting the line to STDOUT, just as any other text residing outside a . ?> block.
After the years I also have the fact that I have to use double quotation marks after php -r on Windows shell.
But in the Powershell you can use single or double quotation!