PHP: полный мануал с примерами, функциями и ООП
Практический мануал PHP: от переменных и читаемого кода до безопасных форм, интеграций, базы данных и ООП на примере магазина. Учебный маршрут, поиск функций, подробные примеры, разбор ошибок и исходники для скачивания.

Дерево руководства
Глава 431 · После первых изображений, файлов и объектов
Gmagick: проверка окружения и обработка заданий превью
Выбрать кодер, записать воспроизводимый отчёт и переиспользовать PHP-объект с понятной очисткой native-состояния.
Выбрать известный кодер и проверить реальную запись
Сервис превью должен проверить, есть ли нужный кодер, и закончить проверку реальной записью. queryFormats возвращает имена форматов. В нашей сборке pattern PNG* не отфильтровал список, поэтому PHP явно выбирает имена с префиксомPNG, затем создаёт и заново открывает миниатюру.

$environment = new Gmagick();
$all = $environment->queryFormats("*");
$png = array_values(array_filter($all, fn($name) => str_starts_with($name, "PNG")));
if (!in_array("PNG", $png, true)) { throw new RuntimeException("PNG unavailable"); }
$image = new Gmagick(__DIR__ . "/product.ppm");
$image->thumbnailImage(160, 100, true);
$image->setImageFormat("PNG"); $image->writeImage("preview.png");Официальная сигнатура queryFormats(pattern="*"):array; строка результата в документации ошибочно говорит Gmagick object. Фактически получен массив строк. В discovery запросы PNG*, J* и заведомо отсутствующий шаблон вернули одинаковый полный список, поэтому полагаться на серверную фильтрацию нельзя. array_filter выбирает нужные значения, array_values переиндексирует результат. Само присутствие имени не доказывает успешную обработку конкретного входа или наличие всех внешних делегатов; наша проверка подтверждает именно PNG-запись и чтение.
<?php
declare(strict_types=1);
require __DIR__.'/gm100-export-fixture.php';
gmRestore();
$environment=new Gmagick();$advertised=$environment->queryFormats('PNG*');$all=$environment->queryFormats('*');
$pngNames=array_values(array_filter($all,fn($name)=>str_starts_with($name,'PNG')));
if(!in_array('PNG',$pngNames,true))throw new RuntimeException('PNG coder is not advertised');
$image=new Gmagick(__DIR__.'/product.ppm');$image->thumbnailImage(160,100,true);gmPng($image,'gm100-export-formats-preview.png');$decoded=new Gmagick(__DIR__.'/gm100-export-formats-preview.png');
gmReport('gm100-export-formats',["gmagick.queryformats"],["gm100-export-formats-preview.png"],['pattern_ignored_here'=>$advertised===$all,'local_filter_is_specific'=>count($pngNames)>0&&count($pngNames)<count($all),'actual_png'=>$decoded->getImageFormat()==="PNG"&&$decoded->getImageWidth()===160],$errors??[],['png_names'=>$pngNames,'advertised_count'=>count($all)],[]);
echo "formats: native-pattern=ignored php-filter=PNG actual-roundtrip=passed\n";
Ожидаемый результат
formats: native-pattern=ignored php-filter=PNG actual-roundtrip=passed
Распакуйте архив и выполните php example.php. Вложенные .b64 содержат все входы; helper проверяет SHA256 и восстанавливает PPM. gmPng сохраняет копию в PNG8. gmJpegHeader читает SOF0/SOF2 и коэффициенты компонентов из настоящего JPEG, gmPngInterlace читает IHDR. metrics.json содержит результаты и проверки. JPEG/PNG и квитанции появятся после выполнения; исходные файлы не берутся из внешней папки.
Упражнение: формат есть в списке, но конкретный файл не открывается. Решение: отдельно обработать ошибку чтения/записи, проверить вход и окружение. Не превращать весь список кодеров в разрешённые пользовательские расширения: сервису нужен собственный ограниченный набор.
Связанные шаги: имена и путь записи, кодирование JPEG/PNG, окружение и рабочий объект, качество, метаданные и глубина файла.
Сохранить отчёт окружения вместе с превью
Клиент сообщил, что превью на другом сервере выглядит иначе. Вместе с настоящей миниатюрой сохраним отчёт: версия PHP, версия расширения, версия GraphicsMagick, QuantumDepth, имя пакета, дата выпуска и строка copyright. Эти сведения помогают воспроизвести обработку, а не добавляют эффект к изображению.

