Перейти к содержимому
Поиск
Php Разработка

PHP: полный мануал с примерами, функциями и ООП

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

Александр НекрасовИзменено:
Практический мануал PHP: от переменных и функций к объектной модели интернет-магазина
PHP 8.5.11468 глав6256 карточек справочника
Дерево руководства

Глава 431 · После первых изображений, файлов и объектов

Gmagick: проверка окружения и обработка заданий превью

Выбрать кодер, записать воспроизводимый отчёт и переиспользовать PHP-объект с понятной очисткой native-состояния.

Выбрать известный кодер и проверить реальную запись

Сервис превью должен проверить, есть ли нужный кодер, и закончить проверку реальной записью. queryFormats возвращает имена форматов. В нашей сборке pattern PNG* не отфильтровал список, поэтому PHP явно выбирает имена с префиксомPNG, затем создаёт и заново открывает миниатюру.

Реальная миниатюра 160×100: кодер не только найден в списке, файл записан и прочитан
Реальная миниатюра 160×100: кодер не только найден в списке, файл записан и прочитан
$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. Эти сведения помогают воспроизвести обработку, а не добавляют эффект к изображению.

Настоящее превью товара и отдельный JSON с версиями, глубиной, датой выпуска библиотеки и её copyright-уведомлением
Настоящее превью товара и отдельный JSON с версиями, глубиной, датой выпуска библиотеки и её 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, откроем его и покажем декодированный результат. Так предварительная проверка связана с полезным действием, а не заканчивается списком имён.

Предварительная проверка завершена реальной JPEG-записью и декодированием; цветные детали видны
Предварительная проверка завершена реальной JPEG-записью и декодированием; цветные детали видны

Файлы именно этого выполненного примера: Скачать настоящий 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 первого входа остаётся живым.

Первый вход: цветная мишень сохранена отдельной копией
Первый вход: цветная мишень сохранена отдельной копией
Тот же PHP-объект после clear прочитал другой вход — схему товара
Тот же PHP-объект после clear прочитал другой вход — схему товара
$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.

Независимая копия первого задания остаётся пригодной для сохранения
Независимая копия первого задания остаётся пригодной для сохранения
После destroy новый native Wand в прежнем PHP-объекте прочитал product.ppm
После destroy новый native Wand в прежнем PHP-объекте прочитал product.ppm
$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 исходной мишени не уничтожается вместе с другим объектом.

Сбросить native Wand и снова использовать PHP-объектСамостоятельный пример
<?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
ПараметрТип и обязательностьНазначение
$patternstring; необязательный; 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. Примеры и объяснения написаны для этого руководства; источники и обсуждения доступны в каждой главе.