У меня есть ресурсный объект (изображение), который был создан из imagecreatetruecolor после большого количества процесса.
$image = imagecreatetruecolor($dst_width, $dst_height);
Последний шаг — добавление тегов iptc к изображению.
Для добавления тегов iptc в php есть встроенная функция, которая называется iptcembed.
iptcembed ( string $iptcdata , string $jpeg_file_name [, int $spool ] );
Проблема в том, что я храню изображение в качестве объекта ресурса. Но iptcembed нужно изображение в виде строки пути к файлу $ jpeg_file_name.
Для каждого изображения я должен сохранить изображение и загрузить его из iptcembed для тегов iptc.
Это большая проблема с производительностью. Также грязные коды.
Я предполагаю, что php-обертки могут быть решением этой проблемы, но я узнал, что они не являются путями. Это только ссылки. Следующий код не работает для меня.
$data = null;
ob_start();
imagejpeg($this->image['src_image'], null, $compression);
$data = ob_get_contents();
ob_end_clean();
$img = fopen("php://temp", 'wb+');
fwrite($img, $data);
fclose($img);
$content = iptcembed('', "php://temp");
Вопрос: есть ли какой-нибудь трюк, который я могу достучаться до этого пути из памяти / лучшего способа сделать это?
та же проблема здесь 🙂
У меня есть высокое разрешение «мастер» JPEG потоков изображений, хранящихся в базе данных. я должен обслуживать запросы на загрузку со случайными параметрами изменения размера, обрезки и сжатия. последний шаг — добавление метаданных к созданному временному изображению.
Я использую PHP 5.6 (Windows 7) и 7.2 (Ubuntu 18). мое самое быстрое решение на данный момент — это небольшой выделенный виртуальный диск. в Ubuntu я просто создал и смонтировал файловую систему tmpfs:
$ sudo bash
# mkdir -p /media/ramdisk
# chmod 1777 /media/ramdisk
# mount -t tmpfs -o size=256M tmpfs /media/ramdisk
# grep /media/ramdisk /etc/mtab | tee -a /etc/fstab
tmpfs /media/ramdisk tmpfs rw,relatime,size=262144k 0 0
# ^D
$ df -m /media/ramdisk
Filesystem 1M-blocks Used Available Use% Mounted on
tmpfs 256 0 256 0% /media/ramdisk
$
в Windows я установил бесплатное приложение RAM Disk от SoftPerfect (доступно здесь: https://www.softperfect.com/products/ramdisk/).
C:\>dir k:
Volume in drive K is Ram Disk
Volume Serial Number is 5566-7788
Directory of K:\
2018-11-14 19:18 <DIR> cache
2018-11-14 19:18 <DIR> temp
0 File(s) 0 bytes
2 Dir(s) 117 518 336 bytes free
Недавно я выполнил небольшой тест (на моем ПК с Windows) с образцом в формате JPEG. размер изображения составил 1,83 МБ, а разрешение — 1520×1200 пикселей; я записал это и прочитал его обратно 1000 раз на / с моего жесткого диска и моего RAM-диска.
в неактивной системе (не то, чтобы кто-то мог сказать, простаивают его окна или нет :)), я измерил время отклика около 8 секунд (7,3 — 9,1 с) для каждого типа хранилища.
Затем я начал копировать некоторые файлы на мои жесткие диски. Оперативный диск вел себя так же, как и раньше, но, что неудивительно, отклик жестких дисков начал колебаться от 8 до 40 секунд.
Итак, я придумал следующий фрагмент псевдокода:
$raw = ...; // obtain untagged jpeg stream //
$temp = '/path/to/file/on/ram/disk';
file_put_contents($temp, $raw);
$meta = ...; // set the metadata as needed //
$raw = iptcembed($meta, $temp); // reload tagged image stream //
unlink($temp); // don't forget to clean up //
что, конечно, почти так же, как у вас.
Других решений пока нет …