$environment = new Gmagick();
$version = $environment->getVersion();
$quantum = $environment->getQuantumDepth();
$package = $environment->getPackageName();
$release = $environment->getReleaseDate();
$copyright = $environment->getCopyright();getVersion возвращает массив versionNumber/versionString; это версия GraphicsMagick API, не номер PHP-расширения. getQuantumDepth возвращает массив quantumDepthLong/quantumDepthString, несмотря на слова «as a string» в старом описании. Здесь это 16 иQ16: внутренняя разрядность квантов, а не гарантированная глубина каждого выходного PNG. Три остальных getter возвращают строки. getCopyright сообщает права библиотеки, а не лицензию входной фотографии. Полная программа добавляет к отчёту размер и SHA256 созданного превью.
<?php
declare(strict_types=1);
require __DIR__.'/gm100-export-fixture.php';
gmRestore();
$environment=new Gmagick();$report=['graphicsmagick'=>$environment->getVersion(),'quantum'=>$environment->getQuantumDepth(),'package'=>$environment->getPackageName(),'release'=>$environment->getReleaseDate(),'copyright'=>$environment->getCopyright(),'php'=>PHP_VERSION,'extension'=>phpversion('gmagick')];
$image=new Gmagick(__DIR__.'/product.ppm');$image->thumbnailImage(160,100,true);gmPng($image,'gm100-export-environment-receipt-preview.png');$report['output']=gmInspect('gm100-export-environment-receipt-preview.png');
file_put_contents(__DIR__.'/gm100-export-environment-receipt-environment.json',json_encode($report,JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES|JSON_THROW_ON_ERROR));
gmReport('gm100-export-environment-receipt',["gmagick.getversion", "gmagick.getquantumdepth", "gmagick.getpackagename", "gmagick.getreleasedate", "gmagick.getcopyright"],["gm100-export-environment-receipt-preview.png"],['version_structure'=>is_int($report["graphicsmagick"]["versionNumber"])&&is_string($report["graphicsmagick"]["versionString"]),'quantum_structure'=>$report["quantum"]["quantumDepthLong"]===16&&$report["quantum"]["quantumDepthString"]==="Q16",'identity_nonempty'=>$report["package"]!==""&&$report["release"]!==""&&$report["copyright"]!=="",'receipt_binds_output'=>$report["output"]["sha256"]===hash_file("sha256",__DIR__."/gm100-export-environment-receipt-preview.png")],$errors??[],$report,[]);
echo "environment: preview=written version-quantum-identity=recorded\n";
Ожидаемый результат
environment: preview=written version-quantum-identity=recorded
Распакуйте архив и выполните php example.php. Вложенные .b64 содержат все входы; helper проверяет SHA256 и восстанавливает PPM. gmPng сохраняет копию в PNG8. gmJpegHeader читает SOF0/SOF2 и коэффициенты компонентов из настоящего JPEG, gmPngInterlace читает IHDR. metrics.json содержит результаты и проверки. JPEG/PNG и квитанции появятся после выполнения; исходные файлы не берутся из внешней папки.
Упражнение: опубликовать весь внутренний диагностический JSON посетителю. Решение: хранить подробный отчёт в журнале сервиса, а пользователю отдавать понятный статус и результат. Сравнивая окружения, различайте версию PHP, phpversion("gmagick") и GraphicsMagick: они меняются независимо.
Связанные шаги: имена и путь записи, кодирование JPEG/PNG, окружение и рабочий объект, качество, метаданные и глубина файла.
Проверить условия экспорта до обработки задания
Перед выполнением конкретного экспортного рецепта проверим наличие PNG/JPEG и согласованную Q16-сборку. Затем действительно запишем JPEG4:4:4, откроем его и покажем декодированный результат. Так предварительная проверка связана с полезным действием, а не заканчивается списком имён.

