12.07.2015 Views

img - Xakep Online

img - Xakep Online

img - Xakep Online

SHOW MORE
SHOW LESS
  • No tags were found...

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

INFOПроект молодой, и API постоянно изменяетсяinfoБольшинство, еслине все, библиотекии проекты на Node.JS сосредоточены наGithub, поэтому еслинет какого-то модуля,нужного тебе, ищиего там.Утилита для мониторинга логовNode построен вокруг EventLoop — глобального циклаобработки событий, который на каждом тике проверяет,готовы ли данные для какого-либо из определенныхпользователем коллбэков. Если данные есть, начинаетсявыполнение кода. Если не осталось больше кода —ожидаем следующего вызова. Цикл выполняется вне JS,а в самом движке, написанном на C, вследствие чегоэто происходит очень и очень быстро (порядка сотентысяч раз в секунду). Что-то типа бесконечного цикла. Вдополнение к этому в сервер встроен очень эффективныйсборщик мусора (GC), поэтому даже тысячи подключенийне вызывают переполнения памяти и падениясервера. Node.js обладает встроенной родной системойработы с событиями.ÏÐÎÑÒÅÉØÈÉ STEAMING-ÑÅÐÂÅÐПопробуем написать простой, но в тоже время полезныйпример, который в реальном времени будет выдаватьпользователю полезную информацию без перезагрузкистраницы. Вот идея для нашего приложения — братьновые данные, которые добавляются в текстовый лог, ивыводить их в реальном времени на веб-странице:var sys = require('sys'),net = require('net'),spawn = require('child_process').spawn,http = require("http");sys.puts('\nMy process PID: ' +process.pid + '\n');var tail = spawn('tail', ['-f','/var/log/nginx/access.log']);// óêàçûâàåì íàçâàíèÿ ëîãôàéëàsys.puts("Start tailing");tail.stdout.addListener("data",function (data) {sys.puts(data);//äóáëèðóåì ñåáå íà êîíñîëü});http.createServer(function(req,res){res.sendHeader(200,{"Content-Type":"text/plain"});tail.stdout.addListener("data", function(data) { res.write(data); });}).listen(80);С помощью функции spawn() мы создаем дочерний процессутилиты tail, которая, собственно, и занимаетсятем, что считывает новые данные, которые появляютсяв логфайле. Процесс запускается только раз во времястарта сервера. Собственно, наша задача — отлавливатьмоменты, когда команда tail будет выводить новые данныеиз логфайла и транслировать вывод на веб-страницу каждомуподключившемуся клиенту. Для этого мы будем следитьза возникновением события data (появлением новыхданных) для переменной, к которой запущен процессутилиты tail, и выводить их на страницу с помощью командыwrite(). Таким образом, соединение будет оставатьсяоткрытым для каждого HTTP-запроса. Вот и все. Следитьза активностью процесса не так просто для обычноговеб-приложения, но ничего не стоит для неблокируемойархитектуры node.js и логики выполнения, основанной насобытиях. Нам остается только запустить скрипт: «nodetail.js error.log» и открыть в браузере http://localhost:80.На странице будут отображаться все сообщения, которыепоявляются в логфайле error.log.ÂÎÒ È ÑÊÀÇÎ×ÊÅ ÊÎÍÅÖСейчас, выбирая на чем бы таком написать очередноеweb 2.0 приложение, где не только красивый клиентскийкод, но и что-то надо делать на сервере, тебяпарит одна грустная мысль о том, что все уже изобрелии написали до тебя. Те же языки, что и десять летназад, те же библиотеки, протоколы и сервера. РНРуже ого сколько лет, Perl так вообще седой, Python увсех на слуху, а Ruby успел надоесть. Писать для вебастало рутиной — посмотри, как твои друзья сидят идумают, что же сделать с 25-мегабайтным монстромZend-framework. А тебе хочется что-то нового, бытьна острие прогресса, создавать то, на чем потом будутписать все, а сейчас знают только увлеченные хакерыи ищущие себя дзен-программеры? Посмотри наJavaScript в сервере, он просто создан для этого. Оченьпростой, мощный, еще не погрязший в тонне библиотеки фреймворков. Задачи, которые на РНР не решитьвообще, на базе Node.JS решаются буквально десяткомстрок. И, возможно, именно такое программирование,наконец, принесет утраченное чувство наслаждения отразработки!zHTTP://WWWlinks• Материалы поNodeJS:groups.google.com/group/nodejs• Русскоязычныйсайт и форум:forum.nodejs.ru• Информация о серверномJS:en.wikipedia.org/wiki/Server-side_JavaScript• Хороший мануалдля начинающих поNode.JS:www.slideshare.net/the_undefined/nodejs-a-quick-tour• Презентациявведениепо Node.JS:nodejs.org/jsconf.pdfXÀÊÅÐ 08 /139/ 10033

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!