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を使用して徐々にログファイルをアップロードすると、システムがより効率的で安定します。
大規模なファイルをアップロードする要件と同様に、ビデオおよびオーディオファイルも一般的な大きなファイルタイプ、特に一部のマルチメディアプラットフォームでです。ビデオストリームやオーディオストリームを保存するには、一度にメモリにロードするのではなく、ストリーミングで保存することが伝統的です。
シナリオの例:ビデオWebサイトは、ユーザーがアップロードしたビデオファイルをデータベースに保存する必要があります。 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は、ファイルのアップロード、ログストレージ、またはマルチメディアデータ処理において重要な役割を果たすことができます。したがって、大規模なファイル処理を含むアプリケーションを開発する場合、この関数を合理的に使用すると、データ送信プロセスを大幅に最適化できます。