Файлы именно этого выполненного примера: Скачать настоящий baseline JPEG: proof.jpg. PNG выше — декодированные превью, не демонстрация порядка загрузки JPEG.
$environment = new Gmagick();
$formats = $environment->queryFormats("*");
$version = $environment->getVersion();
$quantum = $environment->getQuantumDepth();
if ($quantum["quantumDepthLong"] !== 16) { throw new RuntimeException("Review this recipe"); }
if (!in_array("JPEG", $formats, true)) { throw new RuntimeException("JPEG unavailable"); }ТребованиеQ16 — граница проверенного рецепта этого примера, не утверждение, что Gmagick в принципе обязан быть Q16. На другом сервере сначала пересматривают параметры и ожидаемый результат. versionNumber служит числовой идентификацией API; не следует угадывать его формат как обычную десятичную версию. Читаемая versionString хранится рядом. После проверки кодер всё равно должен успешно записать настоящий файл; SOF подтверждает выбранные коэффициенты.
<?php
declare(strict_types=1);
require __DIR__.'/gm100-export-fixture.php';
gmRestore();
$environment=new Gmagick();$formats=$environment->queryFormats('*');$version=$environment->getVersion();$depth=$environment->getQuantumDepth();
if(!in_array('PNG',$formats,true)||!in_array('JPEG',$formats,true))throw new RuntimeException('This job requires PNG and JPEG');
if($depth['quantumDepthLong']!==16)throw new RuntimeException('This stored recipe was reviewed for Q16');
$image=new Gmagick(__DIR__.'/encoding.ppm');$image->setImageDepth(8);$image->setImageFormat('JPEG');$image->setCompressionQuality(80);$image->setSamplingFactors([1.0,1.0,1.0]);$image->writeImage(__DIR__.'/gm100-export-preflight-proof.jpg');
$decoded=new Gmagick(__DIR__.'/gm100-export-preflight-proof.jpg');gmPng($decoded,'gm100-export-preflight-preview.png');$header=gmJpegHeader('gm100-export-preflight-proof.jpg');
gmReport('gm100-export-preflight',["gmagick.queryformats", "gmagick.getversion", "gmagick.getquantumdepth"],["gm100-export-preflight-preview.png"],['versions_recorded'=>$version["versionNumber"]>0,'actual_encoder_proved'=>$header["sampling_factors"]===[[1,1],[1,1],[1,1]]&&$decoded->getImageFormat()==="JPEG"],$errors??[],['version'=>$version,'quantum'=>$depth,'actual_jpeg'=>$header],[]);
echo "preflight: required-codecs=listed Q16=checked actual-jpeg=decoded\n";
Ожидаемый результат
preflight: required-codecs=listed Q16=checked actual-jpeg=decoded
Распакуйте архив и выполните php example.php. Вложенные .b64 содержат все входы; helper проверяет SHA256 и восстанавливает PPM. gmPng сохраняет копию в PNG8. gmJpegHeader читает SOF0/SOF2 и коэффициенты компонентов из настоящего JPEG, gmPngInterlace читает IHDR. metrics.json содержит результаты и проверки. JPEG/PNG и квитанции появятся после выполнения; исходные файлы не берутся из внешней папки.
Упражнение: кодеры объявлены, но папка вывода недоступна. Решение: обработчик задания должен сообщить ошибку записи; наличие формата не гарантирует файловые права. Проверки окружения, входного изображения и назначения — отдельные условия успеха.
Связанные шаги: имена и путь записи, кодирование JPEG/PNG, окружение и рабочий объект, качество, метаданные и глубина файла.
Очистить кадры и обработать следующий вход
Рабочий объект обработал цветную мишень и должен перейти к товару. clear удаляет изображения, но PHP-переменная остаётся объектом Gmagick. После очистки сразу readImage загружает новый вход; свойства изображения проверяются после загрузки. Независимый clone первого входа остаётся живым.


