Заметки · 03.11.2023

Генератор конфигурации

Внезапно: этот пост про php, веб и всякое такое. С php я сталкиваюсь очень-очень редко и, возможно, из кода, приведённого ниже, это будет заметно. Заранее прошу понять и простить.

Сначала обрисую в общих чертах за какими такими приключениями я отправился в чуждый для меня мир php.

Некоторое время назад я занимался разработкой браузера на основе WebView2, который должен отображать страницу локального веб-приложения. При загрузке браузер забирает URL и все остальные настройки из файла конфигурации (app.exe.config).

Вся сложность заключалась в том, что каждый экземпляр программы, запущенный на удалённом хосте, должен принимать свой уникальный url-адрес, который может периодически меняться. И вот когда количество запущенных экземпляров программы перешагнуло за первый десяток и менять адрес вручную в каждом конфиг-файле стало сложновато — пришлось автоматизировать создание файлов конфигурации.

Ссылки на страницы генерировались по мере добавления объектов в базу данных веб-приложения на основе идентификатора записи. На странице администратора веб-приложения был отдельный блок с перечнем сгенерированных ссылок для клиентов, но это нисколько не облегчало работу.

Заниматься бесконечной копипастой url в файл конфигурации — путь смирившихся. Нам же — отчаянным — нужно чтобы всё было автоматизировано. Было решено создать php-скрипт, который бы порождал app.exe.config. Почерпнув азы из официальной документации языка, я отправился искать удачу. В итоге получился вот такой скрипт config.php:

<?php
  $url = $_GET['url'];

  header("Content-type: application/xml");
  header("Content-Disposition: attachment; filename=APPNAME.exe.config");

  print '<?xml version="1.0" encoding="utf-8"?>' . PHP_EOL;
  print "<configuration>" . PHP_EOL;

  print "<startup>" . PHP_EOL;
  print '<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2"/>' . PHP_EOL;
  print "</startup>" . PHP_EOL;

  print "<appSettings>" . PHP_EOL;

    print '<add key="URL" value="'.$url.'"/>' . PHP_EOL;

  print '</appSettings>' . PHP_EOL;

  print '</configuration>' . PHP_EOL;
  print $content;
?>

Так как app.exe.config, по своей сути, xml документ — первым делом объявляем тип контента в заголовке создаваемого файла. Там же присваиваем документу тип скачиваемого файла и его имя (filename приравниваем к нужному имени файла). Остальное переносим из существующего файл конфигурации.

Имейте в виду, что в нужном блоке ключ-значение нужно обозначить переменную, которая подтягивается из принимаемого параметра.

print '<add key="URL" value="'.$url.'"/>' . PHP_EOL;

Таким образом, чтобы создать файл конфигурации с URL адресом этого сайта достаточно пройти в браузере по ссылке на php-скрипт, указав ему параметр url:

http://local_domain/config.php?url=https://ngdream.ru

Если в файле конфигурации используется больше одного параметра, придётся прописывать их в теле скрипта. В каком виде атрибуты будут закреплены — решать Вам.

Ну, и раз зашла тема — сгенерируем файл ini. Этот формат я использую в проектах IDE Lazarus.

<?php
  $section = $_GET['section'];
  $value = $_GET['value'];
  $key = $_GET['key'];

  header("Content-type: text/plain");
  header("Content-Disposition: attachment; filename=settings.ini");

  print '[' . $section . ']' . PHP_EOL;
  print $value . ' = ' . $key . PHP_EOL;

  print $content;
?>

Как видите, здесь код куда проще и понятнее. Скрипт получает секцию конфигурации, ключ и его значение, а затем формирует файл settings.ini.

Ссылка для генерации файла будет выглядеть примерно вот так:

http://domain/config.php?section=test&value=test1&key=test3