Как избежать оптимизации изображений, которые уже оптимизированы с помощью PHP? - PullRequest
1 голос
/ 20 февраля 2012

В настоящее время я работаю над приложением PHP, которое запускается из командной строки для оптимизации папки изображений.

Приложение PHP является скорее оболочкой для других оптимизаторов изображений, и оно просто выполняет итерацию каталога изахватывает все изображения, затем запускает изображение через соответствующую программу для получения наилучшего результата.

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

imagemagick для определения типа файла и преобразования неанимированных GIF-файлов в png
gifsicle для оптимизации Анимированные Gif изображения
jpegtran для оптимизации jpg изображения
pngcrush для оптимизации png изображения
pngquant для оптимизации png изображения в формате png8
pngout для оптимизации png изображения в формате png8

Моя проблема: с 1-10 изображениями все работает гладко и довольно быстро, однако, как только я запускаю большую папку с 10 или более изображениями, она становится очень медленной.На самом деле я не вижу хорошего решения этой проблемы, но одна вещь, которая могла бы помочь, состоит в том, чтобы избежать повторной обработки изображений, которые уже были оптимизированы.Поэтому, если у меня есть папка с 100 изображениями, и я оптимизирую эту папку, а затем добавляю 5 новых изображений, перезапустите оптимизатор.Затем необходимо оптимизировать 105 изображений, моя цель - оптимизировать только 5 новых изображений, поскольку предыдущие 100 уже были бы оптимизированы.Одно это значительно улучшит производительность, когда новые изображения будут добавлены в папку изображений.

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

Некоторые идеи IИмеется: Записать некоторую базу данных текстовых файлов в папки изображений, в которой будут перечислены все изображения, которые уже были обработаны, поэтому при запуске приложения оно будет работать только с изображениями, которых еще нет в этом файле.Другая идея состояла в том, чтобы изменить имя файла, чтобы в имени было какое-то обозначение, чтобы показать, что оно было оптимизировано, третья идея - переместить каждый оптимизированный файл в конечную папку назначения после его оптимизации.Идеи 2 и 3 не очень хороши, потому что они нарушают все ссылки на пути к изображениям в исходном коде веб-сайтов.

Поэтому, если вы можете придумать достойное / хорошее решение этой проблемы, поделитесь?

Ответы [ 3 ]

3 голосов
/ 20 февраля 2012

Метаданные
Вы можете поставить флажок в метаинформации каждого изображения после его оптимизации. Сначала проверьте этот флаг и продолжайте, только если его там нет. Вы можете использовать exif_read_data () для чтения данных. Написание может быть как это .

Выше для JPG. Метаданные для PNG также возможны, посмотрите на этот вопрос, и этот .

Я не уверен насчет GIF, но вы определенно могли бы преобразовать их в PNG и затем добавить метаданные ... хотя я почти уверен, что у них есть своя мета-информация , поскольку инструменты извлечения метаданных разрешают GIF.

Поддержка баз данных
Другим решением было бы хранить информацию об изображениях в базе данных MySQL. Таким образом, когда вы настраиваете свои оптимизации, вы можете отслеживать, когда и какая оптимизация была применена к какому изображению. Вы можете выбрать, какие изображения для оптимизации в соответствии с любыми параметрами по вашему выбору. Вы можете создать админ-панель для этого. Этот метод позволит легко экспериментировать.

Вы также можете объединить два вышеупомянутых метода.

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

1 голос
/ 20 февраля 2012

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

0 голосов
/ 20 февраля 2012

Мне в голову приходит мысль о том, чтобы смешать простое решение с более сложным. Когда вы оптимизируете изображение, переместите его в отдельную папку. Когда осуществляется доступ к исходной папке изображений, попросите файл .htaccess захватить эти ссылки и направить их в область, в которой можно увидеть, существует ли то же изображение в разделе оптимизированной папки, если нет, оптимизировать, переместить, затем продолжить .

Я знаю, что сказал simple решение, это сложное решение, но приятно то, что решение обеспечит масштабируемый подход к вашей проблеме.


Редактировать: еще одна вещь

Мне нравится идея базы данных MySQL, потому что вы можете добавить уровень защиты (не все изображения могут просматривать все). Если это, конечно, необходимо. Но это также делает вашу проблему ссылок (жестко запрограммированной) не такой большой проблемой. Поскольку все ссылки представляют собой один файл, из которого извлекаются изображения из БД, и единственное, что меняется, - это генерируемые переменные. Таким образом, ваш проект становится значительно более масштабируемым и легче вносить изменения в проект.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...