$worker = new Gmagick(__DIR__ . "/encoding.ppm");
$saved = clone $worker;
$returned = $worker->clear();
$worker->readImage(__DIR__ . "/product.ppm");
$worker->setImageFormat("PNG"); $worker->writeImage("second.png");Официальный текст говорит об очистке ресурсов и возвращает Gmagick. В текущем C clear проходит по кадрам через MagickRemoveImage; настройки самого Wand могут сохраниться. Полная программа заранее задаёт имя задания и sampling, затем читает их только после загрузки второго изображения. В этой сборке запросы к пустому Wand опасны для последующего чтения: getImageWidth вызывает исключение, а getNumberImages возвращает 0, но также записывает native-ошибку. Затем readImage может завершиться этой ошибкой. Поэтому между clear и readImage нет getter: сначала загружаем новый вход, затем проверяем его пиксели и настройки. Нулевое число кадров здесь не доказывает отсутствие native-ошибки. clear возвращает тот же PHP-объект, но не очищает отдельно созданный clone.
<?php
declare(strict_types=1);
require __DIR__.'/gm100-export-fixture.php';
gmRestore();
$worker=new Gmagick(__DIR__.'/encoding.ppm');$worker->setFilename('worker-job');$worker->setSamplingFactors([2.0,1.0,1.0]);
$first=clone $worker;gmPng($first,'gm100-export-clear-reuse-first.png');$ret=$worker->clear();
$worker->readImage(__DIR__.'/product.ppm');$retainedName=$worker->getFilename();$retainedFactors=$worker->getSamplingFactors();gmPng($worker,'gm100-export-clear-reuse-second.png');
gmReport('gm100-export-clear-reuse',["gmagick.clear", "gmagick.getfilename", "gmagick.getsamplingfactors"],["gm100-export-clear-reuse-first.png", "gm100-export-clear-reuse-second.png"],['clear_returns_same_object'=>$ret===$worker,'second_input_pixels'=>$worker->getImageSignature()===(new Gmagick(__DIR__."/product.ppm"))->getImageSignature(),'clone_still_exists'=>$first->getImageSignature()===(new Gmagick(__DIR__."/encoding.ppm"))->getImageSignature(),'wand_name_retained'=>$retainedName==="worker-job"],$errors??[],['name_after_reload'=>$retainedName,'sampling_after_reload'=>$retainedFactors],[]);
echo "clear: images=removed same-object=reused independent-clone=kept\n";
Ожидаемый результат
clear: images=removed same-object=reused independent-clone=kept
Распакуйте архив и выполните php example.php. Вложенные .b64 содержат все входы; helper проверяет SHA256 и восстанавливает PPM. gmPng сохраняет копию в PNG8. gmJpegHeader читает SOF0/SOF2 и коэффициенты компонентов из настоящего JPEG, gmPngInterlace читает IHDR. metrics.json содержит результаты и проверки. JPEG/PNG и квитанции появятся после выполнения; исходные файлы не берутся из внешней папки.
Упражнение: следующий товар не должен унаследовать прежние параметры экспорта. Решение: задавать полный рецепт каждого задания явно либо выбрать полный сброс Wand через destroy. Не измеряйте успех очистки обещанием немедленного падения RSS процесса: поведение аллокатора и PHP memory_get_usage не является прямым счётчиком всех native-ресурсов.
Связанные шаги: имена и путь записи, кодирование JPEG/PNG, окружение и рабочий объект, качество, метаданные и глубина файла.
Сбросить native Wand и снова использовать PHP-объект
Полностью сбросим native Wand после задания, сохранив сам PHP-объект для повторного чтения. Название destroy может создать впечатление, что переменная перестаёт существовать; в этой реализации C уничтожает старый Wand, создаёт новый и возвращает true. Это отличается от unset переменной PHP.


$worker = new Gmagick(__DIR__ . "/encoding.ppm");
$saved = clone $worker;
$ok = $worker->destroy();
$worker->readImage(__DIR__ . "/product.ppm");
$worker->setImageFormat("PNG"); $worker->writeImage("fresh-worker.png");destroy не принимает аргументов, официально возвращает bool. После destroy сразу вызываем readImage без промежуточных getter пустого Wand. В этой сборке даже getNumberImages, вернувший 0, оставляет native-ошибку и мешает следующему чтению; getImageWidth также требует существующее изображение. Поэтому все проверки выполняются после загрузки нового входа. После нового чтения проверяются пиксели второго входа, сброс имени old-job и пустой sampling-набор. Независимый clone исходной мишени не уничтожается вместе с другим объектом.
<?php
declare(strict_types=1);
require __DIR__.'/gm100-export-fixture.php';
gmRestore();
$worker=new Gmagick(__DIR__.'/encoding.ppm');$worker->setFilename('old-job');$worker->setSamplingFactors([2.0,1.0,1.0]);$saved=clone $worker;
gmPng($saved,'gm100-export-destroy-reuse-first.png');$ret=$worker->destroy();$worker->readImage(__DIR__.'/product.ppm');$name=$worker->getFilename();$sampling=$worker->getSamplingFactors();gmPng($worker,'gm100-export-destroy-reuse-second.png');
gmReport('gm100-export-destroy-reuse',["gmagick.destroy", "gmagick.getfilename", "gmagick.getsamplingfactors"],["gm100-export-destroy-reuse-first.png", "gm100-export-destroy-reuse-second.png"],['destroy_true'=>$ret===true,'object_reusable'=>$worker->getImageSignature()===(new Gmagick(__DIR__."/product.ppm"))->getImageSignature(),'name_reset'=>$name!=="old-job",'sampling_reset'=>$sampling===[],'clone_kept'=>$saved->getImageSignature()===(new Gmagick(__DIR__."/encoding.ppm"))->getImageSignature()],$errors??[],['name_after_reload'=>$name,'sampling_after_reload'=>$sampling],[]);
echo "destroy: return=true native-wand=reset php-object=reused clone=kept\n";
Ожидаемый результат
destroy: return=true native-wand=reset php-object=reused clone=kept
Распакуйте архив и выполните php example.php. Вложенные .b64 содержат все входы; helper проверяет SHA256 и восстанавливает PPM. gmPng сохраняет копию в PNG8. gmJpegHeader читает SOF0/SOF2 и коэффициенты компонентов из настоящего JPEG, gmPngInterlace читает IHDR. metrics.json содержит результаты и проверки. JPEG/PNG и квитанции появятся после выполнения; исходные файлы не берутся из внешней папки.
Упражнение: вызвать clear и destroy после каждого отдельного действия «на всякий случай». Решение: выбрать осмысленную границу владения ресурсом. clear полезен для удаления кадров, destroy — для полного сброса native Wand в этой версии; повторять оба после каждого getter не требуется. Если clone больше не нужен, закончите его обработку отдельно.
Связанные шаги: имена и путь записи, кодирование JPEG/PNG, окружение и рабочий объект, качество, метаданные и глубина файла.
Обработать два задания с явной границей состояния
Обработаем два настоящих входа одним worker: цветную мишень и схему товара. После каждого задания clear удаляет кадры; в конце destroy сбрасывает Wand. Квитанция сохраняет библиотечную идентификацию один раз и отдельно связывает оба выходных PNG с размерами и SHA256.


