我正在尋找flock()圖像。如何羣集()圖像?
目前我使用以下
$img = ImageCreateFromPng($img_path);
flock($img,LOCK_EX);
看來,GD庫的文件句柄不與羊羣有效。我怎樣才能訪問圖像和文件?
我正在尋找flock()圖像。如何羣集()圖像?
目前我使用以下
$img = ImageCreateFromPng($img_path);
flock($img,LOCK_EX);
看來,GD庫的文件句柄不與羊羣有效。我怎樣才能訪問圖像和文件?
函數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);
flock
只適用於文件指針和ImageCreateFromPng
只與文件名的作品。嘗試使兩個不同的調用:
$fp = fopen($img_path, 'r');
flock($fp, LOCK_EX);
$img = ImageCreateFromPng($img_path);
flock
是合作的,所以如果每個人都使用它,它纔會起作用。只要ImageCreateFromPng
不使用flock
,上面的代碼應該可以工作。
嗯,如果圖像是flock的,那麼我會從imagecreatefrompng中得到一個錯誤 - 說它不是一個有效的png。爲了在我調用imagecreatefrompng之前測試它,我調用了flock($ fp,LOCK_UN)並且代碼再次運行。 – Pablo 2010-06-15 13:11:12
這太糟糕了。也許嘗試鎖定文件並將其複製到臨時文件。然後,在主文件被鎖定時在臨時文件上操作。 – 2010-06-15 13:18:50
謝謝,ircmaxell向我保證它可以在linux上工作......所以我會使用這種方法。 – Pablo 2010-06-15 14:06:06
在你的例子中$ 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);
嗯,如果圖像是flock'd然後我從imagecreatefrompng得到一個錯誤 - 說它不是一個有效的PNG。爲了在我調用imagecreatefrompng之前測試它,我調用了flock($ f,LOCK_UN),代碼再次運行。 – Pablo 2010-06-15 13:10:40
什麼版本的PHP和什麼操作系統?它適用於Linux上的5.3.2 ... – ircmaxell 2010-06-15 13:22:33
我現在在Windows上使用它。但這只是爲了測試......它將在Linux服務器上運行。 – Pablo 2010-06-15 13:48:08