Сейчас проблемы вылезна для Zend Почему падает сервер - понять было очень сложно. На апаче может быть жестко ограничено количество рабочих процессов (вокеров). Nginx решает эту проблему, но только если вы будете ссылаться напрямую на картинки.
Пример реализации смотрите тут
/**
* Prepare thumb's for Nginx
* Return link to generated image
* Create cached images, if dose not exists'
*/
require_once('./library/thumb/phpthumb.class.php');
function cacheThumb($url, $params = []) {
global $PHPTHUMB_CONFIG;
//$config = Zend_Registry::get('config_general');
$parsedUrl = phpthumb_functions::ParseURLbetter($url);
$parsedUrl = explode('&', $parsedUrl['path']);
$srcFile = $_SERVER['DOCUMENT_ROOT'] . '/' . $parsedUrl[0];
if (!file_exists($srcFile)) return $srcFile;
// TODO: Add default image?
$dstFile = md5($url);
$dstPath = $PHPTHUMB_CONFIG->cache_directory . '/' . substr($dstFile, 0, 2) . '/' . substr($dstFile, 2, 2) . '/';
$dstFile = $dstPath . $dstFile . '.jpg';
if ((file_exists($dstFile)) && (fileatime($dstFile) >= fileatime($srcFile))) return '/' . $dstFile;
phpthumb_functions::EnsureDirectoryExists($dstPath);
foreach ($parsedUrl as $sPair) {
if (trim($sPair) == '') continue;
[$sKey, $sValue] = explode('=', $sPair);
$params[$sKey] = urldecode($sValue);
}
$thumb = new phpThumb();
$thumb->setSourceFilename($srcFile);
$allowedParameters = [ 'src', 'new', 'w', 'h', 'wp', 'hp', 'wl', 'hl', 'ws', 'hs', 'f', 'q',
'sx','sy','sw','sh','zc','bc','bg','bgt','fltr','xto','ra', 'ar',
'aoe', 'far', 'iar', 'maxb', 'down', 'phpThumbDebug',
'hash', 'md5s', 'sfn', 'dpi', 'sia', 'nocache',
];
foreach ($params as $sKey => $sValue) {
if (in_array($sKey, $allowedParameters)) $thumb->setParameter($sKey, $sValue);
}
$thumb->config_allow_src_above_docroot = true;
$thumb->GenerateThumbnail();
//$thumb->RenderToFile($config->common->path->root . $dstFile);
$thumb->RenderToFile($dstFile);
return '/' . $dstFile;
}
UPD: про тхумб. в битриксе есть встроенная функция пережатия изображений CFile::ResizeImageGet.
$fileUrl = CFile::ResizeImageGet($imageInfo, $size, $resizeType , true);
Функция уменьшает картинку и кладет уменьшенную копию в папку /upload/resize_cache/+хитрый путь, тем самым один раз уменьшив изображение имеем физический файл, который позволяет при последующих обращениях не проводить операции по уменьшению изображения. При следующем вызове функция вернет путь к уменьшенному файлу.
$imageInfo - то, что возвращается Ивановской функцией getFileData или автоматически генерируется при выводе в шаблон картинок.
$size = array('width' => 100, 'height' => 75);
$resizeType - тип масштабирования:
BX_RESIZE_IMAGE_EXACT - масштабирует в прямоугольник $arSize без сохранения пропорций
BX_RESIZE_IMAGE_PROPORTIONAL - масштабирует с сохранением пропорций, размер ограничивается $arSize
BX_RESIZE_IMAGE_PROPORTIONAL_ALT - масштабирует с сохранением пропорций, размер ограничивается $arSize, улучшена обработка вертикальных картинок.
P.S. Кстати, на PHP 5.3 и выше функция split и группа функций ereg - deprecated и не работают. Последняя версия тхумба на сорсфордже от 2008 года об этом естественно не знает, и начинает активно глючить и падать. Как костыль можно использовать такие действия: отклчить вывод ошибок в phpThumb.php (например через error_reporting(0);) и в конфиге phpThumb.config.php заменить
$PHPTHUMB_CONFIG['document_root'] = realpath((getenv('DOCUMENT_ROOT') && ereg('^'.preg_quote(realpath(getenv('DOCUMENT_ROOT'))), realpath(__FILE__))) ? getenv('DOCUMENT_ROOT') : str_replace(dirname(@$_SERVER['PHP_SELF']), '', str_replace(DIRECTORY_SEPARATOR, '/', dirname(__FILE__))));
на простое
$PHPTHUMB_CONFIG['document_root'] = $_SERVER['DOCUMENT_ROOT'];
Но намного лучше заменить все устаревшие функции на preg'и, например так.