Pull to refresh

PHP5 как скриптовый язык для Windows

Lumber room
На этих выходных занимаюсь уборкой, в т.ч. и на компьютере. Уборка связана с кучей повторяющихся действий — хочется их автоматизировать и уйти пить пиво. Однако…

У *никсоидов есть 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);
?></li><?
      }
    }
  }
  closedir($handle);
  echo "</ul>";
  chdir($olddir);
}

if ($_SERVER['argc']>=2)
  $dir = $_SERVER['argv'][1];
else
  $dir = getcwd();
?>
<h1><?=$dir?></h1>
<?
  recurse_dir($dir);
?>



Кросспост с моего блога: PHP5 как скриптовый язык для Windows
Tags:PHPWindowsконсольавтоматизация
Hubs: Lumber room
Total votes 29: ↑24 and ↓5+19
Views395
Comments Comments 29

Popular right now