현재 위치: > 최신 기사 목록> stream_copy_to_stream copy 컨텐츠가 불완전합니까? 일반적인 원인과 솔루션의 요약

stream_copy_to_stream copy 컨텐츠가 불완전합니까? 일반적인 원인과 솔루션의 요약

gitbox 2025-09-17

php에서 stream_copy_to_stream은 한 스트림의 내용을 다른 스트림으로 복사하는 데 사용할 수있는 매우 실용적인 기능입니다. 이 기능은 일반적으로 파일 작동, 데이터 전송 및 기타 시나리오에 사용됩니다. 그러나 개발자가 stream_copy_to_stream을 사용하는 경우 종종 불완전한 복사 컨텐츠가 발생하여 복사 된 파일 또는 데이터의 일부가 손상되거나 손실됩니다. 이 기사는 몇 가지 일반적인 원인과 이러한 문제를 해결하는 방법을 분석합니다.

1. Stream_copy_to_stream 의 기본 원리를 이해하십시오

stream_copy_to_stream 함수의 프로토 타입은 다음과 같습니다.

 <span><span><span class="hljs-keyword">int</span></span><span> </span><span><span class="hljs-title function_ invoke__">stream_copy_to_stream</span></span><span> ( resource </span><span><span class="hljs-variable">$source</span></span><span>, resource </span><span><span class="hljs-variable">$dest</span></span><span>, </span><span><span class="hljs-keyword">int</span></span><span> </span><span><span class="hljs-variable">$maxlength</span></span><span> = -</span><span><span class="hljs-number">1</span></span><span>, </span><span><span class="hljs-keyword">int</span></span><span> </span><span><span class="hljs-variable">$offset</span></span><span> = </span><span><span class="hljs-number">0</span></span><span> )
</span></span>
  • $ 출처 : 소스 스트림 리소스, 즉 콘텐츠를 복사 해야하는 스트림.

  • $ dest : 대상 스트림 리소스, 즉 컨텐츠가 복사 될 스트림.

  • $ maxlength : 복사 할 최대 바이트 수, 기본값은 -1이므로 제한이 없음을 나타냅니다.

  • $ 오프셋 : 소스 스트림에서 복사 된 오프셋, 기본값은 0입니다.

이 함수는 데이터가 종료되거나 최대 바이트 수에 도달 할 때까지 소스 스트림에서 대상 스트림으로의 데이터를 복사합니다. 무언가 잘못되면 복사 된 내용이 불완전 할 수 있습니다.

2. 일반적인 원인과 솔루션

1. 대상 흐름 자원을 작성할 수 없습니다

대상 스트림 리소스 ($ dest)를 쓸 수 없거나 열지 않은 경우 stream_copy_to_stream이 실행되지 않습니다. 이 경우 복사 된 컨텐츠는 자연스럽게 완료되지 않습니다.

솔루션 : 대상 흐름 자원이 쓰기 모드에서 열렸는지 확인하십시오. 예를 들어, 파일을 작성할 때 Fopen을 사용하여 'w' 또는 'a' 모드에서 파일 스트림을 열 수 있습니다.

 <span><span><span class="hljs-variable">$source</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fopen</span></span><span>(</span><span><span class="hljs-string">'source.txt'</span></span><span>, </span><span><span class="hljs-string">'r'</span></span><span>);
