Как собрать() изображение?


Я ищу flock() образ.

В настоящее время я использую следующие

$img = ImageCreateFromPng($img_path);
flock($img,LOCK_EX);

Похоже, что дескриптор файла библиотеки GD недопустим для flock. Как я могу получить доступ к изображению и собрать файл?

3 3

3 ответа:

Функция flock работает только с дескрипторами файлов (илиобертками потоков , если они поддерживают блокировку). Итак, если вы хотите заблокировать изображение, когда вы его читаете, вам нужно будет открыть его дважды:

$f = fopen($imgPath, 'r');
if (!$f) {
    //Handle error (file does not exist perhaps, or no permissions?)
}
if (flock($f, LOCK_EX)) {
    $img = imagecreatefrompng($imgPath);
    //...  Do your stuff here

    flock($f, LOCK_UN);
}
fclose($f);

$img в вашем примере-это не дескриптор файла, а дескриптор ресурса GD image в памяти.

Вы можете использовать imagecreatefromstring для загрузки изображения следующим образом:

$file=fopen($fileName,"r+b");
flock($file,LOCK_EX);
$imageBinary=stream_get_contents($file);
$img=imagecreatefromstring($imageBinary);
unset($imageBinary); // we don't need this anymore - it saves a lot of memory

Если вы хотите сохранить измененную версию изображения в открытый поток, вы должны использовать выходную буферизацию :

ob_start();
imagepng($img);
$imageBinary=ob_get_clean();

ftruncate($file,0);
fseek($file,0);
fwrite($file,$imageBinary);
unset($imageBinary);
flock($file,LOCK_UN);
fclose($file);

flock работает только с указателями файлов и ImageCreateFromPng работает только с именами файлов. Попробуйте сделать два разных звонка:

$fp = fopen($img_path, 'r');
flock($fp, LOCK_EX);
$img = ImageCreateFromPng($img_path);

flock является кооперативным, поэтому он работает только в том случае, если все его используют. Пока ImageCreateFromPng не использует flock, приведенный выше код должен работать.