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

March 22, 2008 PHP Windows захабренное

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

У *никсоидов есть 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);
?>

Скачать php_reg.zip (1K)

Buy Me a Coffee at ko-fi.com