如何flock()图像?

时间:2010-06-15 12:47:59

标签: php flock

我希望flock()一张图片。

目前我正在使用以下

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

似乎GD库的文件句柄对flock无效。如何访问图像并植入文件?

3 个答案:

答案 0 :(得分:1)

函数flock仅适用于文件句柄(如果它们支持锁定,则为stream wrappers)。因此,如果您想在阅读时锁定图像,则需要打开两次图像:

$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);

答案 1 :(得分:1)

你的例子中的 $ img不是文件句柄,它是内存中GD图像资源的句柄。

您可以使用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

如果您想将图片的修改版本保存到开放流,则必须使用output buffering

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);

答案 2 :(得分:0)

flock仅适用于文件指针,ImageCreateFromPng仅适用于文件名。尝试拨打两个不同的电话:

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

flock是合作的,所以只有每个人都使用它才有效。只要ImageCreateFromPng不使用flock,上述代码就可以使用。