Библиотеки проверял, повторюсь что на ядре битрикс 17 версии работает ресайз корректно.
Удалось выяснить что, вероятно в последнем обновлении, в методе CFile::ResizeImageFile, который выполняет ресайз в методе CFile::ResizeImageGet, добавлен следующий код:
Код |
---|
$hLock = $io->OpenFile($sourceFile, "r+");
if ($hLock) {
flock($hLock, LOCK_EX);
if ($io->FileExists($destinationFile)) {
CFile::ScaleImage($arSourceFileSizeTmp[0], $arSourceFileSizeTmp[1], $arSize, $resizeType, $bNeedCreatePicture, $arSourceSize, $arDestinationSize);
$arDestinationSizeTmp = CFile::GetImageSize($destinationFile);
if (
is_array($arDestinationSizeTmp) && $arDestinationSizeTmp[0] == $arDestinationSize["width"] && $arDestinationSizeTmp[1] == $arDestinationSize["height"]
) {
flock($hLock, LOCK_UN);
fclose($hLock);
return true;
}
}
}
|
Есть мнение что после первой блокировки (3 строка) flock($hLock, LOCK_EX); эта блокировка в дальнейшем не снимается.
Если добавить код который будет снимать блокировку с файла, ресайз начинает работать в штатном режиме, ну или если вообще закомментировать этот кусок кода, то ресайз начинает работать
Код |
---|
$hLock = $io->OpenFile($sourceFile, "r+");
if ($hLock) {
flock($hLock, LOCK_EX);
if ($io->FileExists($destinationFile)) {
CFile::ScaleImage($arSourceFileSizeTmp[0], $arSourceFileSizeTmp[1], $arSize, $resizeType, $bNeedCreatePicture, $arSourceSize, $arDestinationSize);
$arDestinationSizeTmp = CFile::GetImageSize($destinationFile);
if (
is_array($arDestinationSizeTmp) && $arDestinationSizeTmp[0] == $arDestinationSize["width"] && $arDestinationSizeTmp[1] == $arDestinationSize["height"]
) {
flock($hLock, LOCK_UN);
fclose($hLock);
return true;
}
}
fclose($hLock);
}
|