2010-06-15 45 views
3

我正在尋找flock()圖像。如何羣集()圖像?

目前我使用以下

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

看來,GD庫的文件句柄不與羊羣有效。我怎樣才能訪問圖像和文件?

回答

1

函數flock僅適用於文件句柄(或stream wrappers如果它們支持鎖定)。所以,如果你想鎖定在讀取時的圖像,你需要打開它兩次:

$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); 
+0

嗯,如果圖像是flock'd然後我從imagecreatefrompng得到一個錯誤 - 說它不是一個有效的PNG。爲了在我調用imagecreatefrompng之前測試它,我調用了flock($ f,LOCK_UN),代碼再次運行。 – Pablo 2010-06-15 13:10:40

+0

什麼版本的PHP和什麼操作系統?它適用於Linux上的5.3.2 ... – ircmaxell 2010-06-15 13:22:33

+0

我現在在Windows上使用它。但這只是爲了測試......它將在Linux服務器上運行。 – Pablo 2010-06-15 13:48:08

0

flock只適用於文件指針和ImageCreateFromPng只與文件名的作品。嘗試使兩個不同的調用:

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

flock是合作的,所以如果每個人都使用它,它纔會起作用。只要ImageCreateFromPng不使用flock,上面的代碼應該可以工作。

+0

嗯,如果圖像是flock的,那麼我會從imagecreatefrompng中得到一個錯誤 - 說它不是一個有效的png。爲了在我調用imagecreatefrompng之前測試它,我調用了flock($ fp,LOCK_UN)並且代碼再次運行。 – Pablo 2010-06-15 13:11:12

+0

這太糟糕了。也許嘗試鎖定文件並將其複製到臨時文件。然後,在主文件被鎖定時在臨時文件上操作。 – 2010-06-15 13:18:50

+0

謝謝,ircmaxell向我保證它可以在linux上工作......所以我會使用這種方法。 – Pablo 2010-06-15 14:06:06

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 

如果你想在圖像的修改版本保存到你必須使用output buffering打開流:

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); 
+0

這看起來像一個很好的解決方案,以解決imagecreatefrompng無法在植絨文件上工作的問題。 – 2010-06-15 13:19:41

+0

我得到一個ftruncate缺少的參數的錯誤...我看起來似乎是你想截斷文件的大小 – Pablo 2010-06-15 13:26:17

+0

對不起,ftruncate固定 – Wikeno 2010-06-15 13:28:39