ホームページ  >  記事  >  バックエンド開発  >  1G の http ポスト データを受信した後、このプロセスによって占有されるメモリは 1G になるというのは本当ですか?

1G の http ポスト データを受信した後、このプロセスによって占有されるメモリは 1G になるというのは本当ですか?

WBOY
WBOYオリジナル
2016-06-17 08:32:131399ブラウズ

メモリが 1G しかない場合、次に何が起こるでしょうか。たとえば、PHP がクラッシュするでしょうか。
node.js の場合、単一プロセスのメモリ制限は 1G です。また何が起こるのですか、崩壊しますか?

返信内容:

PHP は受信したリクエスト本体をメモリに格納しているようです。したがって、トラブルを避けるために、通常、リクエストボディの最大サイズ制限は php.ini で設定されます。デフォルトは通常 2MB、4MB などで、それほど大きくありません。この制限を超えるリクエストは 413 で直接拒否されます。

また、node.js を使用する場合、これは http サーバーを実装する人の設定に依存する必要があります。たとえば、メモリの占有を避けるために、受信したデータをハードディスクに書き込むことができます:
<code class="language-js"><span class="nx">http</span><span class="p">.</span><span class="nx">createServer</span><span class="p">(</span><span class="kd">function</span> <span class="p">(</span><span class="nx">req</span><span class="p">,</span> <span class="nx">res</span><span class="p">)</span> <span class="p">{</span>
  <span class="kd">var</span> <span class="nx">fd</span> <span class="o">=</span> <span class="nx">fs</span><span class="p">.</span><span class="nx">openSync</span><span class="p">(</span><span class="s1">'/tmp/'</span> <span class="o">+</span> <span class="nb">Math</span><span class="p">.</span><span class="nx">random</span><span class="p">(),</span> <span class="s1">'w+'</span><span class="p">);</span>
  <span class="nx">req</span><span class="p">.</span><span class="nx">on</span><span class="p">(</span><span class="s1">'data'</span><span class="p">,</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">chunk</span><span class="p">)</span> <span class="p">{</span>
    <span class="nx">fs</span><span class="p">.</span><span class="nx">writeSync</span><span class="p">(</span><span class="nx">fd</span><span class="p">,</span> <span class="nx">chunk</span><span class="p">);</span>
  <span class="p">});</span>
  <span class="nx">req</span><span class="p">.</span><span class="nx">on</span><span class="p">(</span><span class="s1">'end'</span><span class="p">,</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
    <span class="nx">callbackWithRequestBody</span><span class="p">(</span><span class="nx">fd</span><span class="p">);</span>
    <span class="nx">res</span><span class="p">.</span><span class="nx">end</span><span class="p">();</span>
  <span class="p">});</span>
<span class="p">});</span>
</code>
また、nodejs のバッファメモリは別途計算されるようで、このような大きなファイルのアップロードは通常、読み書きし放題で、メモリ使用量も高くありません。 ストリーミング処理を使用して、ゆっくりと読み書きするだけで、ノードサーバー自体が取得可能なストリームを実装できます
詳細については、Stream Node.js v5.1.1 マニュアルとドキュメントを参照してください
ほとんどの Web フレームワークはネットワーク フローをカプセル化するだけなので、リクエスト本文と直接接触することはありません。 いいえ、これらはすべてストリーム形式です。http/tcp の最下層は、読み取りと書き込みのための一定のバッファーを持ち、ストリーム形式でローカルに書き込まれます。
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。