質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

2回答

300閲覧

Node.jsで立ち上げたサーバーで、リクエストごとに前の値が維持されているのはなぜでしょうか?

DecoratedKnight

総合スコア13

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2019/03/21 13:10

編集2019/03/21 13:19

Node.js初心者です。
以下のコードで立ち上げたサーバーにアクセスしたとき、アクセスのたびにitemsの要素が増えて行くのはなぜなのでしょうか?

javascript

1const http = require('http') 2const items = [] 3const server = http.createServer((req, res) => { 4 items.push('sample') 5 console.log(items) 6 res.end() 7}) 8 9server.listen(3000)

例えばPHPで、以下のコードをビルトインサーバで立ち上げて同様に何度かアクセスしても、
常に $itemsの中身は ['sample'] から変わらないと思います。

php

1<?php 2 3$items = []; 4 5array_push($items, 'sample'); 6 7var_dump($items);

このPHPのような挙動が普通だと思っていたので、困惑(と言うか理解が追いつかない)しています。
よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

アーキテクチャーの違いです。

PHPという言語はセッション毎にプロセスを初期化しています。
そしてWebサーバの本体はApache等の既成品となります。

Apacheにはmod_phpというPHPと連携するためのモジュールが用意されており、
Apacheを起動した瞬間、重いPHPのプロセスを4個程並列で立ち上げておき、
リクエストが来たら空いているPHPプロセスを宛てがい動的なHTMLを生成、
リクエストを消化した後、PHPプロセスを初期化というサイクルで運用しています。

なのでPHPではアクセスの度に変数等の情報が初期化されます。
維持するには$_SESSION等を利用して明示的に残すしかない。


他の言語でもApacheのCGIという機能を使って、
アクセスが来たら泥縄的にプロセスを呼び出して実行…という事は可能です。
でも、プロセスを何個も用意して待ち受けるmod_phpの仕組みの方が沢山のリクエストをさばけます。

そこで、PHP以外の他の言語は、
Apache等のWebサーバアプリを介さず、
自力でHTTPリクエスト、HTTPレスポンスを読み書きしてWebサーバとして動作させようという発想になります。

というか、そっちの方が自然やねん。

質問文のNode.jsの例ではHTTPサーバという変数を用意して、
それに対してアクセスがあったら登録した関数を実行してHTTPレスポンスを返すというコードになっています。
Node.jsはイベント登録を行っていると、エラー等でプロセスが終了したり、外側から殺されない限りずーっと処理し続けます。

なので、より上のスコープで宣言したitemsという変数は残り続けるわけです。

投稿2019/03/22 00:43

miyabi-sun

総合スコア21158

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

DecoratedKnight

2019/03/22 09:29 編集

PHPはリクエストごとに新しい(初期化された)プロセスで処理されるからもろもろリセットされて、 対してNode.jsは同じプロセスがずっと使われているから(このコードだと)維持されていると...。 腑に落ちました。 回答ありがとうございました!
guest

0

ベストアンサー

itemsが、個々のリクエスト処理の外側の変数だからですね。

JavaScript

1const http = require('http') 2const server = http.createServer((req, res) => { 3 const items = [] 4 items.push('sample') 5 console.log(items) 6 res.end() 7}) 8 9server.listen(3000)

にすれば、PHPと同様の結果になると思います。

逆に、PHPで最初のJavaScriptと同様の処理にしたければ、個々のリクエストの外、つまりセッションとか、ファイル、データベースなどに保存することになります。

投稿2019/03/21 13:22

otn

総合スコア84499

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

DecoratedKnight

2019/03/21 13:44

回答ありがとうございます。 頂いた内容で挙動確認できました。 Javascriptの方はサーバーの待ち受けと個々の処理を両方やっていると言う目線が抜けてました。 ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問