Skip to content
ImageOptimizer
ImageOptimizer
Конвертация изображений в WebP/AVIF, responsive srcset, очередь и авто-inject picture на витрине MODX 3
  1. Компоненты
  2. ImageOptimizer
  3. CLI и cron

CLI и cron

ImageOptimizer обрабатывает очередь из shell: bulk scan, разовая конвертация, cron на shared hosting.

Пути ниже относительно корня MODX.

cli/convert.php

Базовые примеры

Обработать до 100 pending-задач:

bash
php core/components/imageoptimizer/cli/convert.php --limit=100

Scan каталога media source и enqueue + convert:

bash
php core/components/imageoptimizer/cli/convert.php --source=1 --scan --path=assets/images --limit=200

Один файл:

bash
php core/components/imageoptimizer/cli/convert.php --source=1 --path=assets/images/hero.jpg --limit=10

Только scan (dry-run):

bash
php core/components/imageoptimizer/cli/convert.php --source=1 --scan --path=assets/test --dry-run

JSON для скриптов:

bash
php core/components/imageoptimizer/cli/convert.php --limit=50 --json

Аргументы

АргументОписание
--source=NID modMediaSource (по умолчанию default_media_source, обычно 1)
--scanОбойти каталог source и добавить задачи в очередь
--path=PATHПодкаталог для --scan или один файл/каталог для enqueue
--limit=NСколько pending-задач обработать за запуск
--dry-runТолько отчёт по scan, без записи в очередь/диск
--format=webp|avifOverride формата на время запуска
--breakpoints=480,768Override breakpoints на время запуска
--time-budget=300Лимит времени в секундах
--jsonВывод статистики в JSON

CLI инициализирует MODX в контексте mgr (нужен для media sources и настроек).

Типичные сценарии

Первичная миграция каталога:

bash
php core/components/imageoptimizer/cli/convert.php \
  --source=1 --scan --path=assets/images/products --limit=500 --time-budget=600

Повторяйте, пока pending не станет 0, или настройте cron.

Только AVIF для теста:

bash
php core/components/imageoptimizer/cli/convert.php \
  --format=avif --path=assets/images/hero.jpg --limit=20

cron/convert.php

Обёртка над worker с flock и лимитами из настроек:

bash
*/10 * * * * php /var/www/site/core/components/imageoptimizer/cron/convert.php >> /var/log/imageoptimizer-cron.log 2>&1

Поведение:

  • Блокировка: core/cache/imageoptimizer/cron.lock (второй процесс завершится сразу)
  • Лимит задач: imageoptimizer_cron_limit (по умолчанию 200)
  • Сброс зависших: processing старше imageoptimizer_stuck_minutespending

Проверка вручную:

bash
php core/components/imageoptimizer/cron/convert.php
echo $?

cron/prune.php

Удаляет из imageoptimizer_queue записи со статусом done старше imageoptimizer_retention_days:

bash
0 3 * * * php /var/www/site/core/components/imageoptimizer/cron/prune.php

При retention_days=0 prune не удаляет строки.

Рекомендуется раз в сутки на production с большой очередью.

Связь с админкой

Действие в UICLI-эквивалент
Пересобрать очередь (каталог)--scan --path=… или --path=…
Пересобрать (один файл)--path=assets/…/file.jpg --limit=10
Обработать очередь--limit=N (без --scan)
Retry failedнет прямого CLI; Повторить выбранные в UI
Reset stuckавтоматически в cron; в UI — Сбросить зависшие

queue/process и cron используют один lock. Параллельный запуск вернёт worker_busy.

Ошибки CLI

СимптомРешение
MODX init failedПуть к config.core.php, права PHP CLI
0 processed, много pendingПроверьте энкодеры (вкладка Server), логи MODX
Permission denied на lockchmod 775 core/cache/imageoptimizer/
Memory exhaustedimageoptimizer_max_memory_limit, меньше breakpoints

Shared hosting

  • Убедитесь, что cron доступен и proc_open не запрещён (для cwebp/avifenc)
  • При запрете shell-утилит оставьте только GD/Imagick в imageoptimizer_method_priority
  • Уменьшите imageoptimizer_cron_limit до 20–50

Связанные разделы