Лучший способ кэшировать измененные изображения с помощью PHP и MySQL

Это зависит от длины данных, но здесь для небольших данных (365 строк) быстрее понимание списка:

In [108]: %timeit (ser.apply(lambda x: isinstance(x, pd.Timestamp)))
434 µs ± 57.4 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

In [109]: %timeit ([isinstance(x, pd.Timestamp) for x in ser])
140 µs ± 5.09 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

In [110]: %timeit (pd.to_datetime(ser, errors='coerce').notna())
1.01 ms ± 25.9 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

Но если тестировать больший DataFrame, то он быстрее to_datetime с проверить не пропущенные значения по Series.isna :

ser = pd.Series(pd.date_range('1980/01/05', '2020/01/05'))
ser.loc[3] = 4

print (len(ser))
14611

In [116]: %timeit (ser.apply(lambda x: isinstance(x, pd.Timestamp)))
6.42 ms ± 541 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

In [117]: %timeit ([isinstance(x, pd.Timestamp) for x in ser])
4.9 ms ± 256 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

In [118]: %timeit (pd.to_datetime(ser, errors='coerce').notna())
4.22 ms ± 167 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

14
задан Chris Hawes 26 September 2008 в 17:13
поделиться

9 ответов

В примере переписывания Дэна Удей есть две опечатки (и я не могу это прокомментировать), это должно быть :

RewriteCond %{REQUEST_URI} ^/images/cached/
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-f
RewriteRule (.*) /images/generate.php?$1 [L]

Regards.

.
10
ответ дан 1 December 2019 в 06:32
поделиться

Я сделал бы это другим способом.

проблемы: 1. Наличие PHP раздают файлы, менее эффективно, чем это могло быть. 2. PHP должен проверить существование файлов каждый раз, когда изображение требуют 3. Apache намного лучше в этом, чем PHP когда-либо будет.

здесь существует несколько решений.

можно использовать mod_rewrite на Apache. Возможно использовать mod_rewrite для тестирования, чтобы видеть, существует ли файл, и если так, служите тому файлу вместо этого. Это обходит PHP полностью и делает вещи намного быстрее. Реальный способ сделать это, тем не менее, должно было бы генерировать определенную схему URL, которая должна всегда существовать и затем перенаправлять к PHP если нет.

, Например:

RewriteCond %{REQUEST_URI} ^/images/cached/
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-f
RewriteRule (.*) /images/generate.php?$1 [L]

Поэтому, если клиент запрашивает /images/cached/<something> и тот файл, уже не существует, Apache перенаправит запрос к /images/generate.php?/images/cached/<something>. Этот сценарий может затем генерировать изображение, записать это в кэш и затем отправить его клиенту. В будущем Сценарий PHP никогда не называют за исключением новых изображений.

кэширование Использования. Как другой сказанный плакат, используйте вещи как mod_expires, Измененные в последний раз заголовки, и т.д. для ответа на условное выражение ПОЛУЧАЮТ запросы. Если клиент не должен повторно запрашивать изображения, загрузки страницы ускорятся существенно и загрузятся на сервере, уменьшится.

Для случаев, куда действительно необходимо отправить изображение от PHP, можно использовать mod_xsendfile, чтобы сделать это с меньше служебным. См. превосходное сообщение в блоге от Arnold Daniels по проблеме, но обратите внимание, что его пример для загрузок. Для обслуживания встроенных изображений выньте заголовок Довольного Расположения (третий заголовок () вызов).

Hope это помогает - больше после того, как моя мигрень разрешит.

30
ответ дан 1 December 2019 в 06:32
поделиться

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

Таким образом, следующий URL создаст 200x200 версия изображения 1234, если Вы не будете уже существовать. Я высоко предложил бы, чтобы Вы удостоверились, что требуемый URL содержит размеры изображения, которые Вы поддерживаете.

/images/get/200x200/1234.jpg

Злонамеренный человек мог начать запрашивать случайные URL, всегда изменяя высоту и ширину изображения. Это вызвало бы Ваш сервер некоторые серьезные проблемы b/c, он будет находиться там, по существу под ударом, генерируя изображения размеров, которые Вы не поддерживаете.

