PHP5 как скриптовый язык для Windows
March 22, 2008 in PHPНа этих выходных занимаюсь уборкой, в т.ч. и на компьютере. Уборка связана с кучей повторяющихся действий – хочется их автоматизировать и уйти пить пиво. Однако…
У *никсоидов есть shell-скрипты и Perl. Завидую. У пользователей Windows есть BAT-скрипты, js-скрипты и vbs-скрипты. У первых не хватает гибкости, а Javascript или VBScript учить смысла нет.
Но ведь у меня есть PHP с его колоссальными возможностями. А PHP5 можно использовать через Command Line Interface, короче, вызывать скрипты без сервера, с командной строки. Выглядит это где-то так:
>php.exe script.php
Коряво и ненативно. Я расскажу, как можно довести PHP-скриптинг под Windows до такого же удобства, что и BAT. Вру – до такого же, что и shell-скрипты. Линуксоиды обзавидуются!
Правим реестр
Ассоциации файлов в Windows хранятся в ветке HKEY_CLASSES_ROOT в реестре. Не буду вдаваться в подробности ибо подготовил все необходимое в файле php_reg.zip.
Качаем файл, распаковываем, открываем в редакторе (не импортируем в реестр! рано еще.)
Замените d:\\php
на путь к установленному PHP5 (с двойными слешами, конечно), а d:\\windows\\temp
– на путь к папке с временными файлами (да, у меня Windows на D: ).
Теперь можно и импортировать.
Возможности
Теперь PHP-скрипты запускаются практичски аналогично BAT-скриптам, а именно не только по двойному клику, но и принимают аргументы командной строки:
>do_some_stuff.php with some args
Заметьте, из консольных скриптов недоступны ни $_GET
, ни $_POST
, ни $_REQUEST
. Вместо них используем $_SERVER['argv']
:
_SERVER["argv"] => Array
(
[0] => F:\do_some_stuff.php,
[1] => with,
[2] => some,
[3] => args
)
_SERVER["argc"] => 4
Естественно, в наших руках оказывается весь инструментарий PHP – а это, кроме мощнейших встроенных функций обработки массивов и строк, еще и библиотеки PDO, GD2, SimpleXML + DOM, curl, классы PEAR и все остальные возможности PHP.
PHP и в консольном режиме способен практически на все!
Ввод-вывод
Для вывода вполне подойдут echo
и print
, но что результат будет выведен после окончания работы скрипта. Если нужно вывести что-то немедленно – используем
<?php
fputs(STDOUT, "Эй! Я тут понемногу удаляю твои документы!");
Кстати, в консоль лучше по-русски не говорить – там используется кодировка CP866, а не CP-1251 и тем более не UTF8…
Если же нужно спросить что-то у пользователя:
<?php
$input = fgets(STDIN);
Возвращение результата
PHP-скрипты могут возвращать значения, как BAT или как обычные программы. Значение передается параметром в exit
:
<?php
exit(1); //выход с результатом 1
Немного удобства – смотрим результат в HTML
А если хочется выводить результаты работы скрипта в HTML? Я предусмотрел и это.
Правый клик по скрипту, «Открыть в браузере» – и после выполнения откроется ваш браузер по умолчанию со страничкой, которую выдал скрипт.
Чтобы использовать это поведение по умолчанию, в .reg-файле нужно подправить строчку:
[HKEY_CLASSES_ROOT\PHPFile\Shell]
@="OpenInBrowser"
Еще немного удобства – упрощаем подключение файлов
Вспомним, что если в php.ini
указать
include_path = ".;d:\php\includes"
можно будет к любому скрипту подключать файлы из папки d:\php\includes
.
Наглядный пример
Ну… Пусть это будет скрипт вывода дерева папок – в HTML, конечно!
<?php
function recurse_dir($dir)
{
$olddir=getcwd();
chdir($dir);
$thisdir=getcwd();
echo "<ul>";
if ($handle = opendir('.')) {
while (false !== ($file = readdir($handle))) {
if ($file != "." && $file != "..") {
?><li><a href="file://<?=$thisdir?>\<?=$file?>"><?=$file?><?
if (is_dir($file))
recurse_dir($file);
?></a></li><?
}
}
}
closedir($handle);
echo "</ul>";
chdir($olddir);
}
if ($_SERVER['argc']>=2)
$dir = $_SERVER['argv'][1];
else
$dir = getcwd();
?>
<h1><?=$dir?></h1>
<?
recurse_dir($dir);
?>
Понравился пост? Купи мне кофе