String filepath memory альтернатива (альтернативный путь filepath)

У меня есть ресурсный объект (изображение), который был создан из 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");

Вопрос: есть ли какой-нибудь трюк, который я могу достучаться до этого пути из памяти / лучшего способа сделать это?

1

Решение

та же проблема здесь 🙂

У меня есть высокое разрешение «мастер» 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 //

что, конечно, почти так же, как у вас.

0

Другие решения

Других решений пока нет …