현재 위치: > 최신 기사 목록> 큰 파일 데이터를 전송하기 위해 mysqli_stmt :: send_long_data를 사용하는 데 적합한 응용 프로그램 시나리오는 무엇입니까? 실제 사례 분석

큰 파일 데이터를 전송하기 위해 mysqli_stmt :: send_long_data를 사용하는 데 적합한 응용 프로그램 시나리오는 무엇입니까? 실제 사례 분석

gitbox 2025-08-08

PHP 개발에서 대규모 파일 업로드 또는 데이터 전송을 처리 해야하는 경우 일반적으로 대형 파일을 효율적으로 저장하거나 전송하는 방법에 대한 문제에 직면합니다. 특히 MySQL 데이터베이스를 사용할 때 기존 삽입 또는 업데이트 작업은 대형 파일 데이터를 효율적으로 처리하지 못할 수 있습니다. 이 과제를 해결하기 위해 MySQLI_STMT :: Send_Long_Data는 개발자가 큰 파일 데이터를 데이터베이스로 스트리밍하는 데 도움이되는 효율적인 솔루션을 제공합니다.

1. mysqli_stmt :: send_long_data 소개

mysqli_stmt :: send_long_data는 PHP MySQLI 확장에서 빅 데이터를 전송하는 데 사용되는 방법입니다. 전체 파일을 메모리에로드하지 않고 전처리 문을 실행할 때 엄청난 데이터 스트림 (예 : 파일 콘텐츠)을 MySQL 데이터베이스로 전송할 수 있습니다. 이것은 메모리 오버플로 또는 성능 병목 현상을 피할 수 있으며 큰 파일을 처리 할 때 매우 실용적인 기능입니다.

2. mysqli_stmt :: send_long_data를 사용하기위한 적용 가능한 응용 프로그램 시나리오

2.1 큰 파일을 데이터베이스에 업로드하십시오

온라인 파일 스토리지 시스템 또는 파일 관리 시스템과 같은 일부 응용 프로그램에서 사용자가 업로드 한 파일은 매우 클 수 있습니다. 파일 데이터를 메모리에 직접 읽고 데이터베이스에 저장하면 메모리 압력을 유발하고 PHP 스크립트가 시간을 초래할 수 있습니다. 이 경우 MySQLI_STMT :: Send_Long_Data는 파일 데이터를 데이터베이스로 점차적으로 전송하여 전체 파일을 한 번에 메모리에로드하는 것을 피할 수 있습니다.

시나리오 예 : 사용자가 이미지 파일을 업로드하는 온라인 사진 관리 플랫폼. 스토리지 효율성을 향상시키기 위해 플랫폼은 MySQL 데이터베이스에 이진 형식으로 이미지를 저장하도록 선택합니다. mysqli_stmt :: send_long_data를 사용하면 전체 파일을 메모리에로드하지 않고 업로드 된 각 이미지가 세그먼트로 전송되므로 큰 이미지를 업로드 할 때 메모리 오버플로가 발생하지 않도록합니다.

2.2 큰 텍스트 또는 로그 데이터 처리

일부 응용 프로그램에는 데이터베이스에 많은 양의 로그 데이터 또는 대량의 텍스트 데이터가 필요합니다. 예를 들어, 로그 관리 시스템은 세그먼트에서 MySQL에 저장 해야하는 GB의 로그 파일을 생성합니다. 이 경우 로그 파일 조각은 전체 파일 콘텐츠를 한 번에로드하지 않고 MySQLI_STMT :: Send_Long_Data를 사용하여 데이터베이스에 업로드 할 수 있습니다.

시나리오 예 : 로그 분석 시스템은 시스템에서 생성 된 다양한 로그 파일을 수집하고 저장합니다. 로그 파일은 엄청나고 전체 파일이 매번로드되면 서버 성능에 심각한 영향을 미칩니다. mysqli_stmt :: send_long_data를 사용하여 로그 파일을 점차 업로드하면 시스템이보다 효율적이고 안정적으로 만들 수 있습니다.

2.3 큰 비디오 또는 오디오 파일 전송

대형 파일 업로드 요구 사항과 마찬가지로 비디오 및 오디오 파일도 특히 일부 멀티미디어 플랫폼에서 일반적인 대형 파일 유형입니다. 비디오 스트림이나 오디오 스트림을 저장하려면 한 번에 메모리에 메모리에로드하지 않고 스트리밍하여 저장하는 것이 전통적입니다.

시나리오 예 : 비디오 웹 사이트는 사용자가 업로드 한 비디오 파일을 데이터베이스에 저장해야합니다. mysqli_stmt :: send_long_data를 사용하면 비디오 파일을 전체 파일로로드하는 대신 세그먼트의 데이터베이스로 전송하여 서버가 메모리가 충분하지 않도록 할 수 있습니다.

2.4 큰 개체를 데이터베이스로 전송합니다

일부 응용 프로그램에서는 파일 외에도 전송을 위해서는 많은 양의 바이너리 데이터 (예 : 이미지, 오디오, 비디오 등)가 필요할 수 있습니다. 이러한 큰 개체는 사용자가 업로드하거나 응용 프로그램에서 생성 할 수 있습니다. mysqli_stmt :: send_long_data는 이러한 큰 객체를 데이터베이스에 효과적으로 저장할 수 있으므로 큰 객체의 업로드가 메모리 오버플로를 유발하지 않도록합니다.

시나리오 예 : 사용자가 매우 클 수있는 전자 버전의 책 (PDF, EPUB 등)을 업로드하는 전자 라이브러리 관리 시스템. mysqli_stmt :: send_long_data를 통해 시스템은 전체 파일을 한 번에 메모리에로드하지 않고 책 파일 데이터를 단계별로 업로드하여 원활한 업로드 프로세스를 보장 할 수 있습니다.