/images/get/0x1/1234.jpg
/images/get/0x2/1234.jpg
...
/images/get/0x9999999/1234.jpg
/images/get/1x1/1234.jpg
...
etc

Вот случайный надрез кода, иллюстрирующего это:

<?php

    $pathOnDisk = getImageDiskPath($_SERVER['REQUEST_URI']);

    if(file_exists($pathOnDisk)) {
        // send header with image mime type 
        echo file_get_contents($pathOnDisk);
        exit;
    } else {
        $matches = array();
        $ok = preg_match(
            '/\/images\/get\/(\d+)x(\d+)\/(\w+)\.jpg/', 
            $_SERVER['REQUEST_URI'], $matches);

        if(! $ok) {
            // invalid url
            handleInvalidRequest();
        } else {
            list(, $width, $height, $guid) = $matches;

            // you should do this!
            if(isSupportedSize($width, $height)) {
                // size is supported. all good
                // generate the resized image, save it & output it
            } else {
                // invalid size requested!!!
                handleInvalidRequest();
            }
        }
    }

    // snip
    function handleInvalidRequest() {
        // do something w/ invalid request          
        // show a default graphic, log it etc
    }
?>
5
ответ дан 1 December 2019 в 06:32
поделиться

Ваш подход кажется довольно разумным - я добавил бы, что некоторый механизм должен быть помещен в место, чтобы проверить, что дата, кэшированная версия была сгенерирована, была после последней измененной метки времени оригинала (источник) файл изображения и если не повторно создают, кэшировал/изменял размер версию. Это гарантирует, что, если изображение изменяется разработчиками, кэш будет обновлен соответственно.

0
ответ дан 1 December 2019 в 06:32
поделиться

Кажется большим сообщением, но моя проблема все еще остается нерешенной. У меня нет доступа к htaccess в моем поставщике хоста, таким образом, никакой вопрос апачской тонкой настройки. Существует ли действительно способ установить заголовок cace-управления для изображений?

1
ответ дан 1 December 2019 в 06:32
поделиться

Мне удалось сделать это просто использование заголовка перенаправления в PHP:

if (!file_exists($filename)) {  

    // *** Insert code that generates image ***

    // Content type
    header('Content-type: image/jpeg'); 

    // Output
    readfile($filename);    

} else {
    // Redirect
    $host  = $_SERVER['HTTP_HOST'];
    $uri   = rtrim(dirname($_SERVER['PHP_SELF']), '/\\');
    $extra = $filename;
    header("Location: http://$host$uri/$extra");
}
0
ответ дан 1 December 2019 в 06:32
поделиться

Это походит на твердый способ сделать это. Следующий шаг может быть должен пойти вне PHP/MySQL.

, Возможно, настраивают Ваши заголовки :

при использовании PHP для отправки типов MIME, Вы могли бы также использовать 'Активный' и заголовки 'управления Кэша', чтобы расширить жизнь Ваших изображений на сервере и снять часть загрузки PHP/MySQL.

кроме того, рассмотрите апачский плагин (плагины) для кэширования также. Как mod_expires.

, О, еще одна вещь, сколько контроля Вы имеете над своим сервером? Мы должны ограничить этот разговор всего PHP/MySQL?

0
ответ дан 1 December 2019 в 06:32
поделиться

phpThumb является платформой, которая генерирует измененные изображения/миниатюры на лету. Это также реализует кэширование, и очень легко реализовать.

код для изменения размеров изображения:

<img src="/phpThumb.php?src=/path/to/image.jpg&w=200&amp;h=200" alt="thumbnail"/>

даст Вам миниатюру 200 x 200;

Это также поддерживает создание водяных знаков.

Проверяют его в: http://phpthumb.sourceforge.net/

0
ответ дан 1 December 2019 в 06:32
поделиться

Вместо того, чтобы хранить адрес файла в базе данных, я предпочитаю добавлять случайное число к имени файла всякий раз, когда пользователь входит в систему. Примерно так для пользователя 1234: image / picture_1234.png? Rnd = 6534122341

Если пользователь отправляет новое изображение во время сеанса, я просто обновляю случайное число.

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

0
ответ дан 1 December 2019 в 06:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: