PHP 개발에서 대규모 파일 업로드 또는 데이터 전송을 처리 해야하는 경우 일반적으로 대형 파일을 효율적으로 저장하거나 전송하는 방법에 대한 문제에 직면합니다. 특히 MySQL 데이터베이스를 사용할 때 기존 삽입 또는 업데이트 작업은 대형 파일 데이터를 효율적으로 처리하지 못할 수 있습니다. 이 과제를 해결하기 위해 MySQLI_STMT :: Send_Long_Data는 개발자가 큰 파일 데이터를 데이터베이스로 스트리밍하는 데 도움이되는 효율적인 솔루션을 제공합니다.
mysqli_stmt :: send_long_data는 PHP MySQLI 확장에서 빅 데이터를 전송하는 데 사용되는 방법입니다. 전체 파일을 메모리에로드하지 않고 전처리 문을 실행할 때 엄청난 데이터 스트림 (예 : 파일 콘텐츠)을 MySQL 데이터베이스로 전송할 수 있습니다. 이것은 메모리 오버플로 또는 성능 병목 현상을 피할 수 있으며 큰 파일을 처리 할 때 매우 실용적인 기능입니다.
온라인 파일 스토리지 시스템 또는 파일 관리 시스템과 같은 일부 응용 프로그램에서 사용자가 업로드 한 파일은 매우 클 수 있습니다. 파일 데이터를 메모리에 직접 읽고 데이터베이스에 저장하면 메모리 압력을 유발하고 PHP 스크립트가 시간을 초래할 수 있습니다. 이 경우 MySQLI_STMT :: Send_Long_Data는 파일 데이터를 데이터베이스로 점차적으로 전송하여 전체 파일을 한 번에 메모리에로드하는 것을 피할 수 있습니다.
시나리오 예 : 사용자가 이미지 파일을 업로드하는 온라인 사진 관리 플랫폼. 스토리지 효율성을 향상시키기 위해 플랫폼은 MySQL 데이터베이스에 이진 형식으로 이미지를 저장하도록 선택합니다. mysqli_stmt :: send_long_data를 사용하면 전체 파일을 메모리에로드하지 않고 업로드 된 각 이미지가 세그먼트로 전송되므로 큰 이미지를 업로드 할 때 메모리 오버플로가 발생하지 않도록합니다.
일부 응용 프로그램에는 데이터베이스에 많은 양의 로그 데이터 또는 대량의 텍스트 데이터가 필요합니다. 예를 들어, 로그 관리 시스템은 세그먼트에서 MySQL에 저장 해야하는 GB의 로그 파일을 생성합니다. 이 경우 로그 파일 조각은 전체 파일 콘텐츠를 한 번에로드하지 않고 MySQLI_STMT :: Send_Long_Data를 사용하여 데이터베이스에 업로드 할 수 있습니다.
시나리오 예 : 로그 분석 시스템은 시스템에서 생성 된 다양한 로그 파일을 수집하고 저장합니다. 로그 파일은 엄청나고 전체 파일이 매번로드되면 서버 성능에 심각한 영향을 미칩니다. mysqli_stmt :: send_long_data를 사용하여 로그 파일을 점차 업로드하면 시스템이보다 효율적이고 안정적으로 만들 수 있습니다.
대형 파일 업로드 요구 사항과 마찬가지로 비디오 및 오디오 파일도 특히 일부 멀티미디어 플랫폼에서 일반적인 대형 파일 유형입니다. 비디오 스트림이나 오디오 스트림을 저장하려면 한 번에 메모리에 메모리에로드하지 않고 스트리밍하여 저장하는 것이 전통적입니다.
시나리오 예 : 비디오 웹 사이트는 사용자가 업로드 한 비디오 파일을 데이터베이스에 저장해야합니다. mysqli_stmt :: send_long_data를 사용하면 비디오 파일을 전체 파일로로드하는 대신 세그먼트의 데이터베이스로 전송하여 서버가 메모리가 충분하지 않도록 할 수 있습니다.
일부 응용 프로그램에서는 파일 외에도 전송을 위해서는 많은 양의 바이너리 데이터 (예 : 이미지, 오디오, 비디오 등)가 필요할 수 있습니다. 이러한 큰 개체는 사용자가 업로드하거나 응용 프로그램에서 생성 할 수 있습니다. mysqli_stmt :: send_long_data는 이러한 큰 객체를 데이터베이스에 효과적으로 저장할 수 있으므로 큰 객체의 업로드가 메모리 오버플로를 유발하지 않도록합니다.
시나리오 예 : 사용자가 매우 클 수있는 전자 버전의 책 (PDF, EPUB 등)을 업로드하는 전자 라이브러리 관리 시스템. mysqli_stmt :: send_long_data를 통해 시스템은 전체 파일을 한 번에 메모리에로드하지 않고 책 파일 데이터를 단계별로 업로드하여 원활한 업로드 프로세스를 보장 할 수 있습니다.
mysqli_stmt :: send_long_data를 사용하려면 mysql preprocessing 문과 함께 사용해야합니다. 다음은이 기능을 사용하여 큰 파일 데이터를 업로드하는 방법을 보여주는 일반적인 코드 예제입니다.
<span><span><span class="hljs-meta"><?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>->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>->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>-></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>-></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>-></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>-></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>-></span><span><span class="hljs-title function_ invoke__">close</span></span><span>();
</span><span><span class="hljs-variable">$mysqli</span></span><span>-></span><span><span class="hljs-title function_ invoke__">close</span></span><span>();
</span><span><span class="hljs-meta">?></span></span><span>
</span></span>이 예에서 Fread는 파일의 내용을 읽는 데 사용되며 Send_long_data는 파일 데이터를 세그먼트의 데이터베이스로 보냅니다. 문을 실행할 때 파일 데이터는 한 번에 메모리에로드되지 않지만 메모리 오버플로의 위험을 피하기 위해 점차 MySQL로 전송됩니다.
데이터베이스 필드 유형 : 데이터베이스 테이블의 필드 유형이 Blob 또는 Longblob 인지 확인하십시오.
전송 제한 : Send_Long_data는 큰 파일을 효과적으로 전송할 수 있지만 PHP 구성의 업로드 제한에주의를 기울여야합니다 (예 : upload_max_filesize 및 post_max_size ). 이러한 구성은 실제 요구에 따라 조정해야합니다.
성능 튜닝 : 매우 큰 파일을 처리 할 때 전송 된 데이터의 블록 크기 (예 : 전송 당 1MB 또는 10MB)를 조정하여 서버의 성능에 따라 최적화 할 수 있습니다.
mysqli_stmt :: send_long_data 는 매우 실용적인 기능이며, 특히 큰 파일 또는 많은 양의 데이터가 필요한 시나리오에 적합합니다. 파일 데이터를 세그먼트로 전송하면 개발자가 메모리 오버플로 및 성능 병목 현상을 피하고 시스템 안정성 및 효율성을 향상시키는 데 도움이 될 수 있습니다. Send_long_data는 파일 업로드, 로그 스토리지 또는 멀티미디어 데이터 처리에서 중요한 역할을 할 수 있습니다. 따라서 큰 파일 처리와 관련된 응용 프로그램을 개발할 때이 기능의 합리적인 사용은 데이터 전송 프로세스를 크게 최적화 할 수 있습니다.
관련 태그:
mysqli_stmt