2016-03-23 3 views
1

Ist es möglich, die Datei img.jpg zu sperren, bis Imagick es erstellt?Datei sperren während Imagick writeImage() Ausführen

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

Können Sie sagen, warum Sie dies tun möchten. Ich könnte mir vorstellen, warum, aber die Beantwortung Ihrer Frage wäre einfacher, wenn der Anwendungsfall klarer wäre. – Danack

+0

@Danack, wenn Benutzer versucht, diese Datei zu erhalten, während es bereits existiert, aber nicht vollständig erstellt wurde, Benutzer erhält defekte Datei –

+0

Haben Sie gesehen, dass dies tatsächlich geschehen? ImageMagick sollte atomare Dateioperationen verwenden ... – Danack

Antwort

0

Ich bin mir nicht ganz sicher, dass das Problem, das Sie beschreiben, tatsächlich als ein Problem existiert. Kein anderer hat es je gemeldet.

Allerdings, auch wenn es ein Problem ist, wollen Sie hier keine Dateisperrung verwenden .... das ist für die Lösung einer separaten Reihe von Problemen.

Stattdessen, was Sie verwenden möchten, sind atomare Operationen, die "sofort" vom Computer ausgeführt werden.

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

Es gibt keine Verriegelung dort .... aber es ist nicht möglich, für jedes Verfahren, um die Daten von img.jpg zu lesen, während es geschrieben wird. Wenn es während des Umbenennens noch andere Prozesse gibt, die img.jpg haben, wird ihr Datei-Handle zur alten Version der Datei weiter bestehen und sie werden weiterhin die alte Datei lesen, bis sie geschlossen und wieder geöffnet werden.

Verwandte Themen