Как запустить php скрипт из консоли windows. Запускаем PHP скрипт в консоли

Есть у меня маленький, но очень полезный горшочек скрипт, за которым надо постоянно ходить на сервер, а тут оказалось, что он понадобился на машине, где никаких интернетов нет, а данные, которые нужно обработать — есть. Я сначала решил сделать из него экзешник, но потом оставил эту затею, ибо с компиляторами PHP под Виндовоз неожиданно образовался какой-то жуткий геморрой. HipHop от Facebook напрочь отказался собираться, сайт Roadsend PHP Compiler сдох, а опять собирать с исходников GitHub стало после шаманства с HipHop откровенно влом, ну плюс MinGW особым удобством не отличается.

Заметил, кстати, удивительную странность — на машине с 12 Гб оперативной памяти и четвероядерным процессором, но под MinGW и, соответственно, Виндой, сборка происходит медленнее, чем на компьютере с Linux, скромным двухведерным процессором и двумя же Гб ОП.

Впрочем, все эти танцы с бубном были совершенно лишними.

Запуск скрипта в консоли

Все оказалось банально и элементарно, php прекрасно работает из консоли. Формат команды:

php.exe [параметры] [параметры_скрипта]

Параметры скрипта

Скрипт может «найти» свои параметры в элементах глобального массива $_SERVER:
$_SERVER["argc"] хранит количество параметров
$_SERVER["argv"] их значения. $_SERVER["argv"] сам является индексированным массивом. В элементе 0 содержится имя файла скрипта.

Примечание:
Начиная с PHP 4.3.0, при использовании CLI SAPI переменные $argc и and $argv зарегистрированы и заполнены соответствующими значениями. В более ранних версиях создание этих переменных, так же, как и для CGI или модуля веб-сервера, требует значение on директивы register_globals. Независимо от версии PHP или статуса опции register_global они всегда доступны как элементы массива $_SERVER или $HTTP_SERVER_VARS. Например: $_SERVER[‘argv’]

Пример

Скрипт, выводящий в консоль свои параметры:

Результат работы

Если запустить скрипт, например так:

php.exe con-test.php param1 param2 param3 tramparamparamparam

Портабельный скрипт

Все это не имело бы большого смысла, если бы для запуска скрипта пришлось бы тащить с собой Web-сервер или весь дистрибьютив PHP, со всеми модулями и прочим. Для минимального запуска PHP под Windows нужно всего 2 файла: php.exe и php*ts.dll , где * — версия PHP. Например, для использованного мной PHP5, это php5ts.dll

Разные мелочи

— Инклюды. Если скрипт подразумевает использование инклюдов, то их лучше держать либо в директории с главным скриптом, либо в поддиректориях, и прописывать в основном скрипте относительные пути. Т.е. так, как это обычно делается на сервере. Иначе PHP будет искать их либо в include_path, который прописан в php.ini, либо вообще неведомо где, точнее ведомо — это указывается как параметр при сборке самого PHP, если мне не изменяет склероз.

— php.ini Вообще, для запуска PHP он не нужен, но тут может вкрасться чущественная гадость. Если на машине уже установлен PHP, или php.ini подложен каким-то злоумышленником в каталог по умолчанию, для многих сборок под Windows это %WINDIR% , то может случиться неприятность.
Сам PHP ищет свой php.ini сначала в каталоге с самим собой, так что можно туда его подложить.

Расширения PHP. Можно подложить нужные DLL расширений в подкаталог в каталоге с php.exe и прописать в extension_dir в php.ini относительный путь к каналогу, а в соответствующих параметрах extension — имена DLL

— PHP я цельностянул из Denwer 🙂

Источники

1. Создание EXE приложений на PHP Копия
2. Оффлайновые лекционные тетради в клеточку.

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

Как запустить php-скрипт из командной строки?

Независимо от используемой операционной системы, для запуска скрипта необходимо набрать в консоли следующую команду:

Php script.php

Ваша ОС может выдать сообщение о том, что команда php ей неизвестна. В таком случае, и если вы уверены, что сам интерпретатор PHP установлен корректно, поможет указание полного пути к интерпретатору во время запуска скрипта.

C:\php\php.exe script.php

Для UNIX-подобных систем:

/usr/bin/php script.php

Обратите внимание, что путь к интерпретатору PHP на вашей системе может быть другим, поэтому это тоже надо учесть. Например, для пользователей популярного пакета WampServer путь может быть таким:

