Самый быстрый способ перенаправить отсутствующие файлы изображений - PullRequest
0 голосов
/ 14 июня 2011

У меня есть система миниатюрных изображений на лету, и я пытаюсь найти лучший способ обеспечить максимально быструю обработку изображений. Вот текущий поток:

  • Пользователь запрашивает миниатюру thumbnails/this-is-the-image-name.gif?w=200&h=100&c=true
  • Файл htaccess использует modrewrite для отправки запросов из этой папки в файл PHP
  • PHP-файл проверяет file_exists() для запрашиваемого изображения на основе значений строки запроса

Если это так:

header('content-type: image/jpeg'); 
echo file_get_contents($file_check_path); 
die();

Если это не так, он создает эскиз и возвращает его.

У меня вопрос, есть ли способ оптимизировать это, чтобы быть быстрее? В идеале мой htaccess-файл должен выполнять file_exists и отправлять вас в PHP-файл только тогда, когда он этого не делает ... но поскольку я использую строки запросов, нет способа создать динамический URL для проверки . Стоит ли переключаться со строк запроса на фактический запрос файла, а затем выполнять проверку существования в htaccess? Это будет быстрее? Я предпочитаю синтаксис строки запроса, но в настоящее время все запросы отправляются в файл PHP, который возвращает изображения независимо от того, существуют они или нет.

Спасибо за любой вклад заранее!

1 Ответ

1 голос
/ 14 июня 2011

Вы должны быть в состоянии сделать это в теории.Команда RewriteCond имеет флаг -f, который можно использовать для проверки существования файла.Вы должны иметь такое правило:

# If the file doesn't exist
RewriteCond %{REQUEST_FILENAME} !-f

# off to PHP we go
RewriteRule (.*)   your-code.php [L,QSA]

Суть в том, что я предполагаю, что вы называете файлы в соответствии с входящими параметрами - поэтому приведенный выше пример может быть thumbnails/this-is-the-image-name-200-100.gif,Если это так, вам нужно сгенерировать имя файла для тестирования на лету и проверить его вместо REQUEST_FILENAME - детали этого действительно специфичны для вашей настройки.Если вы можете, я бы порекомендовал какую-то систему, которая не требует слишком больших усилий.Например, вы можете сохранить свои миниатюры в файловой системе в структуре каталогов, например /width/height/filename, которую проще проверить в правиле перезаписи, чем modified-filename-width-height.gif.

Если вы еще не проверили этоout, Руководство Apache по mod_rewrite содержит множество достойных примеров.

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

# generate potential thumbnail filename
RewriteCond %{SCRIPT_FILENAME}%{QUERY_STRING} /([a-zA-Z0-9-]+).(jpg|gif|png)w=([0-9]+)&h=([0-9]+)(&c=(true|false))

# store it in a variable
RewriteRule .* - [E=thumbnail:%1-%2-%3-%4-%6.jpg]

# check to see if it exists
RewriteCond %{DOCUMENT_ROOT}/path/%{ENV:thumbnail} !-f 

# off to PHP we go
RewriteRule (.*)   thumbnail.php?file_name=%1&type=%2&w=%3&h=%4&c=%6 [L,QSA]

Это полностью не проверено и может не работать наверняка.Я бы порекомендовал еще пару вещей:

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

...