Node_JS.ppt
- Количество слайдов: 43
Node. JS: возможности для РНР-разработчика Морозов Андрей декан факультета информационнокомпьютерных технологий ЖГТУ
1. Общие сведения - интерпретатор Java. Script, основанный на движке V 8. Особенности: • использование без браузера; • обращение к файловой системе, работа с сетью; • асинхронный код; • событийно-ориентированное программирование; • библиотеки; Автор языка: Райан Дал Дата выхода: 27 мая 2009 года Последнее обновление: 20 октября 2014 года
2. Схема работы PHP • Запрос А выполняется за 1 секунду, он не требует обращение к БД. • Запрос Б выполняется за 5 секунд, причем 4 из них, он тратит на ожидание ответа БД. • Время между запросами не менее 1 секунды.
2. Схема работы PHP • Сервер с одним РНР-процессом
2. Схема работы PHP • Сервер с двумя РНР-процессами
3. Схема работы Node. JS
3. Схема работы Node. JS
4. Установка Node. JS • Под Linux: sudo apt-get install nodejs sudo apt-get install npm • Под Windows:
5. Запуск программ • Из командной строки: node имя_файла. js • Для управления запуском скриптов следует установить: sudo apt-get install supervisor sudo service supervisor start • Файлы конфигурации находятся в директории: /etc/supervisor/ • Для включения доступа через веб-интерфейс нужно добавить в файл /etc/supervisord. conf: [inet_http_server] port = 9001 username = логин password = пароль
5. Запуск программ • Для проекта создать файл конфигурации запуска Node. JS -скрипта в директории /etc/supervisor/conf. d/файл. conf: [program: проект] command=/usr/bin/node /путь/к файлу. js directory=/путь autostart=true autorestart=true startretries=3 stderr_logfile=/var/log/проект/файл. err. log stdout_logfile=/var/log/проект/файл. out. log user=www-data
5. Запуск программ • Управление состоянием запущенных процессов через командную строку: supervisorctl start проект supervisorctl stop проект supervisorctl restart проект • Управление состоянием запущенных процессов через веб-интерфейс:
6. Интегрированные среды разработки • Коммерческие: • Jet. Brains Web. Storm/Php. Storm или Intelli. J IDEA
6. Интегрированные среды разработки • Коммерческие: • Microsoft Visual Studio with Node. js Tools for Visual Studio
6. Интегрированные среды разработки • Бесплатные: • Облачная IDE Cloud 9
6. Интегрированные среды разработки • Бесплатные: • Nodeclipse
6. Интегрированные среды разработки • Бесплатные: • Net. Beans IDE с Node. JS плагином
7. Создание веб-сервера Простейший веб-сервер: var http = require('http'); http. create. Server(function (req, res) { res. write. Head(200, {'Content-Type': 'text/plain'}); res. end('Hello Worldn'); }). listen(80, '127. 0. 0. 1'); console. log('Server running at http: //127. 0. 0. 1: 80/');
7. Создание веб-сервера Простейший веб-сервер: var http = require('http'); http. create. Server(function (req, res) { res. write. Head(200, {'Content-Type': 'text/plain'}); res. end('Hello Worldn'); }). listen(80, '127. 0. 0. 1'); console. log('Server running at http: //127. 0. 0. 1: 80/');
7. Создание веб-сервера Определение запрошенного URL: var http = require('http'); var url = require('url'); http. create. Server(on. Request). listen(80, '127. 0. 0. 1'); console. log ('Server running at http: //127. 0. 0. 1: 80/'); function on. Request(request, response) { var pathname = url. parse(request. url). pathname; route(pathname); response. write. Head(200, {"Content-Type": "text/plain"}); response. write("Hello World"); response. end(); } function route(path) { console. log(path); }
7. Создание веб-сервера Определение запрошенного URL: var http = require('http'); var url = require('url'); http. create. Server(on. Request). listen(80, '127. 0. 0. 1'); console. log ('Server running at http: //127. 0. 0. 1: 80/'); function on. Request(request, response) { var pathname = url. parse(request. url). pathname; route(pathname); response. write. Head(200, {"Content-Type": "text/plain"}); response. write("Hello World"); response. end(); } function route(path) { console. log(path); }
8. Асинхронная модель Весь механизм IO Node. JS полностью асинхронен: • обработка HTTP- и TCP-запросов; • чтение и запись файлов; • запросы к БД; Если что-то делается не асинхронно – это делается неправильно!
8. Асинхронная модель Весь механизм IO Node. JS полностью асинхронен: • обработка HTTP- и TCP-запросов; • чтение и запись файлов; • запросы к БД; Если что-то делается не асинхронно – это делается неправильно!
8. Асинхронная модель Код, содержащий логическую ошибку: var http = require('http'); var fs = require('fs') http. create. Server(on. Request). listen(80, '127. 0. 0. 1'); function on. Request(request, response) { var read. Data; fs. read. File('www/index. html', 'utf 8', function (err, data) { if (err) { return console. log(err); } read. Data = data. to. String(); }); } response. write. Head(200, {"Content-Type": "text/html"}); response. write(read. Data); response. end();
8. Асинхронная модель Правильный код: var http = require('http'); var fs = require('fs') http. create. Server(on. Request). listen(80, '127. 0. 0. 1'); function on. Request(request, response) { fs. read. File('www/index. html', 'utf 8', function (err, data) { response. write. Head(200, {"Content-Type": "text/html"}); if (err) { console. log(err); response. write('Read file error!'); } else response. write(data. to. String()); response. end(); }}
8. Асинхронная модель Плохо: var fs = require('fs') var config. Data = fs. read. File. Sync('config. xml'); response. write(config. Data); Хорошо: var fs = require('fs') fs. read. File('config. xml', function(err, config. Data) { response. write(config. Data); });
9. Статический веб-сервер var http = require("http"), url = require("url"), path = require("path"), fs = require("fs"); var directory = "/www/"; port = process. argv[2] || 80; http. create. Server(function(request, response) { var uri = url. parse(request. url). pathname, filename = path. join(process. cwd() + directory, uri); path. exists(filename, function(exists) { console. log(filename); if(!exists) { response. write. Head(404, {"Content-Type": "text/plain"}); response. write("404 Not Foundn"); response. end(); return; } if (fs. stat. Sync(filename). is. Directory()) filename += '/index. html '; fs. read. File(filename, "binary", function(err, file) { if(err) { response. write. Head(500, {"Content-Type": "text/plain"}); response. write(err + "n"); response. end(); return; } response. write. Head(200); response. write(file, "binary"); response. end(); }); }). listen(parse. Int(port, 10));
10. Фреймворк Express • Для установки библиотек и фреймворков: npm install –g библиотека • Для установки фреймворка express: npm install –g express • Статический сервер на Express var express = require('express'); var app = express(); app. use(express. static( __dirname + '/www')); app. listen(80);
10. Фреймворк Express • Обработка GET-запросов: var express = require('express'); var app = express(); app. get('/hello', function(req, res){ res. send('hello world'); }); app. get('/user/: id', function(req, res){ res. send('user ' + req. params. id); }); app. get(/^/books? (? : /(d+)(? : . . (d+))? )? /, function(req, res){ res. send(req. params); }); app. use(express. static(__dirname + '/www')); app. listen(80);
11. Веб-сокеты (socket. io) Серверная часть (server. js): var app = require('express')(); var http = require('http'). Server(app); var io = require('socket. io')(http); app. get('/', function(req, res){ res. send. File(__dirname + '/www/index. html'); }); io. on('connection', function(socket){ socket. on('chat message', function(msg){ io. emit('chat message', msg); }); http. listen(3000, function(){ console. log('listening on *: 3000'); });
11. Веб-сокеты (socket. io) Клиентская часть (index. html): <!doctype html> <head> <title>Socket. IO chat</title> <style> * { margin: 0; padding: 0; box-sizing: border-box; } body { font: 13 px Helvetica, Arial; } form { background: #000; padding: 3 px; position: fixed; bottom: 0; width: 100%; } form input { border: 0; padding: 10 px; width: 90%; margin-right: . 5%; } form button { width: 9%; background: rgb(130, 224, 255); border: none; padding: 10 px; } #messages { list-style-type: none; margin: 0; padding: 0; } #messages li { padding: 5 px 10 px; } #messages li: nth-child(odd) { background: #eee; } </style>
11. Веб-сокеты (socket. io) Клиентская часть (index. html): <script src="http: //localhost: 3000/socket. io. js"> </script> <script src="http: //code. jquery. com/jquery-1. 1. js"></script> <script> var socket = io(); $('form'). submit(function(){ socket. emit('chat message', $('#m'). val()); $('#m'). val(''); return false; }); socket. on('chat message', function(msg){ $('#messages'). append($('<li>'). text(msg)); }); </script> </head>
11. Веб-сокеты (socket. io) Клиентская часть (index. html): <body> <ul id="messages"></ul> <form action=""> <input id="m" autocomplete="off" /> <button>Send</button> </form> </body> </html>
11. Веб-сокеты (socket. io) Адрес http: //localhost: 3000/socket. io. js:
11. Веб-сокеты (socket. io)
12. Работа с базой данных My. SQL • Установить библиотеку mysql: npm install mysql • Соединение с базой данных: var mysql = require('mysql'); var connection = mysql. create. Connection({ host : 'localhost', user : 'me', password : 'secret' }); connection. connect();
12. Работа с базой данных My. SQL • Выполнение запросов: connection. query('SELECT user_id, user_login as login FROM users', function(err, rows, fields) { if (err) throw err; console. log('The login is: ', rows[0]. login); }); • Подготовленные запросы: connection. query('SELECT * FROM users WHERE user_id = ? ', [user. Id], function(err, results) { //. . . });
12. Оконные приложения Appjs: var app = module. exports = require('appjs'); app. serve. Files. From(__dirname + '/content'); var window = app. create. Window({ width : 640, height : 460, icons : __dirname + '/content/icons' }); window. on('create', function(){ console. log("Window Created"); window. frame. show(); window. frame. center(); }); window. on('ready', function(){ console. log("Window Ready"); window. require = require; window. process = process; window. module = module; window. add. Event. Listener('keydown', function(e){ if (e. key. Identifier === 'F 12') { window. frame. open. Dev. Tools(); } }); window. on('close', function(){ console. log("Window Closed"); });
13. Тесты производительности • Программа на Node. JS var sys = require('sys'), http = require('http'); http. create. Server(function(req, res) { res. write. Head(200, {'Content-Type': 'text/html'}); res. write('<p>Hello World</p>'); res. end(); }). listen(8080); • Программа на PHP <? php echo '<p>Hello World</p>';
13. Тесты производительности • 100 000 запросов, 1 000 одновременных Время Запросов в сек. Apache PHP 121. 451 сек 823. 38 node. JS 21. 162 сек. 4725. 43 • 1 000 запросов, 20 000 одновременных Время Запросов в сек. Apache PHP 3570. 753 сек 280. 05 node. JS 1043. 076 сек 958. 70
13. Тесты производительности Загрузка процессора
13. Тесты производительности Использование памяти
14. Раскол в группе разработчиков Node. JS • создан форк Node. JS под названием io. js; • первый релиз готовится к выпуску 13 января 2015 года; • io. js будет Node. JS-совместимым;
Спасибо за внимание! Морозов Андрей Васильевич, к. т. н. , декан факультета информационнокомпьютерных технологий ЖГТУ, morozov. andriy@gmail. com
Node_JS.ppt