</span><span><span class="hljs-variable">$dest</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fopen</span></span><span>(</span><span><span class="hljs-string">'dest.txt'</span></span><span>, </span><span><span class="hljs-string">'w'</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">stream_copy_to_stream</span></span><span>(</span><span><span class="hljs-variable">$source</span></span><span>, </span><span><span class="hljs-variable">$dest</span></span><span>);
</span></span>

2. 소스 스트림 리소스는 올바르게 읽지 않습니다

소스 스트림 리소스 ($ source)를 올바르게 읽지 않으면 stream_copy_to_stream 도 불완전한 복사를합니다. 특히 더 큰 파일 또는 데이터 스트림의 경우 소스 스트림을 읽는 동안 오류가 발생하면 복제가 중단 될 수 있습니다.

솔루션 : 소스 스트림이 성공적으로 열리고 읽는지 확인하십시오. feof ()를 사용하여 파일이 끝까지 읽었는지 확인하거나 파일 읽기 함수가 False를 반환하는지 확인할 수 있습니다.

 <span><span><span class="hljs-variable">$source</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fopen</span></span><span>(</span><span><span class="hljs-string">'source.txt'</span></span><span>, </span><span><span class="hljs-string">'r'</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (!</span><span><span class="hljs-variable">$source</span></span><span>) {
    </span><span><span class="hljs-keyword">die</span></span><span>(</span><span><span class="hljs-string">'Failed to open source file'</span></span><span>);
}

</span><span><span class="hljs-variable">$dest</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fopen</span></span><span>(</span><span><span class="hljs-string">'dest.txt'</span></span><span>, </span><span><span class="hljs-string">'w'</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">stream_copy_to_stream</span></span><span>(</span><span><span class="hljs-variable">$source</span></span><span>, </span><span><span class="hljs-variable">$dest</span></span><span>);
</span></span>

3. 최대 바이트 한계 수

stream_copy_to_stream은 복사 할 최대 바이트 수를 제한하기 위해 MaxLength 매개 변수 설정을 지원합니다. 대상 스트림에 의해 복사 된 데이터가 지정된 바이트 수를 초과하면 복사가 조기에 종료되어 불완전한 내용이 발생합니다.

해결 방법 : MaxLength 로 전달 된 값이 충분히 크거나 -1이 전달되어 제한이 없도록하십시오.

 <span><span><span class="hljs-title function_ invoke__">stream_copy_to_stream</span></span><span>(</span><span><span class="hljs-variable">$source</span></span><span>, </span><span><span class="hljs-variable">$dest</span></span><span>, -</span><span><span class="hljs-number">1</span></span><span>);
</span></span>

4. 파일 스트림 포인터 위치 문제

파일을 복사 할 때 스트림 포인터의 위치가 사본 결과에 영향을 줄 수 있습니다. 특히 오프셋 매개 변수가 설정되면 소스 스트림의 포인터 위치가 파일의 시작을 가리키지 않아서 불완전한 복사를 초래할 수 있습니다.

솔루션 : 흐름 포인터가 올바른 위치에 있는지 확인하십시오. 소스 스트림 포인터의 위치는 fseek () 를 통해 조정할 수 있습니다.

 </span><span><span class="hljs-title function_ invoke__">stream_copy_to_stream</span></span><span>(</span><span><span class="hljs-variable">$source</span></span><span>, </span><span><span class="hljs-variable">$dest</span></span><span>);
</span></span>

5. 네트워크 흐름 또는 원격 파일 복사

Stream_copy_to_stream을 네트워크 스트림 또는 원격 파일의 복제에 사용하는 경우 네트워크 불안정성 또는 서버 성능 문제로 인해 복제 중단이 발생할 수 있습니다.

솔루션 :이 경우 오류 처리 및 재 시도 메커니즘을 추가하거나 CURL 또는 전용 파일 전송 프로토콜과 같은 중단 점 재전송을 지원하는 다른 도구를 사용하는 것을 고려하십시오.

 <span><span><span class="hljs-variable">$source</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fopen</span></span><span>(</span><span><span class="hljs-string">'http://example.com/file'</span></span><span>, </span><span><span class="hljs-string">'r'</span></span><span>);
</span><span><span class="hljs-variable">$dest</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fopen</span></span><span>(</span><span><span class="hljs-string">'localfile.txt'</span></span><span>, </span><span><span class="hljs-string">'w'</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">stream_copy_to_stream</span></span><span>(</span><span><span class="hljs-variable">$source</span></span><span>, </span><span><span class="hljs-variable">$dest</span></span><span>);
</span></span>

6. 메모리 제한

파일 또는 데이터 스트림이 매우 크면, stream_copy_to_stream은 복사 할 때 PHP 메모리 제한의 영향을받을 수 있습니다. 메모리가 충분하지 않으면 복사가 조기에 종료되어 불완전 성이 발생할 수 있습니다.

솔루션 : php.ini 에서 memory_limit 설정을 수정하여 메모리 제한을 동적으로 조정하거나 코드에서 ini_set을 사용할 수 있습니다.

 <span><span><span class="hljs-title function_ invoke__">ini_set</span></span><span>(</span><span><span class="hljs-string">'memory_limit'</span></span><span>, </span><span><span class="hljs-string">'512M'</span></span><span>);  </span><span><span class="hljs-comment">// 메모리 제한을 늘리십시오</span></span><span>
</span><span><span class="hljs-variable">$source</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fopen</span></span><span>(</span><span><span class="hljs-string">'largefile.txt'</span></span><span>, </span><span><span class="hljs-string">'r'</span></span><span>);
</span><span><span class="hljs-variable">$dest</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fopen</span></span><span>(</span><span><span class="hljs-string">'dest.txt'</span></span><span>, </span><span><span class="hljs-string">'w'</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">stream_copy_to_stream</span></span><span>(</span><span><span class="hljs-variable">$source</span></span><span>, </span><span><span class="hljs-variable">$dest</span></span><span>);
</span></span>

7. 스트림 유형 불일치

stream_copy_to_stream에는 소스와 대상 스트림이 모두 유효한 스트림 리소스가 필요합니다. 스트림 유형 중 하나가 일치하지 않으면 (예 : 소스 스트림은 문자열 스트림이고 대상 스트림이 파일 스트림이면) 사본 작동이 불완전 할 수도 있습니다.

솔루션 : 소스 및 대상 스트림 유형이 일치하고 둘 다 스트림 리소스가 올바르게 열려 있는지 확인하십시오.

 <span><span><span class="hljs-variable">$source</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fopen</span></span><span>(</span><span><span class="hljs-string">'source.txt'</span></span><span>, </span><span><span class="hljs-string">'r'</span></span><span>);
</span><span><span class="hljs-variable">$dest</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fopen</span></span><span>(</span><span><span class="hljs-string">'dest.txt'</span></span><span>, </span><span><span class="hljs-string">'w'</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">stream_copy_to_stream</span></span><span>(</span><span><span class="hljs-variable">$source</span></span><span>, </span><span><span class="hljs-variable">$dest</span></span><span>);
</span></span>

3. 요약

Stream_copy_to_stream 은 PHP에서 매우 강력한 기능이지만, 사용하는 동안 개발자는 여러 요인에주의를 기울여 사본 작동의 원활한 진행을 보장해야합니다. 대상 스트림의 서면, 소스 스트림의 올바른 판독 값, 최대 바이트 수, 스트림 포인터의 위치, 네트워크 안정성 및 메모리 제한을 확인함으로써 불완전한 복사의 상황을 효과적으로 피할 수 있습니다.

이러한 일반적인 원인과 솔루션을 마스터하면 개발 효율성을 크게 향상시키고 불완전한 사본 작업으로 인한 오류 및 손실을 줄일 수 있습니다.