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)

Комментарии

  • Igor 22 марта 2008

    Не понял чем не мил Perl/Python ? Они прекрасно работают под виндой.

  • coldFlame 22 марта 2008

    Тут дело в том, что мне мил PHP, и использовать его для скриптинга удобнее, чем учить Perl.

  • COTOHA 22 марта 2008

    А PHP5 можно использовать через Command Line Interface
    так написано, как-будто только PHP5 так и можно… я и не помню PHP без CLI.

  • coldFlame 22 марта 2008

    >я и не помню PHP без CLI.
    каюсь! я в PHP чуть больше года, в CLI для PHP5 уверен, а о том, чего не знаю, писать не хочу.

  • Антон Таяновский 23 марта 2008

    > 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 поддержку в комментах!

  • Furyz 24 марта 2008

    Спасибо за интересный материал , хоть я и сижу в linux , но достаточно интересна подобная расширяемость системы , например на win*mobile тоже можно интерпретатор собрать , и там образом расширить функции (я не собирал, но что-то подобное гуглил)

  • [...] PHP5 как скриптовый язык для Windows – хотя я сижу на Убунте, все же в закромах есть XP и очень хочеться попробовать! [...]

  • http://baka.name 30 декабря 2008

    > Коротко и ясно. Потому что есть ImageMagick (convert).
    У меня под виндой он тоже есть.
    (Главное – обойти грабли с виндовским convert.exe, который «Преобразование файловой системы тома FAT в NTFS» ^_^)

  • Stanislav 20 августа 2009

    Как раз понадобился PHp для автоматизации, помню когда то читал про это ))

    только одна проблема:
    как в скрипт php передать имя(путь) «подопытного» файла по правому клику ?

  • Stanislav 20 августа 2009

    Все разобрался, в «Send to» делаю ярлык
    «C:\WebServers\usr\local\php5\php.exe D:\Site\7\phpbat\test.php»
    и в argv[2] – имя фйла(папки) :)

Оставить комментарий

  • (или OpenID)
  •