sonyps4.ru

Как запустить одноразовый php скрипт на сервере. Интерактивное консольное приложение на 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 готово. Мне не хотелось писать какую-нибудь совершенно бесполезную программу, поэтому этот скрипт подходит не только для изучения, но и для использования. Например, если сохранить в текстовый файл карту сайта, то скрипт поможет определить возможные ошибки с ссылками, а если его немного доработать, то даже укажет с какими именно:).

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

В CLI SAPI есть три различных способа запуска PHP-кода:

    Указывание конкретного файла для запуска.

    $ php my_script.php $ php -f my_script.php

    Оба способа (с указыванием опции -f или без) запустят файл my_script.php . Нет ограничений, какой файл запускать, и PHP-скрипты не обязаны иметь расширение .php .

    Замечание :

    Если необходимо передать аргументы в скрипт, то при использовании опции -f первым аргументом должен быть -- .

  1. Передать PHP-код напрямую в командной строке.

    $ php -r "print_r(get_defined_constants());"

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

    Замечание :

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

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

    Это дает мощную возможность создавать PHP-код и скармливать его запускаемому файлу, как показано в этом (вымышленном) примере:

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

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

Как и любое другое консольное приложение, бинарный файл PHP принимает аргументы, но PHP-скрипт также может получать аргументы. PHP не ограничивает количество аргументов, передаваемых в скрипт (оболочка консоли устанавливает некоторый порог количества символов, которые могут быть переданы; обычно этого лимита хватает). Переданные аргументы доступны в глобальном массиве $argv . Первый индекс (ноль) всегда содержит имя вызываемого скрипта из командной строки. Учтите, что если код вызывается на лету из командной строки с помощью опции -r , значением $argv будет просто дефис (- ). То же самое верно и для кода, переданного через конвейер из STDIN .

Вторая зарегистрированная глобальная переменная - это $argc , содержащая количество элементов в массиве $argv ((а не количество аргументов, переданных скрипту).

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

# Эта команда не запустит данный код, но покажет информацию об использовании PHP $ php -r "var_dump($argv);" -h Usage: php [-f] [...] # Эта команда передаст аргумент "-h" в скрипт, предотвратив показ справки PHP $ php -r "var_dump($argv);" -- -h array(2) { => string(1) "-" => string(2) "-h" }

Однако, в Unix-системах есть еще один способ использования PHP для консольных скриптов. Можно написать скрипт, первая строка которого будет начинаться с #!/usr/bin/php (или же другой корректный путь к бинарному файлу PHP CLI). После этой строки можно поместить обычный PHP-код, заключенный в открывающие и закрывающие теги PHP. Как только будут установлены корректные атрибуты запуска на файл (например, chmod +x test ), скрипт может быть запущен как обычный консольный или perl-скрипт:

Пример #1 Запуск PHP-скрипта как консольного

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

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

$ chmod +x test $ ./test -h -- foo array(4) { => string(6) "./test" => string(2) "-h" => string(2) "--" => string(3) "foo" }

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

Исполняемый 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-скрипт, принимающий один аргумент.

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

} else {
echo $argv [ 1 ];
}
?>

Скрипт приведенный выше включается в себя специальную Unix строку, указывающую на его запуск с помощью PHP. Работа ведется с CLI -версией, поэтому не будет выведено ни одного HTTP -заголовка.

Также приведенный пример проверяет количество переданных аргументов. В случае, если их больше или меньше одного, а также в случае, если переданный аргумент был --help , -help , -h или -? , выводится справочное сообщение с использованием $argv , которое содержит имя выполняемого скрипта. В противном случае просто выводится полученный аргумент.

Для запуска приведенного примера в Unix-системе, необходимо сделать его исполняемым и просто выполнить в консоли script.php echothis или script.php -h . В Windows-системе можно создать пакетный файл:

Пример #3 Пакетный файл для запуска PHP-скрипта из командной строки (script.bat)

@echo OFF "C:\php\php.exe" script.php %*

Предполагая, что скрипт называется script.php и полный путь к CLI php.exe совпадает с C:\php\php.exe , приведенный пакетный файл запустит скрипт с переданными параметрами: script.bat echothis либо script.bat -h .

Также можно ознакомиться с расширением Readline , которое можно использовать для усовершенствования консольного PHP-скрипта.

В Windows запуск PHP можно настроить без необходимости указывать C:\php\php.exe и расширение .php . Подробнее эта тема описана в разделе

От автора: Если вы когда-нибудь запускали воздушного змея, то знаете, что это не так просто, хотя со стороны кажется наоборот. На самом деле нужно приловчиться, чтобы вовремя веревку натянуть или поймать воздушную «волну». Сегодня я расскажу, как запустить скрипт PHP и какие «веревочки» дергать, чтобы он не просто работал, а «летал»!

Особенности запуска

Как уже не раз упоминалось, – это серверный язык программирования, поэтому сделать так, чтобы результат работы его кода отобразился в браузере, будет немного сложнее. Для этого файл должен располагаться непосредственно на серверном пространстве. Для работы с PHP используются два типа сервера:

Обычный (удаленный) –предоставляется хостером.

Локальный – устанавливается на клиентской машине.

На стороне хостинга, чтобы увидеть результат работы скрипта, в строку браузера вводится адрес следующего формата: ваш_сайт.ru/имя_файла.php

На локальном сервере все обстоит иначе. Перед тем, как запустим PHP скрипт в браузере, выясним эти особенности.
В зависимости от применяемого сервера набираемый адрес может отличаться. Чаще всего в «наших» краях используются различные сборки с Apache, из которых самой распространенной является Денвер.

Запуск скрипта в Denwer

В «апачевских» сборках все скрипты запускаются в localhost. Чтобы продемонстрировать это на практике, создадим какой-нибудь интересный пример. Вот его код:

< html >

< head >

< meta http - equiv = "refresh" content = "1" >

< / head >

< body >

< time style = "font-size:36px;color:rgb(102,255,102)" > < / time >

< / body >

< / html >

Разместите этот код в файле PHP и сохраните его на виртуальном диске, который создается после запуска локального сервера. У меня это файл test2.php.

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

Теперь разберемся, как запустить PHP скрипт на компьютере. Для этого в браузере следует указать адрес в формате: localhost/имя_файла.php

Начинаем мучиться

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

Это странно, поскольку упоминаемые библиотеки у меня присутствовали в папке ext. Оказывается, что все дело в неправильно прописанных путях в конфигурационном файле php.ini.

В нем нужно найти раздел «Paths and Directories» и исправить путь, указанный в параметре extension_dir. Измените правые слэши на левосторонние и добавьте в начале адреса букву виртуального диска.

Если запустить PHP скрипт из CMD консоли опять не получается, тогда следует просмотреть все пути, упоминаемые в сообщении ошибки, и исправить их.

Если все хорошо

В командной строке системе нужно указать путь, где находится «экзешник» интерпретатора языка PHP. В Денвере он находится по этому пути: Z:\usr\local\php5

Здесь же расположен и глобальный файл конфигурации.

Запускаем командную строку Винды. Затем указываем системе путь к исполняемому файлу PHP. После чего задаем путь к нужному скрипту: Z:\usr\local\php5\php.exe Z:\home\localhost\www\test2.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

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



Загрузка...