在执行

时间:2016-03-23 15:09:35

标签: php imagick

是否有可能锁定文件img.jpg直到Imagick创建它?

$image->writeImage('img.jpg')

1 个答案:

答案 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,则它们对旧版本文件的文件句柄将继续存在,并且它们将继续读取旧文件,直到它们关闭并再次打开它。