Проблемный сервер (nginx/1.26.2 с php-fpm8.2, 8.2.26 (cli), Zend Engine v4.2.26):
Код: Выделить всё
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
$file="/var/www/html/test2.jpg";
$src_img=imagecreatefromjpeg($file); // completely ignores this commands memory usage of 300M+
print 'Memory usage: '. round(memory_get_peak_usage(true)/(1024*1024)) . 'M
'; //returns 2M
Рабочий сервер (apache, PHP 8.3.14 php83-cgi, Zend Engine v4.3.14):
Код: Выделить всё
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
$file="/var/www/html/test2.jpg";
$src_img=imagecreatefromjpeg($file); // works correctly 300M+
print 'Memory usage: '. round(memory_get_peak_usage(true)/(1024*1024)) . 'M
'; //returns 300M+
Текст:
У меня PHP php-fpm8.2 с nginx работает (Debian 12, VPS). Но на этом VPS Memory_get_peak_usage не учитывает imagecreatefromjpeg(); использование памяти, то есть около 300M+, поэтому php.ini Memory_limit также игнорируется и составляет 10M (поскольку php сообщает только 2M), если не хватает памяти (поскольку реальное использование составляет 300M+), служба PHP прекращается (если доступная память 300 или меньше система прекратит службу php).
Этот скрипт работает на каком-то другом общем сервере Apache и правильно отображает использование памяти около 300 МБ, но на этом ВПС показывает только 2М. Команда Linux top также показывает использование памяти около 300 МБ.
Почему Memory_get_peak_usage ведет себя неправильно на VPS.
Если у кого-то есть опыт, поделитесь. Спасибо!
*Я обновил свой «Проблемный сервер» до 8.3.15 с php.ini по умолчанию, все еще игнорируя память GD.
*Чтобы воспроизвести ошибку: Установите свежий Debian 12 (VPS при условии, что у меня SMP PREEMPT_DYNAMIC Debian 6.1.119-1, 6.1.0-28-amd64, x86_64). Я установил пакеты Debian по умолчанию nginx и PHP (не версию Apache), установил php-gd, запустил код test.php или просто использовал командную строку (проверено на двух разных серверах VPS Debian 12):
Код: Выделить всё
sudo php /var/www/html/test.php(Вы можете использовать изображение обычного размера в своем тесте или использовать мое изображение, модуль библиотеки GD использует много памяти)
*Это огромная проблема: если кто-то загрузит на этот сервер небольшое изображение, но с огромным разрешением, которое занимает более 3 ГБ памяти сервера, PHP позволит это сделать , и веб-сайт/приложение выйдет из строя из-за службы PHP из-за память.
*установка ограничений памяти в php.ini или www.conf игнорируется, поскольку PHP-FPM не знает, сколько памяти использует скрипт (поскольку он использует модуль PHP).
* только обходной путь : используйте getimagesize () и проверьте, что разрешение не слишком высока, прежде чем использовать библиотеку изображений GD.
Подробнее здесь: https://stackoverflow.com/questions/793 ... mory-usage
Мобильная версия