画像をflock()しようとしています。
現在、私は以下を使用しています
$img = ImageCreateFromPng($img_path);
flock($img,LOCK_EX);
GDライブラリのファイルハンドルがflockでは無効なようです。画像にアクセスしてファイルを群がらせるにはどうすればよいですか?
例の $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
画像の変更されたバージョンをオープン ストリームに保存する場合は、出力バッファリングを使用する必要があります。
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
は、ファイル ハンドル (またはロックをサポートしている場合はストリーム ラッパー) でのみ機能します。したがって、読み取り時に画像をロックしたい場合は、画像を 2 回開く必要があります。
$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);
flock
ファイル ポインタImageCreateFromPng
のみで動作し、ファイル名のみで動作します。2 つの異なる呼び出しを行ってみてください。
$fp = fopen($img_path, 'r');
flock($fp, LOCK_EX);
$img = ImageCreateFromPng($img_path);
flock
は協調的であるため、全員が使用する場合にのみ機能します。ImageCreateFromPng
を使用しない限りflock
、上記のコードは機能するはずです。