0

私はしばらくNodeJSをいじっています。Node が実際にどのように動作するのか、まだ理解できていないようです。たぶん、私がPHPの考え方を捨てることができないというだけです。PHP とはかなり異なることはわかっていますが、それでもアイデアを理解できません。特に、event-loopevent-drivenREPLという用語が繰り返されている場合はなおさらです。

  • コードは開始時に「永久に」実行されますか? すべてのクライアントが見て、クライアントからの何らかのonRequestイベントをリッスンするバックエンドの大きなブラウザ ウィンドウのようなものですか?

  • それとも、すべてのリクエストは分離されたサンドボックスですか? 他のリクエストとは別に、すべてのリクエストに対してコードが実行される場所は?

ビデオでソケット接続チャットのデモを見たことがありますが、最初のポイントで説明したように動作するようです。しかし、それはすべての人が同じ「空間」にアクセスする「奇妙な」ことではないでしょうか?

4

3 に答える 3

1
  1. ノード コードは永久に実行する必要はありません。あなたが目にする典型的なユースケースでは、Node を http サーバーとして使用します (ちなみに、これは Node のセールス ポイントの 1 つです。約 5 行のコードで構成される基本的な http サーバーです)。
  2. 個々のリクエストは、コールバックで処理または応答されるため、分離されています。コールバックは、呼び出されたときにコールバックの状態が維持されることを保証する、クロージャと呼ばれる概念を使用します。したがって、各応答は、その状態を保持するコールバックになります。クロージャーとコールバックに関する素敵なリンクを次に示します。
  3. これらのコールバックは非同期で実行されるため、メイン イベント ループは自由に追加のリクエストを処理できます。
于 2012-05-16T07:12:01.917 に答える
0

結果として得られるコードのプログラムは永続的です。あなたが説明するように、それはまるでそれが大きな古いブラウザウィンドウであるかのようであり、要求を受け取り、それらに応答します。

次の例をお読みください。

var http = request("http");
var shared = 1;

function procreq (req, res)
{
    var notshared = 1;
    res.writeHead(200, { "Content-Type": "text/plain" });
    res.end(String(shared++) +  ', ' + String(notshared++));
}

var server = http.createServer(procreq);
server.listen(8080);

そのサーバーの例を実行することで、プログラムがどのように永続的であり、shared変数がすべての要求に対して表示されるかを確認できます。これは、実際のサーバー共有変数です。正しく思い出せば、PHPではmemcachedを使用してこれを実現できると思います(またはAPCですか?)。

于 2012-10-25T12:48:35.447 に答える
0

コードは開始時に「永久に」実行されますか? すべてのクライアントが見て、クライアントからの何らかの onRequest イベントをリッスンするバックエンドの大きなブラウザ ウィンドウのようなものですか?

「コード」とは何ですか?listen関数を呼び出してhttpサーバーを起動すると、プロセスを強制終了するまで永久に実行されます。

それとも、すべてのリクエストは分離されたサンドボックスですか? 他のリクエストとは別に、すべてのリクエストに対してコードが実行される場所は?

すべての着信要求 (HttpGet、HttpPost) は関数で処理されます。簡単にするために、コールバックという用語は使用しません。この関数はノンブロッキング非同期関数です。Javascript では、すべての関数は一種の分離されたサンドボックスですが、グローバル変数にアクセスできます。

http.createServer(onRequest).listen(80);
var xvz;
function onRequest() {
 var abc;
}

上記のコード スニペットでは、abc は分離されたサンドボックスにあります。ただし、abc は引き続き xyz にアクセスできます。

于 2012-07-20T09:55:58.343 に答える