是否有可能锁定文件img.jpg直到Imagick创建它?
$image->writeImage('img.jpg')
答案 0 :(得分:0)
我不完全确定你所描述的问题实际存在是一个问题。没有其他人报告过它。
然而,即使这是一个问题,你也不想在这里使用文件锁定....这是为了解决一组单独的问题。
相反,你想要使用的是原子操作,这是由计算机“即时”完成的。
$created = false;
for ($i=0; $i<5 && $created == false; $i++) {
// Create a temp name
$tmpName = "temp".rand(10000000, 99999999).".jpg";
// Open it. The x+ means 'do not create if file already exists'.
$fileHandle = @fopen($tmpName, 'x+');
if ($fileHandle === false) {
// The file with $tmpName already exists, or we otherwise failed
// to create the file, loop again.
continue;
}
// We don't actually want the file-handle, we just wanted to make sure
// we had a uniquely named file ending with .jpg so just close it again.
// You could also use tempnam() if you don't care about the file extension.
fclose($fileHandle);
// Writes the image data to the temp file name.
$image->writeImage($tmpName);
rename($tmpName, 'img.jpg');
$created = true;
}
if ($created === false) {
throw new FailedToGenerateImageException("blah blah");
}
那里没有锁定....但是在写入时,任何进程都无法从img.jpg读取数据。如果在重命名时有任何其他进程具有img.jpg,则它们对旧版本文件的文件句柄将继续存在,并且它们将继续读取旧文件,直到它们关闭并再次打开它。