3

画像をflock()しようとしています。

現在、私は以下を使用しています

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

GDライブラリのファイルハンドルがflockでは無効なようです。画像にアクセスしてファイルを群がらせるにはどうすればよいですか?

4

3 に答える 3

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

画像の変更されたバージョンをオープン ストリームに保存する場合は、出力バッファリングを使用する必要があります。

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);
于 2010-06-15T13:05:11.397 に答える
1

この関数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);
于 2010-06-15T12:54:38.280 に答える
0

flockファイル ポインタImageCreateFromPngのみで動作し、ファイル名のみで動作します。2 つの異なる呼び出しを行ってみてください。

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

flockは協調的であるため、全員が使用する場合にのみ機能します。ImageCreateFromPngを使用しない限りflock、上記のコードは機能するはずです。

于 2010-06-15T12:55:28.570 に答える