NodeJS
NodeJS
Пожалуйста пока не оценивайте блог и не комментируйте.
Хочу сделать обучающий блог по NodeJS.
Самый простой пример с циклом.
NodeJS
Цикл в 1 000 000 000 прошел за 4 секунды.
Код
var n = 1000000000; //1 000 000 000
for(var i=0;i<n;i++){
}
console.log("END");
PHP
Цикл в 1 000 000 000 прошел за 1 минута 52 секунды
Код
<?
ini_set("max_execution_time", "10000");
$n = 1000000000;
for($i=0;$i<$n;$i++){
}
echo "END";
?>
Т.е. разница в производительности простого примера в 28 раз!!!
В принципе для чего угодно, но просто незаменим для highload.
Система мгновенных сообщений Вконтакта.
!!! Имена берет только на английском почему то!!!
http://92.53.104.192:8081/
Код написан разработчиком nodeJS Раяном Дахл(Ryan Dahl)
Ссылка на код https://github.com/ry/node_chat
var http = require('http');
var i=0;
http.createServer(function (request, response) {
i++;
response.write("Page was opened "+i+" times");
response.end();
}).listen(8007);
Размещаем файл index.html в том же каталоге что и server.js
Файл index.html сохраняем в кодировке utf-8 в notepad++.
index.html
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>NodeJS - это серверный javascript</title>
</head>
<body>
NodeJS - это серверный javascript.
</body>
</html>
server.js
var http = require('http');
var fs = require('fs');
http.createServer(function (request, response) {
fs.readFile('index.html', function (err, data){
if (err) {
response.end("File wasn't found");
}
response.end(data);
});
}).listen(8007);
Скрипт запускается на одном сервера, а делает запросы на другой, где есть nodeJS.
Делается это кросс доменными запросами.
NodeJS передает количество раз, которое была запрошена страница.
На сервере стоит замедление на ответ в 2 секунды.
http://vreshenie.ru/work/comet/cross-domain/cross-domain-comet-nodejs.ht...
Если не будет работать значит упал сервер. В nodeJS это постоянно, если не предусматривать все возможные ошибки javascript.
Init и Monit пока настроить не получилось, чтобы это исправить.
Код
index.html
<html>
<head>
<link rel="stylesheet" type="text/css" href="http://vreshenie.ru/ext/resources/css/ext-all.css" />
<link rel="stylesheet" type="text/css" href="http://vreshenie.ru/ext/resources/css/xtheme-gray.css" />
<script type="text/javascript" src="http://vreshenie.ru/ext/adapter/ext/ext-base.js"></script>
<script type="text/javascript" src="http://vreshenie.ru/ext/ext-all-zip.php"></script>
<script src="http://vreshenie.ru/work/comet/cross-domain/extjs-cross-domain.js"></script>
<script>
Ext.onReady(function(){
function crossDomainRequest(){
Ext.Ajax.request({
timeout:300000,
url: 'http://nodejs.tmweb.ru:8007/',
scriptTag: true,
success: function(r) {
var message = r.responseObject.text;
console.log(message);
Ext.getCmp('serverMessage').update("Запросов к странице было сделано "+message+"<br>В скрипте не сервере стоит замедление в 2 секунды на ответ.");
crossDomainRequest();
}
});
}
new Ext.Window({
title:'Кросс доменный comet',
width:250,
height:150,
layout:'fit',
items:[{
id:'serverMessage',
autoScroll:true,
html:'Это место для ответов сервера.<br>На сервер стоит замедление. поэтому придется подождать.'
}],
listeners :{
show:function(){
crossDomainRequest();
}
}
}).show();
});
</script>
</head>
<body>
</body>
</html>
server.js
var http = require('http');
var url = require('url');
var i = 0;
http.createServer(function (request, response) {
var parsed = url.parse(request.url,true);
var callback = parsed.query.callback;
setTimeout(function(){
i++;
var answer = callback+"({'status':'success','text':'"+i+"'})";
response.end(answer);
},2000);
}).listen(8007);
Вот что получилось.
Многое надо переделать, но он работает.
Если чат не работает, значит слетел nodeJS.
Писать можно только на английском, ник тоже лучше использовать английский.
Как время будет улучшу.
http://vreshenie.ru/work/comet/cross-domain/chat.html
index.php
<html>
<head>
<link rel="stylesheet" type="text/css" href="http://vreshenie.ru/ext/resources/css/ext-all.css" />
<link rel="stylesheet" type="text/css" href="http://vreshenie.ru/ext/resources/css/xtheme-gray.css" />
<script type="text/javascript" src="http://vreshenie.ru/ext/adapter/ext/ext-base.js"></script>
<script type="text/javascript" src="http://vreshenie.ru/ext/ext-all-zip.php"></script>
<script src="http://vreshenie.ru/work/comet/cross-domain/extjs-cross-domain.js"></script>
<style>
.icon-user {
background-image: url(http://www.vreshenie.ru/resources/user.png) !important;
}
.icon-pencil {
background-image: url(http://www.vreshenie.ru/resources/pencil.png) !important;
} Ъ
</style>
<script>
var messages = [];
Ext.onReady(function(){
function sendMessage(login){
var msg = Ext.getCmp('idMsgChat').getValue();
if(msg.length!=0){
crossDomainRequest('sendMessage',{login:window.login,msg:msg,action:'sendMessage'})
}
}
function runLoginedChat(){
var win = Ext.getCmp('windowChat');
win.setTitle('Кросс доменный comet chat на ExtJS+nodeJS');
var login = Ext.getCmp('login');
win.items.items[1].el.fadeOut({callback:function(){
login.hide();
}});
var buttonLogin = Ext.getCmp('idLoginButton');
buttonLogin.setText('Отослать');
buttonLogin.setIconClass('icon-pencil');
buttonLogin.setHandler(sendMessage,{login:login});
var xy=win.getPosition();
var x = xy[0]-100;
var y = xy[1]-100;
win.el.shift({
x: x,
y: y,
duration:1,
//easing:effect,
callback:function(){
win.el.shift({
width:400,
callback:function(){
win.setWidth(400);
win.setHeight(300);
crossDomainRequest('getMessage',{login:window.login,action:'getMessage'});
Ext.getCmp('idMsgChat').show();
Ext.getCmp('serverMessage').show();
}
});
}
});
}
function crossDomainRequest(action,params){
Ext.Ajax.request({
timeout:300,
url: 'http://nodejs.tmweb.ru:8008/',
params:params || {},
scriptTag: true,
success: function(r) {
var message = r.responseObject.text;
var login = r.responseObject.login;
//console.log(message);
//console.log(r);
if(action=='getMessage'){
if(!r.responseObject.reconnect){
messages.push({msg:message,login:login});
var str=' ';
messages.forEach(function(v){
str+= "" + v.login+": "+v.msg+'<br>';
});
Ext.getCmp('serverMessage').update(str);
}
crossDomainRequest('getMessage',{login:window.login,action:'getMessage'});
}
if(action=='login'){
//Ext.getCmp('serverMessage').update("Сообщение "+message+" ");
runLoginedChat();
//console.log(message);
}
if(action=='sendMessage'){}
},
failure:function(){
console.log('failure');
if(action=='getMessage'){
crossDomainRequest('getMessage',{login:window.login,action:'getMessage'});
}
}
});
}
function chatLogin(){
var login = Ext.getCmp('login').getValue();
window.login=login;
crossDomainRequest('login',{login:login,action:'login'});
}
new Ext.Window({
id:'windowChat',
shadow:false,
iconCls:'icon-user',
title:'Вход в чат',
width:270,
height:95,
layout:'form',
bodyStyle:'padding:5px 5px 0',
items:[{
id:'serverMessage',
bodyStyle:'padding:5px 5px',
height:230,
hidden:true,
autoScroll:true,
html:'Сюда приходят сообщения'
},{
id:'login',
xtype:'textfield',
fieldLabel:'Укажите ник'
}],
bbar:[{
id:'idMsgChat',
xtype: 'textfield',
width:300,
hidden:true,
},'->',{
id:'idLoginButton',
text:'Войти',
iconCls:'icon-user',
handler:chatLogin
}]
}).show();
});
</script>
</head>
<body>
</body>
</html>
server.js
var http = require('http');
var url = require('url');
var sys = require('sys');
var clients = [];//{name:'root',response:response}
http.createServer(function (request, response) {
var endConnection = function(answer){
response.end(answer);
}
var parsed = url.parse(request.url,true);
var callback = parsed.query.callback;
if(!callback){
var answer = callback+"({status:'failure',text:\"Wasn't get name callback function for cross-domain.\"})";
endConnection(answer);
}
var action = parsed.query.action;
switch(action){
case 'login':
var login = parsed.query.login;
var callback = parsed.query.callback;
clients.forEach(function (v) {
if(login==v.name){
answer = callback+"({status:'failure',text:\"This name is busy. Check another one.\"})";
endConnection(answer);
}
});
clients.push({name:login,callback:callback});
//console.log(clients);
answer = callback+"({status:'success',text:'true'})";
endConnection(answer);
break;
case 'getMessage':
var login = parsed.query.login;
var callback = parsed.query.callback;
clients.forEach(function (v) {
console.log(login==v.name);
console.log(login+"=="+v.name);
if(login==v.name){
v.response=response;
v.callback=callback;
}
});
setTimeout(function(){
answer = callback+"({status:'success',reconnect:true,text:\"Hi.\"})";
endConnection(answer);
},25000);
break;
case 'sendMessage':
var msg = parsed.query.msg;
var login = parsed.query.login;
clients.forEach(function (v) {
console.log(v.callback);
console.log(v.name);
console.log(v.response);
v.response.end(v.callback+"({status:'success',login:'"+login+"',text:'"+msg+"'})");
});
endConnection(callback+"({status:'success'})");
break;
default:
var answer = callback+"({'status':'failure','text':'This action is not defined'})";
response.end(answer);
}
}).listen(8008);
|
А давайте включим Zend Optimizer для php?
Вы забыли про оптимизации которые делает V8, что он фактически компилирует код в нативный для процессора, а не производит на каждой итерации цикла интерпретацию путь уже и распарсенного байт-кода которые далеко еще не машинный (случай с php).
Следовало бы это объяснить новичкам, а то кинутся сейчас все на node.js не узнав даже про возможности оптимизации php. Он в опытных руках, то же может многое показать.
Вы забыли упомянуть о том перевороте мозга который нужно сделать чтоб писать на JavaScript полностью в асинхронном стиле, о том КАК это весело и просто. Это ведь уже не просто AJAX-callback'и с выводом alert и наполнением кусочков страниц новым текстом...
Я так не люблю ни с кем спорить)))
Я не использую никаких php framework-ов.
Я пишу свои php классы.
Если надо сделать очень мощный проект, который на одном сервере не уместится, то nodeJS идеальное решение.
Каждый сервер, это деньги.
Никакая php оптимизация не сократит скорость выполнение кода в 28 раз.
И в итоге писать серверную сторону либо на С либо на nodeJS.
Еще раз прочитал Ваше сообщение.
Я не совсем понял, Вы хотите сказать, что с помощью Zend Optimizator можно получить что-то похоже по производительности на байт код?(Не очень сформулировал, но думаю Вы поняли вопрос)
Я про категоричность и однобокость рассмотрения вопроса.
Я согласен, что node.js в разы быстрее php. Но нельзя так грубо и без аргументирования отправлять его в полные аутсайдеры к черепахам... вроде руби (сейчас меня порвут рубисты).
Может сравним еще C++ и node.js? Спрогнозируете результат? Я бы описал его так — можно ТАК на говнокодить на C++, что и php его сделает как маленького.
Много зависит от реализации, от прямолинейности рук программиста. То что один напишет на node.js и будет кричать что его МАКСИМАЛЬНО быстрое, вполне может обломиться перед решением на php которое будет и меньше памяти кушать и быстрее работать, а все потому, что автор кода использует не пузырек для сортировки массива в 10 млн. 4х байтовых чисел, а что-то по умнее...
На мой взгляд пример с циклом очень показателен. Как видите, исполнен в обоих языках он родной конструкцией и о каком 'говнокоде' вы говорите. Если вы согласны с утверждением, о скорости node превышающей в разы php и видите пример с этим доказательством (причем код в обоих языках абсолютно равнозначен) зачем нужно доказывать обратное, звучащее абсурдно. PHP слишком задержался на вершине популярности и на мой взгляд ему уже давно пора 'к черепахам'. Я рад, что появилась платформа node. Это не просто высокоскоростная, но и очень гибкая, удобная и многообещающая платформа для программистов. Она расходует невероятно мало памяти, т.к. выделяется она автоматически по мере необходимости. Если Вы до сих пор несогласны, выкладывайте другие тесты, чтобы мы убедились
Это плохой пример, почти все движки JS оптимизируют пустые конструкции, PHP же этого не делает. Попробуйте в этом цикле вывести i, в итоге увидете результат своими же глазами, а заодно и более точное сравнение.
Функции вывода являются очень медленными в любом языке программирования.
Чтобы в этом убедится попробуйте сделать пример вывода i на С.
Даже если в nodeJS внутрь поместить простой код проверки, который делает несколько ненужных действий скорость таже - 4 секунды.
Код
А знаете, материал, которому вы хотите посвятить статью очень не плох. Может получится что-то дельное. Вроде статей Ильи Кантора. Этакий faq для node.js, по крайней мере гораздо полезнее чуда-тетрисов от горе-писателей и прочей чуши, которую последнее время любят писать в блогах. Только пожалуйста пишите без ошибок и школьного 'вконтакта', и не скупитеть на примеры. Если получится неплохая статья, можно попросить Илью закрепить её в боковой панели. Удачи вам.
Спасибо, я постараюсь.
Мне nodeJS нужен в нескольких проектах.
Сейчас активно изучаю, как только что-то дельное получится
выложу.
а как вы NodeJS для хайлоада использовать хотите если он не поддерживает мультпроцессорность(точнее этого неделает V8)
Пока еще рано о чем то говорить, надо научится.
Сейчас самое сложно его поставить.
У меня стоит тестовая windows версия, которая
даже для локального тестирования не подходит.
Так вы еще и под форточками тестируете...
С многопроцессорностью или многоядерностью поступают просто — сколько реальных физических ядер, столько и node.js запускают.
Нет, видимо ничего хорошего всё таки не получится. А жаль...
Вы наверное так написали, потому что увидели на ссылке It works.
Дело в том, что nodeJS почему то слетает во время работы.
Вообще не так то легко ему обучиться.
NodeJS только год а то и меньше назад появился.
Ни одной книги на данный момент нет.
Плюс к этому, надо очень хорошо разбираться в настройке серверов, в nginx
и прочем.
Если бы Вы тоже попробовали, Вы поняли что это реально сложно.
В данный момент занимаюсь именно им. Появился он в 2008 году. Выходит 3 года назад. Я думал, что это будет статья, которая открывает возможности, показывает сравнительные тесты, описывает общие нюансы и т.д. Собственно не радует появления пункта с какими то чатами. Зачем они здесь? Это не опыт программирования и даже не средство разработки (напр. framework). Не в том направлении, как мне кажется идет развитие статьи. Но она ваша и вам решать, конечно :-)
Если у Вас есть опыт, то напишите пожалуйста как считаете нужным.
Мне нужен опыт и практика. И где то размещать свои наработки.
Если Вы сделаете очень хорошую статью я буду Вам очень благодарен.
Мне nodeJS очень нужен для работы.
Вся проблема во времени
Но по-любому где-то подвох. Без этого не бывает. Хотя мне nodejs тоже понравился, но только тем, что от php можно вообще отказаться и писать всё в одном духе. Правда стиль php более понятен, чем стрепня на java. callback - портит мозги, считаю херню заманчивой, но как и вся эта web-побасятина - бесполезный хлам и зря потраченное время, америкосы сделают из нашего нового поколения расу рабов и победят без войны, уничтожив русский моск. Будешь ходить и хвастаться своей стрепнёй, как она хорошо работает, какая красивая, и только ...
Отправить комментарий
Приветствуются комментарии:Для остальных вопросов и обсуждений есть форум.