PHP5 как скриптовый язык для Windows 22 марта 08
На этих выходных занимаюсь уборкой, в т.ч. и на компьютере. Уборка связана с кучей повторяющихся действий – хочется их автоматизировать и уйти пить пиво. Однако…
У *никсоидов есть 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 , но что результат будет выведен после окончания работы скрипта. Если нужно вывести что-то немедленно – используем
fputs(STDOUT, "Эй! Я тут понемногу удаляю твои документы!");
Кстати, в консоль лучше по-русски не говорить – там используется кодировка CP866, а не CP-1251 и тем более не UTF8…
Если же нужно спросить что-то у пользователя:
$input = fgets(STDIN);
Возвращение результата
PHP-скрипты могут возвращать значения, как BAT или как обычные программы. Значение передается параметром в exit:
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);
?>
Скачать php_reg.zip (1K)
Подписаться на RSS

Комментарии
Не понял чем не мил Perl/Python ? Они прекрасно работают под виндой.
Тут дело в том, что мне мил PHP, и использовать его для скриптинга удобнее, чем учить Perl.
А PHP5 можно использовать через Command Line Interface
так написано, как-будто только PHP5 так и можно… я и не помню PHP без CLI.
>я и не помню PHP без CLI.
каюсь! я в PHP чуть больше года, в CLI для PHP5 уверен, а о том, чего не знаю, писать не хочу.
> PHP и в консольном режиме способен практически на все!
Ну-ну, машина Тюринга тоже способна на всё :)
Почему в UNIX’e легче – не потому, что там Perl, а потому что есть куча удобных программ для всего – под рукой в консоли, и если чего не помнишь, можно под рукой же посмотреть,
perldoc -f openили
rm --helpНу вот тривиа – хочу удалить папку с подпапками. Пишу
rm -r papkaВ перле или PHP:
`rm -r papka`Может уже есть для этого функция в PHP, но когда я последний раз искал то не было :)
Или хочу все картинки в папке сжать до 320×240:
<?php
foreach (glob("*.jpg") as $f) {
`convert -scale 320x240 $f _$f`;
}
Или прямо в BASH:
for f in *.jpg; do convert -scale 320x240 $f _$f; done
Коротко и ясно. Потому что есть ImageMagick (convert). И он еще кучу всего может кроме сжатия.
После этого на Винде как без рук!! Не хочу на нее. В крайнем случае на Мак.
А Вам советую CYGWIN. Хоть `cp -r` и `rm -r` работать будет. Ну и консоль.
И спасибо за OpenID поддержку в комментах!
Спасибо за интересный материал , хоть я и сижу в linux , но достаточно интересна подобная расширяемость системы , например на win*mobile тоже можно интерпретатор собрать , и там образом расширить функции (я не собирал, но что-то подобное гуглил)
[...] PHP5 как скриптовый язык для Windows – хотя я сижу на Убунте, все же в закромах есть XP и очень хочеться попробовать! [...]
> Коротко и ясно. Потому что есть ImageMagick (convert).
У меня под виндой он тоже есть.
(Главное – обойти грабли с виндовским convert.exe, который «Преобразование файловой системы тома FAT в NTFS» ^_^)
Как раз понадобился PHp для автоматизации, помню когда то читал про это ))
только одна проблема:
как в скрипт php передать имя(путь) «подопытного» файла по правому клику ?
Все разобрался, в «Send to» делаю ярлык
«C:\WebServers\usr\local\php5\php.exe D:\Site\7\phpbat\test.php»
и в argv[2] – имя фйла(папки) :)
Да, именно так.