$worker = new Gmagick();
foreach (["encoding.ppm", "product.ppm"] as $input) {
$worker->readImage(__DIR__ . "/" . $input);
try { $worker->thumbnailImage(160, 100, true); }
finally { $worker->clear(); }
}
$worker->destroy();Короткий фрагмент показывает только границу очистки; полная программа сохраняет каждый результат внутри try до clear. finally выполняется и при исключении из обработки, поэтому следующий шаг не должен молча продолжать со старыми кадрами. Имя файла определяется индексом задания, что предотвращает перезапись первого результата вторым. getPackageName/getReleaseDate/getCopyright относятся ко всему worker-окружению и попадают в один диагностический раздел отчёта.
<?php
declare(strict_types=1);
require __DIR__.'/gm100-export-fixture.php';
gmRestore();
$worker=new Gmagick();$identity=['package'=>$worker->getPackageName(),'release'=>$worker->getReleaseDate(),'copyright'=>$worker->getCopyright()];$outputs=[];
foreach(['encoding.ppm','product.ppm']as $index=>$input){
$worker->readImage(__DIR__.'/'.$input);
try{$worker->thumbnailImage(160,100,true);$name='gm100-export-worker-batch-item'.($index+1).'.png';gmPng($worker,$name);$outputs[]=gmInspect($name);}
finally{$worker->clear();}
}
$destroyed=$worker->destroy();$receipt=['library'=>$identity,'outputs'=>$outputs,'cleanup'=>'clear after each item; destroy at worker reset'];
file_put_contents(__DIR__.'/gm100-export-worker-batch-batch.json',json_encode($receipt,JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES|JSON_THROW_ON_ERROR));
gmReport('gm100-export-worker-batch',["gmagick.getpackagename", "gmagick.getreleasedate", "gmagick.getcopyright", "gmagick.clear", "gmagick.destroy"],["gm100-export-worker-batch-item1.png", "gm100-export-worker-batch-item2.png"],['two_distinct_outputs'=>count($outputs)===2&&$outputs[0]["sha256"]!==$outputs[1]["sha256"],'worker_reset'=>$destroyed===true,'identity_in_receipt'=>$identity["package"]!==""&&$identity["release"]!==""&&$identity["copyright"]!==""],$errors??[],$receipt,[]);
echo "batch: jobs=2 output-receipts=2 clear=per-job destroy=worker-reset\n";
Ожидаемый результат
batch: jobs=2 output-receipts=2 clear=per-job destroy=worker-reset
Распакуйте архив и выполните php example.php. Вложенные .b64 содержат все входы; helper проверяет SHA256 и восстанавливает PPM. gmPng сохраняет копию в PNG8. gmJpegHeader читает SOF0/SOF2 и коэффициенты компонентов из настоящего JPEG, gmPngInterlace читает IHDR. metrics.json содержит результаты и проверки. JPEG/PNG и квитанции появятся после выполнения; исходные файлы не берутся из внешней папки.
Упражнение: одно задание упало при записи, но следующие допустимо продолжить. Решение: добавить внешний catch вокруг обработки каждого задания, сохранить причину и обеспечить выполнение finally; это политика пакетного сервиса. В данном примере при неожиданном сбое выполнение останавливается, чтобы не сообщить об успехе неполной партии.
Здесь каждый вход — отдельное задание. Для настоящей анимации нужны задержки и порядок кадров, а не случайное накопление изображений между товарами.
Связанные шаги: имена и путь записи, кодирование JPEG/PNG, окружение и рабочий объект, качество, метаданные и глубина файла.
Из реальной задачи разработчика
clear and destroy new clone from imagemagick object, how?. Автор создаёт clone изображения и спрашивает, достаточно ли очистить только исходный объект. В двух программах отдельно сохраняется clone, затем очищается или сбрасывается worker и читается новый вход. Копия продолжает хранить свой растр. Пакетный сценарий использует finally для очистки кадров после задания и destroy для сброса native Wand; ни одна из операций не объявляется удалением всех независимых PHP-объектов.
Функции и методы этой темы
Откройте карточку, чтобы увидеть договор функции, примеры, ограничения и связанные инструменты.
Gmagick::clearУдалить изображения перед следующим заданием
PECL gmagick >= Unknown · gmagick
Gmagick::clear(): GmagickОфициально очищает ресурсы, связанные с Gmagick, и возвращает очищенный Gmagick. Аргументов нет. Текущий C проходит по изображениям через MagickRemoveImage; сам Wand и часть его настроек могут сохраниться. В программе возвращённый объект идентичен $worker, после очистки сразу readImage загружает новый вход. Промежуточные getter пустого Wand не вызываем: в этой сборке даже getNumberImages с возвратом 0 оставляет native-ошибку, нарушающую последующее чтение. Пиксели и настройки проверяем после загрузки. Независимый clone не очищается вместе с оригиналом. Для полного сброса Wand в этой версии есть destroy; для каждого задания всё равно задавайте явный рецепт экспорта.
Gmagick::clear(): GmagickПараметров нет: вызов записывается с пустыми скобками.
Официальная ошибка — GmagickException. Дополнительно PHP проверяет типы аргументов; прикладные ограничения пути и пресета в наших функциях дают InvalidArgumentException до вызова библиотеки. Не смешивайте эти уровни проверки.
Два самостоятельных применения: Очистить кадры и обработать следующий вход; Обработать два задания с явной границей состояния.
Отметка PHP.net: PECL gmagick >= Unknown. Unknown не сообщает известную минимальную версию. Наблюдения относятся к PHP 8.3.6/Gmagick 2.0.6RC1/GraphicsMagick 1.3.42 Q16; поведение экспортного кодера подтверждается реальными файлами.
Gmagick::destroyСбросить native Wand, сохранив PHP-объект
PECL gmagick >= Unknown · gmagick
Gmagick::destroy(): boolОфициальный текст говорит об уничтожении объекта и освобождении связанных ресурсов. Аргументов нет, результат bool: при успехе true. В текущем C отдельно существует возврат false для отсутствующего native Wand; это не обещание, что любая ошибка вернёт false. Официально также заявлен GmagickException. В текущем C уничтожается старый native Wand и сразу создаётся новый. Поэтому PHP-объект остаётся доступен и в программе снова читает изображение; старые настройки сброшены. Это не unset переменной PHP и не уничтожение других clone. Полная программа проверяет новое чтение, сброс настроек и сохранность независимой копии.
Gmagick::destroy(): boolПараметров нет: вызов записывается с пустыми скобками.
Официальная ошибка — GmagickException. Дополнительно PHP проверяет типы аргументов; прикладные ограничения пути и пресета в наших функциях дают InvalidArgumentException до вызова библиотеки. Не смешивайте эти уровни проверки.
Два самостоятельных применения: Сбросить native Wand и снова использовать PHP-объект; Обработать два задания с явной границей состояния.
Отметка PHP.net: PECL gmagick >= Unknown. Unknown не сообщает известную минимальную версию. Наблюдения относятся к PHP 8.3.6/Gmagick 2.0.6RC1/GraphicsMagick 1.3.42 Q16; поведение экспортного кодера подтверждается реальными файлами.
Gmagick::getcopyrightСохранить уведомление о правах библиотеки
PECL gmagick >= Unknown · gmagick
Gmagick::getcopyright(): stringБез аргументов возвращает string с уведомлением о copyright GraphicsMagick и MagickWand C API. Строка может содержать переносы и ссылку на дополнительные лицензии. Это сведения о библиотеке, а не подтверждение прав на входную фотографию или созданную пользователем иллюстрацию. Примеры сохраняют её в JSON-отчёт окружения; при выводе в HTML такую строку нужно экранировать как данные.
Gmagick::getcopyright(): stringПараметров нет: вызов записывается с пустыми скобками.
Официальная ошибка — GmagickException. Дополнительно PHP проверяет типы аргументов; прикладные ограничения пути и пресета в наших функциях дают InvalidArgumentException до вызова библиотеки. Не смешивайте эти уровни проверки.
Два самостоятельных применения: Сохранить отчёт окружения вместе с превью; Обработать два задания с явной границей состояния.
Отметка PHP.net: PECL gmagick >= Unknown. Unknown не сообщает известную минимальную версию. Наблюдения относятся к PHP 8.3.6/Gmagick 2.0.6RC1/GraphicsMagick 1.3.42 Q16; поведение экспортного кодера подтверждается реальными файлами.
Gmagick::getpackagenameЗаписать имя пакета в отчёт сервиса
PECL gmagick >= Unknown · gmagick
Gmagick::getpackagename(): stringБез аргументов возвращает string с именем пакета GraphicsMagick; в нашей сборке это"GraphicsMagick". Имя помогает понять, какой движок сформировал превью, но не заменяет getVersion и не является именем текущего файла. В одиночном задании оно попадает в квитанцию результата, в пакетной обработке — в общий раздел library один раз на worker.
Gmagick::getpackagename(): stringПараметров нет: вызов записывается с пустыми скобками.
Официальная ошибка — GmagickException. Дополнительно PHP проверяет типы аргументов; прикладные ограничения пути и пресета в наших функциях дают InvalidArgumentException до вызова библиотеки. Не смешивайте эти уровни проверки.
Два самостоятельных применения: Сохранить отчёт окружения вместе с превью; Обработать два задания с явной границей состояния.
Отметка PHP.net: PECL gmagick >= Unknown. Unknown не сообщает известную минимальную версию. Наблюдения относятся к PHP 8.3.6/Gmagick 2.0.6RC1/GraphicsMagick 1.3.42 Q16; поведение экспортного кодера подтверждается реальными файлами.
Gmagick::getquantumdepthУзнать внутреннюю разрядность квантов
PECL gmagick >= Unknown · gmagick
Gmagick::getquantumdepth(): arrayНе принимает аргументов. Сигнатура array и реальный результат содержат quantumDepthLong и quantumDepthString; слова «as a string» в старом описании не отражают форму всего возвращаемого значения. Здесь получены 16 и"Q16". Это характеристика сборки и внутренних квантов, не утверждение, что каждый выходной PNG имеет 16 бит или что JPEG перестал быть 8-битным. В нашем рецепте выход явно задаётся PNG/JPEG8, а Q16 записывается в отчёт окружения. Доступность нужного кодера проверяется отдельно.
Gmagick::getquantumdepth(): arrayПараметров нет: вызов записывается с пустыми скобками.
Официальная ошибка — GmagickException. Дополнительно PHP проверяет типы аргументов; прикладные ограничения пути и пресета в наших функциях дают InvalidArgumentException до вызова библиотеки. Не смешивайте эти уровни проверки.
Два самостоятельных применения: Сохранить отчёт окружения вместе с превью; Проверить условия экспорта до обработки задания.
Отметка PHP.net: PECL gmagick >= Unknown. Unknown не сообщает известную минимальную версию. Наблюдения относятся к PHP 8.3.6/Gmagick 2.0.6RC1/GraphicsMagick 1.3.42 Q16; поведение экспортного кодера подтверждается реальными файлами.
Gmagick::getreleasedateЗафиксировать дату выпуска используемой библиотеки
PECL gmagick >= Unknown · gmagick
Gmagick::getreleasedate(): stringБез аргументов возвращает string с датой выпуска GraphicsMagick. В нашем runtime получено"2023-09-23"; это дата используемой версии, а не текущая дата сервера, дата установки расширения или свежесть последнего доступного релиза. Для воспроизводимого отчёта храните её рядом с именем пакета и getVersion. Дата не доказывает наличие конкретного исправления без сопоставления версии и поведения.
Gmagick::getreleasedate(): stringПараметров нет: вызов записывается с пустыми скобками.
Официальная ошибка — GmagickException. Дополнительно PHP проверяет типы аргументов; прикладные ограничения пути и пресета в наших функциях дают InvalidArgumentException до вызова библиотеки. Не смешивайте эти уровни проверки.
Два самостоятельных применения: Сохранить отчёт окружения вместе с превью; Обработать два задания с явной границей состояния.
Отметка PHP.net: PECL gmagick >= Unknown. Unknown не сообщает известную минимальную версию. Наблюдения относятся к PHP 8.3.6/Gmagick 2.0.6RC1/GraphicsMagick 1.3.42 Q16; поведение экспортного кодера подтверждается реальными файлами.
Gmagick::getversionЗафиксировать версию GraphicsMagick API
PECL gmagick >= Unknown · gmagick
Gmagick::getversion(): arrayБез аргументов возвращает array с числовым versionNumber и строковым versionString. Это версия GraphicsMagick API; PHP_VERSION и phpversion("gmagick") отвечают за другие уровни окружения. В проверенной сборке наблюдались versionNumber 2565124 и строка GraphicsMagick 1.3.42 с датой иQ16. Сохраняйте оба поля для диагностики, не угадывайте десятичную структуру числа. В текущей Reflection метод static, поэтому допустима привычная форма Gmagick::getVersion; другие getter окружения в примерах вызываются через объект.
Gmagick::getversion(): arrayПараметров нет: вызов записывается с пустыми скобками.
Официальная ошибка — GmagickException. Дополнительно PHP проверяет типы аргументов; прикладные ограничения пути и пресета в наших функциях дают InvalidArgumentException до вызова библиотеки. Не смешивайте эти уровни проверки.
Два самостоятельных применения: Сохранить отчёт окружения вместе с превью; Проверить условия экспорта до обработки задания.
Отметка PHP.net: PECL gmagick >= Unknown. Unknown не сообщает известную минимальную версию. Наблюдения относятся к PHP 8.3.6/Gmagick 2.0.6RC1/GraphicsMagick 1.3.42 Q16; поведение экспортного кодера подтверждается реальными файлами.
Gmagick::queryformatsПроверить список кодеров и выбрать разрешённый формат
PECL gmagick >= Unknown · gmagick
Gmagick::queryformats(string $pattern = "*"): arrayНеобязательная строка pattern по умолчанию равна"*". Сигнатура обещает array; раздел результата PHP.net ошибочно называет Gmagick object. Фактически возвращается массив имён форматов. В нашей сборке PNG*, J* и заведомо отсутствующий шаблон вернули одинаковый полный список, поэтому пример явно фильтрует его в PHP. Имя в списке не доказывает возможности всех операций с конкретным входом, наличие внешнего делегата или права записи. Для сервиса выбирайте небольшой белый список и подтверждайте нужный путь реальным чтением/экспортом.
Gmagick::queryformats(string $pattern = "*"): array| Параметр | Тип и обязательность | Назначение |
|---|---|---|
| $pattern | string; необязательный; default "*" | Строковый шаблон, по умолчанию"*"; в проверенной сборке фильтрация не сработала. |
Официальная ошибка — GmagickException. Дополнительно PHP проверяет типы аргументов; прикладные ограничения пути и пресета в наших функциях дают InvalidArgumentException до вызова библиотеки. Не смешивайте эти уровни проверки.
Два самостоятельных применения: Выбрать известный кодер и проверить реальную запись; Проверить условия экспорта до обработки задания.
Отметка PHP.net: PECL gmagick >= Unknown. Unknown не сообщает известную минимальную версию. Наблюдения относятся к PHP 8.3.6/Gmagick 2.0.6RC1/GraphicsMagick 1.3.42 Q16; поведение экспортного кодера подтверждается реальными файлами.
Источники и обсуждения
Код и руководство с собой
Скачайте самостоятельные примеры с исходными данными, инструкциями и ожидаемыми результатами. Примеры HTTP и фрагменты для проекта помечены отдельно: им нужно указанное окружение.
Код не исполняется на сайте. Скачайте нужный пример и запускайте его в своём локальном окружении.
Материалы сверены 2026-10-12. Примеры и объяснения написаны для этого руководства; источники и обсуждения доступны в каждой главе.


