Оцените необходимую память для работы libGD - PullRequest
2 голосов
/ 24 августа 2010

Прежде чем пытаться изменить размер изображения в PHP с помощью libGD, я хотел бы проверить, достаточно ли памяти для выполнения операции, потому что «нехватка памяти» полностью убивает процесс PHP и не может быть перехвачен.

Моя идея заключалась в том, что мне нужно 4 байта памяти для каждого пикселя (RGBA) в оригинале и в новом изображении:

// check available memory
if(!is_mem_available(($from_w * $from_h * 4) + ($to_w * $to_h * 4))){
     return false;
}

Испытания показали, что это гораздо больше памяти, чем библиотека действительно использует. Кто-нибудь может предложить лучший метод?

Ответы [ 2 ]

2 голосов
/ 24 августа 2010
1 голос
/ 24 августа 2010

Я думаю, должно быть в состоянии определить пиковое использование памяти GD, анализируя исходный код imagecopyresampled, но это может быть сложно, требовать расширенного профилирования, варьироваться от версии к версии и бытькак правило, ненадежный.

В зависимости от вашей ситуации на ум приходит другой подход: при изменении размера изображения вызывайте другой сценарий PHP на том же сервере, но с использованием http:

$file = urlencode("/path/to/file");
$result = file_get_contents("http://example.com/dir/canary.php?file=$file&width=1000&height=2000"); 

(очисткапараметр file, очевидно)

Если этот скрипт завершится неудачно с ошибкой «недостаточно памяти», вы узнаете, что изображение слишком велико.

Если ему удастся успешно изменить размеризображение, он может вернуть путь к временному файлу, содержащему результат изменения размера.С этого момента все пойдет нормально.

...