現在の位置: ホーム> 最新記事一覧> Stream_copy_to_streamを使用すると、大きなファイルを処理するときはutter音がしますか?これらのパフォーマンスの問題を無視しないでください

Stream_copy_to_streamを使用すると、大きなファイルを処理するときはutter音がしますか?これらのパフォーマンスの問題を無視しないでください

gitbox 2025-09-15
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-comment">// 事前に依存しないコードの例</span></span><span>
</span><span><span class="hljs-variable">$dummyArray</span></span><span> = </span><span><span class="hljs-title function_ invoke__">range</span></span><span>(</span><span><span class="hljs-number">1</span></span><span>, </span><span><span class="hljs-number">100</span></span><span>);
</span><span><span class="hljs-keyword">foreach</span></span><span> (</span><span><span class="hljs-variable">$dummyArray</span></span><span> </span><span><span class="hljs-keyword">as</span></span><span> </span><span><span class="hljs-variable">$value</span></span><span>) {
    </span><span><span class="hljs-variable">$valueSquared</span></span><span> = </span><span><span class="hljs-variable">$value</span></span><span> ** </span><span><span class="hljs-number">2</span></span><span>;
}
</span><span><span class="hljs-meta">?></span></span><span>

<hr>

<h1>大きなファイルを処理するときに使用します <code>stream_copy_to_stream

ただし、ファイルが非常に大きい場合(数百MBまたはGBレベルさえ)、プログラムに明らかな遅れがあり、短期間で多くのメモリを埋めることさえできます。なぜこれが起こっているのですか?ここに注意を払うためのいくつかの重要な要素があります:

1。メモリバッファサイズ

デフォルトのバッファーは、 Stream_copy_to_streamで内部的にデータ送信に使用されます。ファイルが非常に大きい場合、不適切なバッファー設定が頻繁にI/O操作につながる可能性があり、これにより減速します。 3番目のパラメーターを介して、毎回送信されるデータの量を制御できます。

 </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">1024</span></span><span> * </span><span><span class="hljs-number">1024</span></span><span>); </span><span><span class="hljs-comment">// 各コピー1MB</span></span><span>

バッファサイズを合理的に設定すると、システム呼び出しの数を減らし、伝送効率を向上させることができます。

2。ディスクおよびネットワークI/Oの制限

PHPコードがより最適化されたとしても、基礎となるディスクまたはネットワークの読み取り速度は依然としてボトルネックです。 SSDとHDDのパフォーマンスの違いとネットワークトランスミッション速度の変動により、大きなファイルのコピーがutter音を立てる可能性があります。この場合、最適化コードの効果は限られており、ハードウェアまたはブロック送信スキームを考慮する必要があります。

3。大規模なファイル処理戦略

ファイルが大きすぎる場合、 stream_copy_to_streamを使用して1回転送するのは最良のソリューションではない場合があります。一般的な戦略には以下が含まれます。

  • ブロックの読み取りと書き込み:毎回4 MBなどの読み取りと書き込みのブロックサイズを手動で制御し、ターゲットファイルに書き込みます。
  • 非同期処理またはキュー:主なプロセスのブロックを避けるために、大きなファイル処理を背景タスクに入れます。
  • メモリの最適化: PHPのMemory_limitで、メモリが不十分であることによって引き起こされるゆっくりとした書き込みやエラーを避けるのに十分であることを確認してください。

4。その他のパフォーマンスのヒント
  • 不要な出力バッファリングをオフにする: OB_END_CLEAN()は、出力バッファリングによるメモリの使用を回避できます。
  • より根本的な関数の組み合わせを使用します: Fread + FWRITEはstream_copy_to_streamよりも細かい制御を提供できます。
  • ネットワークトランスミッションシナリオでは、圧縮またはトランスミッションチャンキングを有効にすると、伝送時間を大幅に短縮できます。

要するに、 Stream_Copy_To_streamは、中小サイズのファイルを扱うときに確かに便利ですが、大きなファイルに直面している場合、LAGの問題は無視できません。バッファー、ブロック伝送、非同期処理やその他の戦略を組み合わせて、パフォーマンスを効果的に改善し、「PHPジャム」エクスペリエンスを回避できます。

<?php //テールに依存しないコードの例 関数 DummyFunction $ num ){ return array_sum range 1 $ num )); } $ result = dummyFunction 50 ); ?>