C:\wamp\bin\php\php5.3.8\php.exe

Ну и наконец, чтобы не вводить полный путь каждый раз, следует добавить путь к интерпретатору в переменную окружения PATH вашей операционной системы.

Пишем простой скрипт для проверки кода ответа сервера

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

Сразу после запуска скрипт выбирает все файлы с расширением *.txt из папки files . Затем выводит данный список пользователю в формате номер => имя и ждет от пользователя ввода номера интересующего его файла.

Получение всех файлов по маске делается просто, для этого воспользуемся стандартной функцией glob , а вот с чтением данных из консоли всё немного интересней. Дело в том, что после запуска скрипта из командной строки в нем открываются три стандартных потока: для вывода (STDOUT), ввода (STDIN) и ошибок (STDERR). Указатели на эти потоки доступны для скрипта в виде одноименных констант и работать с ними можно так же как, например, с обычными файлами. Таким образом, чтобы прочитать данные из консоли достаточно просто прочитать строку из потока ввода: fgets(STDIN) .

$files = glob("files/*.txt"); $files or exit("No files to check.".PHP_EOL); echo "Files in folder: ".count($files).PHP_EOL; foreach ($files as $index => $name) { echo "[{$index}] => {$name}".PHP_EOL; } echo "Choose the file: "; $choice = intval(fgets(STDIN));

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

Array_key_exists($choice, $files) or exit("Wrong file selected.".PHP_EOL); $file = $files[$choice]; echo "Processing file "{$file}"...".PHP_EOL; $start_time = microtime(true); $code_stats = array(); $f = fopen($file, "r");

С помощью цикла while начинаем перебирать все строки в файле. Строки должны быть корректными url-адресами иначе мы не сможем определить правильный код ответа сервера. Заголовки для каждого адреса получаем с помощью стандартной функции get_headers , а код ответа находится обычно в первой строке заголовка.

While ($url = trim(fgets($f))) { $headers = get_headers($url); if (is_array($headers)) { array_key_exists($headers, $code_stats) or $code_stats[$headers] = 0; $code_stats[$headers]++; echo date("H:i:s")." HTTP code "{$headers}" for url "{$url}"".PHP_EOL; } else { array_key_exists("Unknown", $code_stats) or $code_stats["Unknown"] = 0; $code_stats["Unknown"]++; echo date("H:i:s")." Problem with url "{$url}"".PHP_EOL; } } fclose($f);

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

$elapsed_time = round(microtime(true) - $start_time, 3); echo "File processed in {$elapsed_time}s".PHP_EOL; echo "Code stats are:".PHP_EOL; print_r($code_stats);

Результатом работы такого приложения может быть, например, такой вывод:

$ php check.php Files in folder: 1 => files/db.txt Choose the file: 0 Processing file "files/db.txt"... 18:33:43 HTTP code "HTTP/1.0 200 OK" for url "http://mail.ru/" 18:33:45 HTTP code "HTTP/1.1 301 Moved Permanently" for url "http://yandex.ru/" 18:33:46 HTTP code "HTTP/1.1 302 Moved Temporarily" for url "http://rambler.ru/" 18:33:47 HTTP code "HTTP/1.0 301 Moved Permanently" for url "http://google.ru/" File processed in 5.558s Code stats are: Array ( => 1 => 1 => 1 => 1)

Выводы

Вот и всё, простое и интерактивное консольное приложение на PHP готово. Мне не хотелось писать какую-нибудь совершенно бесполезную программу, поэтому этот скрипт подходит не только для изучения, но и для использования. Например, если сохранить в текстовый файл карту сайта, то скрипт поможет определить возможные ошибки с ссылками, а если его немного доработать, то даже укажет с какими именно:).

Само приложение можно скачать .

Данную статью я решил посветить всем начинающим изучать PHP , потому что у всех возникает одна и та же ошибка. Почему её допускают, не знаю, но допускают постоянно. Я без преувеличений скажу, что получил уже около сотни вопросов, на которые ответ будет дан в этой статье. Эта ошибка связана с неправильным запуском в PHP .

Как делают практически все новички:

  1. Создают PHP-файл (иногда HTML-файл , но это самые новички).
  2. Записывают туда PHP-код .
  3. И двойным кликом пытаются открыть его в браузере.

Результат, браузер код открывает, но исполнять его не торопится. А просто выводит какие-то куски кода обычным текстом, либо вообще ничего не выводит.

