Как собрать() изображение?
Я ищу flock() образ.
В настоящее время я использую следующие
$img = ImageCreateFromPng($img_path);
flock($img,LOCK_EX);
Похоже, что дескриптор файла библиотеки GD недопустим для flock. Как я могу получить доступ к изображению и собрать файл?
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
, приведенный выше код должен работать.