나는 flock() 이미지를 찾고 있습니다. 이미지를 집에 올리는 방법()?
현재 나는 GD 라이브러리의 파일 핸들이 무리와 함께 유효하지 않은 것으로 보인다 다음$img = ImageCreateFromPng($img_path);
flock($img,LOCK_EX);
을 사용하고 있습니다. 이미지에 액세스하여 파일을 모으려면 어떻게해야합니까?
나는 flock() 이미지를 찾고 있습니다. 이미지를 집에 올리는 방법()?
현재 나는 GD 라이브러리의 파일 핸들이 무리와 함께 유효하지 않은 것으로 보인다 다음$img = ImageCreateFromPng($img_path);
flock($img,LOCK_EX);
을 사용하고 있습니다. 이미지에 액세스하여 파일을 모으려면 어떻게해야합니까?
기능 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
을 사용하지 않으면 위의 코드가 작동합니다.
hmmm, 이미지가 flock 된 경우 imagecreatefrompng에서 오류가 발생합니다. 유효한 png가 아닙니다. imagecreatefrompng을 호출하기 직전에 테스트하기 위해 flock ($ fp, LOCK_UN)을 호출하고 코드가 다시 실행되었습니다. – Pablo
그건 나쁘지. 어쩌면 파일을 잠그고 임시 파일에 복사 해보십시오. 그런 다음 기본 파일이 잠긴 상태에서 임시 파일을 조작하십시오. –
감사합니다. ircmaxell은 Linux에서 작동 할 것이라고 확신합니다. 결국이 방법을 사용할 것입니다. – Pablo
예에서 $ img는 파일 핸들이 아니며 메모리의 GD 이미지 리소스에 대한 핸들입니다. 당신은 당신이 output buffering 사용할 필요가 열린 스트림에 이미지의 수정 된 버전을 저장하려면
$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
:
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);
을 흠
이 같은 이미지를로드 imagecreatefromstring을 사용할 수 있습니다 , 이미지가 flock'd면 나는 imagecreatefrompng에서 오류가 발생합니다 - 유효한 png가 아니라고 말합니다. imagecreatefrompng을 호출하기 직전에 테스트하기 위해 flock ($ f, LOCK_UN)을 호출하고 코드가 다시 실행되었습니다. – Pablo
어떤 버전의 PHP와 어떤 OS가 있습니까? Linux 용 5.3.2에서 잘 작동합니다 ... – ircmaxell
현재 Windows에서 사용 중입니다. 하지만 이것은 테스트 용으로 만 사용됩니다. Linux 서버에서 실행됩니다. – Pablo