Ошибка данного подхода состоит в том, что ученик не понимает, что PHP - это серверный язык , а не клиентский. Это HTML или JavaScript клиентские языки, они, конечно, обрабатываются браузером. Но для PHP нужен интерпритатор . И вот данный интерпритатор запускается сервером.

Вывод: запускать PHP-код надо через сервер . Если у Вас Denwer , значит, через него.

Теперь, как запускать PHP-код через Denwer . Большинство новичков вновь делают ошибку. Они вроде бы всё делают правильно, создают нужные папки, перезапускают Denwer и вроде бы, осталось только правильно вызвать файл. Но тут снова ошибка: они вновь открывают файл просто в браузере (либо перетаскиванием файла в браузер, либо двойным кликом). Это легко можно заметить по адресу в адресной строке. Там будет что-то наподобие: file:///Z:\home\mysite.local\www\script.php .

А правильно запускать надо, вводя адрес виртуального хоста . То есть прямо в адресной строке браузера вводите: http://mysite.local/script.php - всё, теперь скрипт запустится и выведет свой результат.

Надеюсь, данная статья поможет многим новичкам, только начинающим изучать PHP .

Если вы читаете данную статью, то наверняка уже можете писать простенькие скрипты на PHP, а так же знаете где же они применяются. Но кто нибудь задумывался о том, что PHP скрипты, по мимо веба можно использовать ещё и на PC. Сейчас я покажу вам простой пример каким же образом мы можем запустить наш PHP.

Для начала нам потребуется написать сам скрипт. Поэтом создаём файл PHP. Для урока я создал его прямо на диске С, таким образом путь был C:\script.php

Function sum($a,$b){ echo $a + $b; } eval($argv.";");

Именно благодаря последней строке нам и удастся запустить наш PHP в командной строке. Сохраняем наш файл и двигаемся дальше.

Надеюсь у вас установлен локальный сервер, если нет, то смело двигаемся на официальный сайт Open Server , скачиваем и устанавливаем. Рекомендую установить именно его так, как я лично пользуюсь им, ну и разумеется все статьи идут именно под него.

Для того чтобы запустить написанный ранее скрипт прямо в консоли, давайте настроем переменные среды вашей системы. Я всё же надеюсь на наличие указанного выше сервака.
И так, для начала вам необходимо попасть в свойства системы. Заходим в мой пк и правый клик по любому свободному месту, далее кликаем на свойства.


Переменные среды


В открывшимся окне смотрим в поле Переменные среды для пользователя ***. Скорее всего после установки сервера там уже будет находиться какая либо переменная PATH. Если её нет, то смело кликаем на кнопку создать.
Имя переменной PATH именно большими буквами
Значение переменной, прописываем путь до php.exe. Если у вас стоит OS, то путь должен быть вот таким: C:\OpenServer\modules\php\PHP-5.6\
Ну в случае если вы не выбирали другую директорию для установки.
В случае если переменная уже создана, то просто в конце значения ставим; и дописываем наш путь выше.
Жмём везде где только можно ОК и перезагружаем компьютер.

При помощи этой команды мы попадём в корень диска. Далее вводим вот что.

php script.php "sum(5,2)"

После исполнения данный команды вы увидите на след строке консоли цифру 7

Разумеется это был один из самых простых примеров. Но самое главное, что это даёт понять как вы можете исполнять свои скрипты прямо из командной строки. Например вы можете написать скрипт который бы записывал в файл дату и время, в момент исполнения. И запускали бы его в момент загрузки ПК. В таком случае, вы бы могли отслуживать, запускал ли кто либо ваш ПК в ваше отсутствие, ну и т.д.

Начиная с версии 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:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    Примечание:

    -w

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

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

    -f

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

    -v

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

    -a

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

    -d

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

    -e

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

    -z

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

    -l

    Эта опция предоставляет удобный способ выполнения проверки синтаксиса данного PHP -кода. В случае успеха - текст No syntax errors detected in записывается в стандартный вывод, а return-код оболочки будет 0 . При неудаче - текст Errors parsing вместе с внутренним сообщением разборщика об ошибке записывается в стандартный вывод, а return-код оболочки будет 255 .

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

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

    -m

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

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

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

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

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

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

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

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

    Мы проверяем, имеется ли менее или более одного аргумента. Также, если аргумент был --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 .

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