[Решено] Большая нагрузка phpThumb на сервер при большом количестве картинок
Вчера оптимизировал один сайт заказчика, и хочу рассказать о проблеме, с которой столкнулся. На сайте используется компонент Gallery, само собой картинки обрезаются phpThumb-ом. При этом картинки из кеша явно слишком долго отдавались (350ms 120 на 100 px), а статистика хостинга показывала неоправданно высокую нагрузку. Стал копать все это дело, и оказалось, что нагрузку создает сам phpThumb из-за чтения директории кеша, в которой лежит 16000 кеш-картинок…
Детали.
В классе phpthumb есть метод:
<?php
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
)));
Нагрузка существенно упала.