Как сделать сценарий windows

Скрипты CLI в приложении Nette

Когда упоминается приложение Nette, я думаю о веб-приложении. Презентеры, шаблоны, формы, а затем вывод HTML для браузера. Но параллельно миру веб-браузеров существует другой, совершенно другой мир командной строки (CLI). И если нашему веб-приложению необходимо, например, периодически запускать какие-то задачи в фоновом режиме, нам придется перейти в мир CLI.

В этой статье я опишу один из способов работы со сценариями CLI в приложении Nette. Я опишу, как легко создавать одноцелевые скрипты без дополнительных библиотек.

Где хранить скрипты CLI

Когда мы решим написать скрипт CLI, первое, что мы решим, это где его сохранить. У меня работала следующая структура каталогов:

Со временем я пришел к разделению папок bin и cron. Если у вас больше скриптов, вы начинаете терять представление о том, какие из них можно просто запускать вручную, а какие запускаются периодически. Как я случайно разослал шесть тысяч электронных писем в два часа дня, которые должны были разойтись только после полуночи, дальше обсуждать не буду.

Я пытался использовать соглашение bin/cron-xyz.php , иногда подпапку bin/cron/ , но по какой-то причине у меня получилось две отдельные папки.

Исполняемые скрипты

В Windows мы можем щелкнуть правой кнопкой мыши файл PHP и выбрать «Открыть в программе…» и указать путь к php.exe. Впоследствии мы можем запускать скрипты двойным щелчком, как обычные программы. Я лично разрабатываю для Windows, но использую Cygwin/GIT bash. Далее процедура такая же, как и в Linux.

Читайте также:  Как настроить windows 10 для быстродействия

Запустить PHP-скрипт из интерфейса командной строки очень просто:

Исполнитель устает писать снова и снова. Мы можем использовать shebang в скрипте PHP. Я использую:

Мы устанавливаем исполняемый бит:

И мы можем бежать:

Бит выполнения является важной деталью для шебанга. Хотя в линуксе нормальноЯ разрабатываю для Windows и постоянно забываю зафиксировать этот флаг. В Windows мы должны указать git сделать это:

Я еще не придумал элегантного автоматизированного решения. Было бы неплохо что-нибудь вроде .gitattributes.

Использование shebang в Windows нормально. Интерпретатор PHP готов к этому, и шебанг пропустит строку. Но проблема с вставкой файлов. Если вы рассмотрите возможность вызова require ‘bin/skript.php’; строка shebang записывается в стандартный вывод, и в этом проблема.

С суффиксом или без него

Одно время я заигрывал с идеей отказаться от расширения .php для скриптов. Я думал, что это не имеет значения.

Но я бросил его. Было несколько недостатков. Редакторы не выделяли, парсеры не разбирали и даже просто находили . -name ‘*.php’ перестало работать.

Интеграция с Нетте

Мы доработаем сценарий задачи cron, которая будет выполнять обслуживание базы данных. Он всегда удаляет журналы старше одного года после полуночи. Но есть несколько вопросов, с которыми мы рано или поздно столкнемся.

Отладка vs. производство

Какой режим использовать на веб-сайте, понятно и знакомо. В режиме отладки отображается панель Tracy и красные «синие экраны», в рабочем режиме приложение молчит и только регистрирует ошибки. А как насчет интерфейса командной строки?

Мы должны спросить себя: «Кто будет запускать сценарий CLI?»

В моих приложениях это всегда я, или другой разработчик, или cron. Вот почему я всегда включаю режим отладки для скриптов CLI. Если скрипт дает сбой, мне выдается трассировка стека, и я читаю, где ошибка. В случае сбоя сценария cron трассировка стека будет отправлена ​​мне по электронной почте (cron отправляет любые stdout и stderr по электронной почте на учетную запись, под которой выполняется задача). Если это то же самое, я просто напомню вам, что вы ничего не найдете в каталоге log/ при включенном режиме отладки.

Читайте также:  Как работать с windows xp sp3

Однако у вас может быть другая ситуация. Сценарии также могут запускаться другими пользователями и отправляться по электронной почте с помощьювывод cron не дойдет до вас. Тогда я бы предпочел производственный режим с дополнительным включением режима отладки, например, с использованием параметра CLI —debug .

Сервисы из контейнера внедрения зависимостей

Службы для сценариев CLI будут получены из контейнера DI, но его настройки для Интернета или CLI могут отличаться. Текущая тенденция в создании DI-контейнера (и Nette Sandbox делает то же самое) заключается в использовании класса Bootstrap, загружаемого Composer. Я делаю это в основном так же:

Это такая основа. Веб-приложение, в частности index.php , просто сделает следующее:

Мы создадим собственный метод Bootstrap для нужд сценариев CLI. Это может быть bootForCli() или bootForCron(). Это зависит от личных предпочтений:

И теперь у нас есть все необходимое для сценариев CLI.

Пример сценария интерфейса командной строки

Затем настраиваем задачу cron и готово.

В заключение

Полученный код смехотворно короткий. А если бы мы инкапсулировали пример удаления журнала в отдельный сервис, то код был бы еще короче:

Я показал, как очень быстро и легко писать сценарии CLI. Не воспринимайте это как «единственно правильное» решение. Основным недостатком, с которым я сталкиваюсь, является обработка параметров командной строки. Использование getopt() раздражает. Анализ параметров из $_SERVER[‘argv’] снова трудоемок. Иногда я использую пакет командной строки Nette, который значительно упрощает обработку параметров.

Кто-то решает задачи cron через Интернет. Периодически вызывает wget https://example.tld/cron/task .

Еще одно и, возможно, самое известное решение для CLI — консоль Symfony. Это определенно надежное решение, и, поскольку оно используется многими разработчиками, вы найдете для него интеграцию в триггерах пакетов, таких как миграция базы данных. На Componette вы также можете найти интеграцию для Nette.

Читайте также:  Это обновление позволяет работать под управлением поддерживаемой версии windows как убрать

Что касается меня, я все еще придерживаюсь описанных одноцелевых скриптов, если могу. Они естьтолько весы в конце концов. С одной стороны, инструменты и удобство, предоставляемые сторонней библиотекой, а с другой — зависимость в Composer, за которой мне приходится постоянно следить.

Комментарии (RSS)

Спасибо за хорошую статью.

В CLI-скриптах мне понравился метод callMethod (принимает любую функцию, а не только метод) на контейнере, который авторизует сервисы из DI-контейнера в параметры функции. Это особенно полезно, когда скрипту требуется несколько сервисов из контейнера. А весь статический анализ, хинтинг и т.п. работают автоматически без каких-либо расширений и настроек.

Поделиться с друзьями
ОС советы