2012-03-13 8 views
0

같은 간단한 코드를 감안할 때 :PHP 올바른 명령 실행을 보장하는 방법을 순서

$file = 'hugefile.jpg'; 
$bckp_file = 'hugeimage-backup.jpg'; 
// here comes some manipulation on $bckp_file. 

가정 된 문제는 파일이 크거나 큰 경우이다 - let's은 JPG 말 - 하나는 있다고 생각 서버를 복사하는 데 시간이 걸릴 것입니다. (몇 밀리 초를 의미하는 시간에) - 다음 줄의 실행이 훨씬 빠르다고 가정합니다. 그래서 이론상 - "아니오"로 끝낼 수 있습니다. 그러한 파일 또는 디렉토리 "오류가 발생했습니다. - 또는 악화 - TRUNCATED 파일을 조작하기 시작합니다.

내 질문에 어떻게 $ bckp_file이 생성되었거나 (이 경우 -copied) 성공적으로 NEXT 행을 조작하기 전에 확신 할 수 있는가?

파일 만들기/복사가 완료 될 때까지 "일시 중지", "지연"할 수있는 옵션은 무엇입니까? 지금 난 단지 나만을 경고하지만

또는

if (copy($file, $bckp_file)) { 
    // move the manipulation to here .. 
} 

(PHP는 오류가있는 같이 동일) 아무것도 해결되지 것이다

if (!copy($file, $bckp_file)) { 
    echo "failed to copy $file...\n"; 
} 

같은 것을 생각할 수

그러나 이것은 또한 그렇게 유효하지 않습니다 - 왜냐하면 사본이 실행되지 않았다고 말하기 때문에 - 저는 목표를 달성하지 않고 오류없이 루프에서 벗어날 것입니다.

문제가 있거나 너무 과장되어 있습니까? 또는 PHP는 bulit-in 메커니즘을 가지고 있습니다. 권장 관행은 무엇입니까? 문제에 대한 의견이 있으십니까? ??

답변

2

"일시 정지"내 옵션은 무엇입니까 "지연"파일까지 다음 라인 실행이 생성/복사

사본() 계속하지 않을 것이다 코드를 의미 동기 기능입니다 완료되었다 copy()를 호출 한 후 copy()가 완전히 완료되거나 실패 할 때까지.

즉, 관련된 마법은 없습니다.

if (copy(...)) { echo 'success!'; } else { echo 'failure!'; } 

동기 IO와 함께 비동기 IO도 있습니다. 기술적 인면에서 자세히 설명하는 것은 다소 복잡합니다. 그러나 일반적인 생각은 백그라운드에서 실행되고 코드가 코드에 연결된다는 것입니다. 그런 다음 중요한 이벤트가 발생할 때마다 백그라운드 실행이 코드를 경고합니다. 예를 들어, 파일을 비동기 복사하려는 경우, 진행이 이루어질 때 통지 될 복사에 리스너를 등록합니다. 이렇게하면 코드가 다른 일을 할 수 있지만 파일에서 어떤 진행 상황이 발생했는지 알 수 있습니다.

+0

답해 주셔서 감사합니다. 질문의 범위를 벗어나는 것은 없습니다. 더 많은 것을 배우고 더 많은 것을 이해하려고하기 때문에 :-).질문에 언급 된 다른 한 가지 문제, 즉 TRUNCATED 파일의 경우는 무엇입니까? php-synchronous-mechanisem도 무결성을 검사합니까? 다시 이론적으로 - .jpg 파일을 만들고 저장/복사 할 수 있지만 허위 정보가 포함되어 있습니다. (우리 모두는 그물에서 반투명 jpg를 보았습니다.) –

+0

비동기 IO에 관한 약간의 정보를 포함하도록 내 대답이 업데이트되었습니다 :) – Corbin

1

PHP는 스크립트를 실행하기 전에 전체 파일을 서버의 임시 디렉토리에 저장하여 파일 업로드를 처리하므로 (처음부터 $ _FILES를 사용할 수 있음) 모든 기능이 동기식이라고 가정하는 것이 안전합니다. , PHP는 다음 라인으로 이동하기 전에 각 라인이 실행되기를 기다린다.

+0

하지만 "실행"은 항상 "성공적으로 실행"과 동의어가 아닙니다 - PHP가 모든 상황에서이를 처리한다고 가정 할 수있는 경우가 아니면 ... –

+0

잘못된 것일 수 있지만 복사 할 수는 없습니다)는 복사하는 동안 파일의 임시 사본을 작성합니다. 아마도 질문자가 업로드 된 파일에 대해 이야기하고 있다고 가정하고 있습니까? 그렇다면 move_uploaded_file이 아마도 대신 사용되어야하며, 나는 그것이 그녀가 말하는 것에 대해 믿지 않습니다. – Corbin

+0

예 파일 업로드 및 move_uploaded_file과 관련 있다고 가정했으나'copy()'함수에도 적용됩니다 (http://au.php.net/manual/en/function.copy.php 참조).). 두 함수는 모두 복사 작업이 완료 될 때까지 반환 할 수없는 복사 작업의 상태를 반환합니다 (성공 또는 실패). 따라서 동기식입니다. –