Fi1osof 31 июля 2013 0 6
Вчера оптимизировал один сайт заказчика, и хочу рассказать о проблеме, с которой столкнулся.

На сайте используется компонент Gallery, само собой картинки обрезаются phpThumb-ом. При этом картинки из кеша явно слишком долго отдавались (350ms 120 на 100 px), а статистика хостинга показывала неоправданно высокую нагрузку.

Стал копать все это дело, и оказалось, что нагрузку создает сам phpThumb из-за чтения директории кеша, в которой лежит 16000 кеш-картинок…

Детали.

В классе phpthumb есть метод:
function CleanUpCacheDirectory() {
        $this->DebugMessage('skipping CleanUpCacheDirectory() set to purge 
('.number_format($this->config_cache_maxage / 86400, 1).' days;
 '.number_format($this->config_cache_maxsize / 1048576, 2).'MB;
 '.number_format($this->config_cache_maxfiles).' files)', __FILE__, __LINE__);
        $DeletedKeys = array();
        $AllFilesInCacheDirectory = array();
        if (($this->config_cache_maxage > 0) || ($this->config_cache_maxsize > 0) || 
($this->config_cache_maxfiles > 0)) {
                $CacheDirOldFilesAge  = array();
                $CacheDirOldFilesSize = array();
                $AllFilesInCacheDirectory = phpthumb_functions:
:GetAllFilesInSubfolders($this->config_cache_directory);
                foreach ($AllFilesInCacheDirectory as $fullfilename) {
                        if (preg_match('/^phpThumb\_cache\_/i', basename($fullfilename)) && 
file_exists($fullfilename)) {
                                $CacheDirOldFilesAge[$fullfilename] = @fileatime($fullfilename);
                                if ($CacheDirOldFilesAge[$fullfilename] == 0) {
                                        $CacheDirOldFilesAge[$fullfilename] = @filemtime($fullfilename);
                                        }
                                        $CacheDirOldFilesSize[$fullfilename] = @filesize($fullfilename);
                                }
                        }

Вот если config_cache_maxage или config_cache_maxsize или config_cache_maxfiles больше нуля, но он считает всю кеш-папку, чтобы посчитать пределы и убедиться, что они не превышены. Сами понимаете, что это дает с 16000 картинками в папке…

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

Я Сплиттингреду написал тикет, но видимо пока я или кто-то не запостит исправления, это не будет исправлено.

В процессоре Gallery processors/web/phpthumb.php я временно пофиксил так:
$phpThumb = new modPhpThumb($ptOptions);

Переписал на
$phpThumb = new modPhpThumb($modx,array_merge($ptOptions, array(
    'config_cache_maxage'   => 0,
    'config_cache_maxsize'  => 0,
    'config_cache_maxfiles' => 0
)));


Нагрузка существенно упала.

6 комментариев
c
cyrax_02 11 августа 2015г в 13:04 #
Но ведь в настройках modx есть раздел phpThumb, где присутствуют все эти 3 настройки. И в методеmodPhpThumb::initialize() эти настройки загружаются в поля класса phpThumb:
$this->setParameter('config_cache_maxage',(float)$this->modx->getOption('phpthumb_cache_maxage',$this->config,30) * 86400);
        $this->setParameter('config_cache_maxsize',(float)$this->modx->getOption('phpthumb_cache_maxsize',$this->config,100) * 1024 * 1024);
        $this->setParameter('config_cache_maxfiles',(int)$this->modx->getOption('phpthumb_cache_maxfiles',$this->config,10000));

Или 2 года назад в настройках modx раздела phpThumb не было?
Fi1osof1
Fi1osof 11 августа 2015г в 13:10 #
'config_cache_maxage' != 'phpthumb_cache_maxage'. По этой причине найти их было никак. Это потом уже нашлись. И да, они тут помогают. В любом случае, материал оставил, ибо полезен :)
c
cyrax_02 11 августа 2015г в 13:23 #
'config_cache_maxage' != 'phpthumb_cache_maxage'
Имеете ввиду, что (config_cache_maxage) — в секундах, а (phpthumb_cache_maxage) — в днях?

Но ведь в методе modPhpThumb::initialize() выполняется конвертация и ориганальные конфиги phpThumb корректно формируются на основе modx-настроек. Не смекнул, что значит «найти их было phpthumb_cache_maxage, phpthumb_cache_maxsize, phpthumb_cache_maxfiles?
Fi1osof1
Fi1osof 11 августа 2015г в 13:48 #
Я специально в кавычках написал. Сравниваю строки, а не результаты чтения конфигов. 'config_cache_maxage' !== 'phpthumb_cache_maxage'. Так понятней?
Я к тому, что поиск ни по сырцам, ни по базе данных не позволял найти эти конфиги. В MODX-е они переименованы.
c
cyrax_02 11 августа 2015г в 13:25 #
Не смекнул, что значит «найти их было никак". Не было modx-настроек phpthumb_cache_maxage, phpthumb_cache_maxsize, phpthumb_cache_maxfiles?
Fi1osof1
Fi1osof 11 августа 2015г в 13:49 #
Именно.
Авторизуйтесь или зарегистрируйтесь (можно через соцсети ), чтобы оставлять комментарии.