3. mysqli_stmt :: send_long_data를 사용하는 방법

mysqli_stmt :: send_long_data를 사용하려면 mysql preprocessing 문과 함께 사용해야합니다. 다음은이 기능을 사용하여 큰 파일 데이터를 업로드하는 방법을 보여주는 일반적인 코드 예제입니다.

 <span><span><span class="hljs-meta">&lt;?php</span></span><span>
</span><span><span class="hljs-variable">$mysqli</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title function_ invoke__">mysqli</span></span><span>(</span><span><span class="hljs-string">"localhost"</span></span><span>, </span><span><span class="hljs-string">"username"</span></span><span>, </span><span><span class="hljs-string">"password"</span></span><span>, </span><span><span class="hljs-string">"database"</span></span><span>);

</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$mysqli</span></span><span>-&gt;connect_error) {
    </span><span><span class="hljs-keyword">die</span></span><span>(</span><span><span class="hljs-string">"Connection failed: "</span></span><span> . </span><span><span class="hljs-variable">$mysqli</span></span><span>-&gt;connect_error);
}

</span><span><span class="hljs-comment">// 데이터를 삽입 할 준비가되었습니다 SQL 성명</span></span><span>
</span><span><span class="hljs-variable">$stmt</span></span><span> = </span><span><span class="hljs-variable">$mysqli</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">prepare</span></span><span>(</span><span><span class="hljs-string">"INSERT INTO files (name, data) VALUES (?, ?)"</span></span><span>);

</span><span><span class="hljs-comment">// 파일 경로 및 파일 스트림 열기</span></span><span>
</span><span><span class="hljs-variable">$filePath</span></span><span> = </span><span><span class="hljs-string">"large_file.zip"</span></span><span>;
</span><span><span class="hljs-variable">$file</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fopen</span></span><span>(</span><span><span class="hljs-variable">$filePath</span></span><span>, </span><span><span class="hljs-string">"rb"</span></span><span>);

</span><span><span class="hljs-comment">// 바인딩 매개 변수</span></span><span>
</span><span><span class="hljs-variable">$stmt</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">bind_param</span></span><span>(</span><span><span class="hljs-string">"s"</span></span><span>, </span><span><span class="hljs-variable">$name</span></span><span>);
</span><span><span class="hljs-variable">$name</span></span><span> = </span><span><span class="hljs-title function_ invoke__">basename</span></span><span>(</span><span><span class="hljs-variable">$filePath</span></span><span>);

</span><span><span class="hljs-comment">// 파일 데이터를 세그먼트로 보냅니다</span></span><span>
</span><span><span class="hljs-variable">$stmt</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">send_long_data</span></span><span>(</span><span><span class="hljs-number">1</span></span><span>, </span><span><span class="hljs-title function_ invoke__">fread</span></span><span>(</span><span><span class="hljs-variable">$file</span></span><span>, </span><span><span class="hljs-number">1024</span></span><span>*</span><span><span class="hljs-number">1024</span></span><span>)); </span><span><span class="hljs-comment">// 매번 1MB 데이터</span></span><span>

</span><span><span class="hljs-comment">// 执行성명</span></span><span>
</span><span><span class="hljs-variable">$stmt</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">execute</span></span><span>();

</span><span><span class="hljs-comment">// 关闭文件和데이터库连接</span></span><span>
</span><span><span class="hljs-title function_ invoke__">fclose</span></span><span>(</span><span><span class="hljs-variable">$file</span></span><span>);
</span><span><span class="hljs-variable">$stmt</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">close</span></span><span>();
</span><span><span class="hljs-variable">$mysqli</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">close</span></span><span>();
</span><span><span class="hljs-meta">?&gt;</span></span><span>
</span></span>

이 예에서 Fread는 파일의 내용을 읽는 데 사용되며 Send_long_data는 파일 데이터를 세그먼트의 데이터베이스로 보냅니다. 문을 실행할 때 파일 데이터는 한 번에 메모리에로드되지 않지만 메모리 오버플로의 위험을 피하기 위해 점차 MySQL로 전송됩니다.

4. 주목할만한 것들

  • 데이터베이스 필드 유형 : 데이터베이스 테이블의 필드 유형이 Blob 또는 Longblob 인지 확인하십시오.

  • 전송 제한 : Send_Long_data는 큰 파일을 효과적으로 전송할 수 있지만 PHP 구성의 업로드 제한에주의를 기울여야합니다 (예 : upload_max_filesizepost_max_size ). 이러한 구성은 실제 요구에 따라 조정해야합니다.

  • 성능 튜닝 : 매우 큰 파일을 처리 할 때 전송 된 데이터의 블록 크기 (예 : 전송 당 1MB 또는 10MB)를 조정하여 서버의 성능에 따라 최적화 할 수 있습니다.

5. 요약

mysqli_stmt :: send_long_data 는 매우 실용적인 기능이며, 특히 큰 파일 또는 많은 양의 데이터가 필요한 시나리오에 적합합니다. 파일 데이터를 세그먼트로 전송하면 개발자가 메모리 오버플로 및 성능 병목 현상을 피하고 시스템 안정성 및 효율성을 향상시키는 데 도움이 될 수 있습니다. Send_long_data는 파일 업로드, 로그 스토리지 또는 멀티미디어 데이터 처리에서 중요한 역할을 할 수 있습니다. 따라서 큰 파일 처리와 관련된 응용 프로그램을 개발할 때이 기능의 합리적인 사용은 데이터 전송 프로세스를 크게 최적화 할 수 있습니다.