Node.js研究分享,入门示例

2013/07/04 | 星期四 分类:JsCss | 没有评论 标签: , | 作者: | 1,781 views

Node.js研究分享

A.什么是Node.js ?
Node.js是一个基于V8引擎[1]的,可以快速构建网络服务及应用的平台,通俗点说是一套用来编写高性能网络服务器的JavaScript工具包。

更多相关Node.js的解释:.
1.Node.js是一个服务器端 JavaScript 解释器,可是真的以为JavaScript不错的同学学习Node就能轻松拿下,那么你就错了,总结:水深不深我还不知道,不过确实不浅。
2.Node.js的目标是帮助程序员构建高度可伸缩的应用程序,编写能够处理数万条同时连接到一个物理机的连接代码。处理高并发和异步I/O是Node受到开发人员的关注的原因之一。.
3.Node.js本身运行Google V8 JavaScript引擎,所以速度和性能非常好,看chrome就知道,而且Node对其封装的同时还改进了其处理二进制数据的能力。因此,Node不仅仅简单的使用了V8,还对其进行了优化,使其在各种环境下更加给力。
4.Node.js第三方的扩展和模块在Node的使用中起到重要的作用,比如:使用NPM安装各种Node的软件包(socket.io,express,redis等)并发布自己为Node写的软件包。

B.Node.js安装:window7 系统
1.win7系统32位,下载32-bit:node.exe 安装(办公环境电脑,简称WORK)
2.win7系统64位,下载64-bit:node.msi 安装(64-bit:node.exe 家里的机器无法安装,简称HOME)
注释:Linux,Mac OS X 等平台请查阅相关资料安装。

测试安装示例1:hello.js

图1:命令行运行
1
图2:浏览器查看
2
C.示例1解释:
a. 全局方法require()是用来导入模块的,一般直接把 require() 方法的返回值赋值给一个变量,在 JavaScript 代码中直接使用此变量即可 。require(“http”) 就是加载系统预置的 http 模块
b. http.createServer 是模块的方法,目的就是创建并返回一个新的web server对象,并且给服务绑定一个回调,用以处理请求。
c. 通过 http.listen() 方法就可以让该 HTTP 服务器在特定端口监听。
d. console.log 这个指令是在浏览器控制台输出日志,用来调试程序,跟alert 类似,但不像alert那样会打断程序:例如火狐,你打开firebug控制台,就可以看到调试结果了。
总结:通过这个简单示例,体现了事件驱动、异步编程,在createServer函数的参数中指定了一个回调函数(采用Javascript的匿名函数实现),当有http请求发送过来时,Node.js就会调用该回调函数来处理请求并响应。.
阅读全文

Cookie跨域之P3P解决方案

2013/05/27 | 星期一 分类:PHP | 没有评论 标签: , | 作者: | 1,906 views

Cookie跨域(第三方cookie)接收限制问题:本文是基于cookie保存session id 引出的问题,涉及浏览器的第三方cookie限制,这个在IE8、IE9才出现的问题。

情景:处理一个 js 跨域问题,使用 jsonp 跨域提交用户名密码请求,实现自动登录第三方网站,即 SSO(single-sign-on) 单点登录,一处登录处处登录。在 Chrome 下没问题,IE 却不行。查看 HTTP 的几个来回,发现登录请求是成功的,问题出在第三方网站返回的 cookie (session id) IE 并没有接受,下一次发送请求时根本没有带上 cookie,说明之前的 Set-Cookie 指令没有效果,所以怎么也登录不了。查了一下,有人使用 iframe 内嵌网页的形式,也遇到了 IE 下不能设置 cookie 的情况。

如果在“Internet选项”中把“隐私”级别设置为低,或者把第三方域名列入“可信站点”就没问题了。但是我们不可能让每个用户去更改 IE 设定吧?因此否决此观点…这是一个很常遇到的场景,肯定有别的解决办法。.

简单的说是“你访问域名A却接收到域名B的cookie 设定指令”这可能是由于网页A请求或链接了B的网页,比如 iframe 以及 jsonp问题。

相关概念:Session 默认都是基于 Cookie;PHP中的session在默认情况下是使用客户端的Cookie来保存session id的,所以当客户端的cookie出现问题的时候就会影响session了。
必须注意的是:session不一定必须依赖cookie,这也是 session相比cookie的高明之处。
当客户端的Cookie被禁用或出现问题时,PHP会自动把session id附着在URL中,这样再通过session id就能跨页使用session变量了。但这种附着也是有一定条件的,即“php.ini中session.use_trans_sid = 1或者编译时打开打开了–enable-trans-sid选项”.

Session非基于Cookie的情况:可以手动通过URL传值、隐藏表单传递session id,然后通过这个session id 获取session。

再看下另外一个概念:P3P,说明是P3P?
P3P 全称 Platform for Privacy Preferences,隐私设定平台规范。简言之,就是网站向浏览器声明自己的隐私政策,比如网站是否搜集访问者的个人信息,设置 cookie 的用途等等。浏览器会依据设置,决定在第三方请求的条件下是否接受网站的 cookie。这个规范极其复杂,跳过,请另查阅相关资料。

了解了情景与相关概念后:使用P3P规范让IE跨域接受第三方cookie 既可以解决问题。

至于完整地部署 P3P 包括设立隐私政策文件(policy.html)、原则档(policy.xml)、参考档(p3p.xml),非本文研究,可另查相关资料。

三种常用语言解决方案:发送头文件即可。 注意前面“#”注释

看了header,比如 IDC DSP 什么的是啥意思啊?

这些标签就是 P3P 所规定的了,例如 NOI 表示不搜集可识别用户的资料,ADM 表示信息搜集会用于网站管理……查看完整清单,中文简要清单。

浏览器会根据这些标签决定是否接受 cookie,根据测试结果,加上 NOI 最省事,一个就够了。不过网站一般很难做到 NOI,除非永远匿名,“登录”功能可能就违背了NOI。理论上讲,标签应该真实地反映网站的信息搜集行为,若声明的隐私政策与实际行为不符,是会要负法律责任的。Stackoverflow 有篇讨论提出了法律相关议题,可以参考。.

除了传送 P3P http header,还可以通过 HTML meta 标签,或者设定IIS服务器来声明P3P。

看完,文章也就解决了。

PHP开发Cakephp框架MongoDB数据库

2013/05/14 | 星期二 分类:资源 | 没有评论 标签: , | 作者: | 1,511 views

在一个全新的工作环境下,使用PHP开发Android(安卓)应用。

项目组选择Cakephp,众多PHP开发框架中的一个,使用过其他框架比如:Yii Zend Framework Codeilgniter Thinkphp之一者,上手并不是很难,就不再细说了。

应用:在许多场景下使用MongoDB替代传统的关系型数据库或键/值(key-value)存储方式,目前公司项目就用这个存储。
MongoDB非常适合实时的插入,更新与查询,PHP操作起来特别方便快速,易于上手;对于Mongo更多的功能待续学习与发掘。

NoSQL,指的是非关系型的数据库(NoSQL = Not Only SQL 不仅仅是SQL) 2009年开始迅速发展起来的非关系型的数据存储。而本人有幸在新公司中使用这个NoSQL 之 MongoDB存储数据的应用开发。

人对新鲜的事物,内心总是充满着好奇,并为之寻求探索。

MongoDB百度百科是这样描述的:
MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的;
MongoDB支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型;
MongoDB最大的特点是支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。

由于学习MongoDB,必须要了解NoSQL相关知识,先记下如下知识点:

1.High performance – 对数据库高并发读写的需求;
2.Huge Storage – 对海量数据的高效率存储和访问的需求;
3.High Scalability && High Availability- 对数据库的高可扩展性和高可用性的需求;
4.数据库事务一致性需求;
5.数据库的写实时性和读实时性需求;
6.对复杂的SQL查询,特别是多表关联查询的需求。

总之:新技术的出现都是为了解决某一领域的特定需求。

NoSQL特点:
1.可以处理超大量的数据;
2.运行在便宜的PC服务器集群上;
3.击碎了性能瓶颈;
4.没有过多的操作;
5.Bootstrap支持(项目开源,社区中寻求支持)。

NoSQL优点:1.易扩展;2.大数据量,高性能;3.灵活的数据模型;4.高可用。
NoSQL缺点:1.没有正式的官方支持,万一出了差错会是可怕的;2.并未形成一定标准,各种产品层出不穷,内部混乱,各种项目还需时间来检验。

RESTful是什么?RESTful Web Service

2013/05/11 | 星期六 分类:资源 | 没有评论 标签: | 作者: | 1,828 views

五月份去新公司上班了,是一家云相关的企业。在新公司需要快速掌握的三种之前工作中没接触的技术:RESTful,Nosql,node.js 稍后将学习笔记简单的做下记录…

这篇文章先来介绍下:什么是RESTful,它到底是什么?

百度百科解释让人云里云外的,仅有那么丁点感觉:http://baike.baidu.com/view/5798116.htm
Google搜索了很多,看到这个基本靠谱:一般说RESTful都是指RESTful Web Service 浅显点说,REST/RESTful大概就是以下的实现步骤

1.用URL/URI来表示Object 例如 http://www.example.com/order/10000 来表示一个订单。.

2.用标准的HTTP协议来完成逻辑操作,通常有以下几个对应 HTTP Get 来获得一个订单的内容,HTTP Put 来更新一个订单, HTTP Post 来新增一个订单, HTTP Delete 来删除一个订单。

3.无状态,一般指的是服务器端不保留任何操作和事务的状态,也就不存在类似回滚的操作。

一般来说RESTful适合逻辑标记清晰的Web服务,交换数据一般用xml json yaml这种,另外像Java有更详细的Restful标准JAX-RS。

Jquery与常见demo示例

2013/05/07 | 星期二 分类:JsCss | 没有评论 标签: | 作者: | 1,312 views

Jquery相关插件要么功能太强大体积也大,要么是固定的格式需要预设标题、内容、关闭按钮等,而Jquery相关插件要非固定样式又非常灵活的很难没找到。

于是就把手头的一个有bug的原生javascript弹出层改动了一下,.借助jQuery绕开了麻烦的兼容性问题,正好如今每个项目都用了jQuery,最终效果凑合着用还是可以的。

目前已经设计了四个源生简单Jquery demo 拿来即用。

1.全部JS: JS拖动
2.Jquery:遮罩
3.Jquery:选项卡
4.JQ天猫: Tmall Banner

即将上线更多的demo 不局限与JQ,将作为自己的源生代码库,.拿来即用到项目中。

Redis与redis主从复制

2013/04/30 | 星期二 分类:数据库 | 没有评论 标签: , | 作者: | 1,438 views

redis是一个开源的key-value数据库,它又经常被认为是一个数据结构服务器。因为它的value不仅包括基本的string类型还有list,set,sorted set和hash类型。当然这些类型的元素也都是string类型。也就是说list,set这些集合类型也只能包含string 类型。

redis可以在这些类型上做很多原子性的操作,比如对一个字符value追加字符串(APPEND命令)。加加或者减减一个数字字符串(INCR命令,当 然是按整数处理的).可以对list类型进行push,或者pop元素操作(可以模拟栈和队列)。对于set类型可以进行一些集合相关操作 (intersection union difference)。.

memcache也有类似与++,–的命令,不过memcache的 value只包括string类型。远没有redis的value类型丰富。和memcahe一样为了性能。redis的数据通常都是放到内存中的。当然 redis可以每间隔一定时间将内存中数据写入到磁盘以防止数据丢失。redis也支持主从复制机制(master-slave replication)。redis的其他特性包括简单的事务支持和 发布订阅(pub/sub)通道功能,而且redis配置管理非常简单。还有各种语言版本的开源客户端类库。

在此,简单描述下redis主从复制:redis主从复制配置和使用都非常简单。通过主从复制可以允许多个slave server拥有和master server相同的数据库副本。

redis主从复制的一些特点:
1.master可以有多个slave;
2.除了多个slave连到相同的master外,slave也可以连接其他slave形成图状结构;
3.主从复制不会阻塞master。也就是说当一个或多个slave与master进行初次同步数据时,master可以继续处理client发来的请求。相反slave在初次同步数据时则会阻塞不能处理client的请求。.
4.主从复制可以用来提高系统的可伸缩性,我们可以用多个slave 专门用于client的读请求,比如sort操作可以使用slave来处理。也可以用来做简单的数据冗余;
5.可以在master禁用数据持久化,只需要注释掉master 配置文件中的所有save配置,然后只在slave上配置数据持久化。

下面介绍下主从复制的过程:
当设置好slave服务器后,slave会建立和master的连接,然后发送sync命令。无论是第一次同步建立的连接还是连接断开后的重新连接,master都会启动一个后台进程,将数据库快照保存到文件中,同时master主进程会开始收集新的写命令并缓存起来。后台进程完成写文件后,master就发送文件给slave,slave将文件保存到磁盘上,然后加载到内存恢复数据库快照到slave上。接着master就会把缓存的命令转发给slave。而且后续master收到的写命令都会通过开始建立的连接发送给slave。从master到slave的同步数据的命令和从client发送的命令使用相同的协议格式。当master和slave的连接断开时slave可以自动重新建立连接。如果master同时收到多个 slave发来的同步连接命令,只会使用启动一个进程来写数据库镜像,然后发送给所有slave。.

redis如何配置,主从复制的:配置slave服务器很简单,只需要在配置文件中加入如下配置
slaveof 192.168.1.1 6379 #指定master的ip和端口

那么我们如何判断哪个是主哪个是从呢?我们只需调用info这个命令就可以得到主从的信息了,我们在从库上执行info命令

备注:里面有一个角色标识,来判断是主库还是从库,对于本例是一个从库,同时还有一个master_link_status用于标明主从是否异步,如果此值=up,说明同步正常;如果此值=down,说明同步异步;db0:keys=1,expires=0, 用于说明数据库有几个key,以及过期key的数量。

参考学习:http://www.cnblogs.com/redcreen/tag/redis/

Jquery与Ajax应用示例

2013/04/29 | 星期一 分类:JsCss | 没有评论 标签: , | 作者: | 1,346 views

Jquery ajax示例
document.ready()可以说是jQuery的一大特色,它不仅比传统的Javascript函数onload()要快,而且加上jQuery强大的选择器可以在不用修改HTML代码情况下(例如:不用在HTML标签加入onClick()函数来调用其它自定义Javascript函数)对Web页面中的各种元素和事件进行控制、实现和Web客户交互的作用。.

示例1:jQuery.getJSON(url, [data], [callback])
url,[data],[callback]String,Map,FunctionV1.0url:发送请求地址。
data:待发送 Key/value 参数。
callback:载入成功时回调函数。

#按钮,注意按钮与JS先后顺序

json.php
获取传参数据,比如Mysql获取数据,PHP处理,最后返回.

Jquery 示例1 注意先后顺序,否则必须如示例2一样 JS中必须加载如下语句。
#$(document).ready(function(){})

示例2:jQuery.ajax(url,[settings])
url:一个用来包含发送请求的URL字符串。
settings:AJAX 请求设置。所有选项都是可选的。

ajax.php
获取传参数据,比如Mysql获取数据,PHP处理,最后返回.

两个示例,更多详细信息请访问Jquery手册ajax模块。

PHP性能优化

2013/04/28 | 星期日 分类:PHP | 没有评论 标签: | 作者: | 1,349 views

PHP性能优化主要是对php.ini中的相关主要参数进行合理调整和设置,本地开发环境很少需要另外配置,运行环境就不一样了。如下是php.ini中的部分对性能影响较大的参数设置:

1.PHP函数禁用找到:
disable_functions = phpinfo,exec,shell_exec,proc_open,proc_get_status
该选项可以设置哪些PHP函数是禁止使用的,道号分割.
需注意:若服务器中含有一些系统状态检测的PHP程序,则不要禁用shell_exec,proc_open,proc_get_status等函数。

2.PHP脚本执行时间找到:
max_execution_time = 30
该选项设定PHP程序的最大执行时间,如果一个PHP脚本被请求,且该PHP脚本在max_execution_time时间内没能执行完毕,则PHP不再继续执行,直接给客户端返回超时错误。没有特殊需要该选项可保持默认设置30秒,如果您的PHP脚本确实需要长执行时间则可以适当增大该时间设置。

3.PHP脚本处理内存占用找到:根据需要配置
memory_limit = 8M

4.PHP全局函数声明找到:
register_globals = Off #默认为Off

5.PHP上传文件大小限制找到:
upload_max_filesize = 2M
#该选项设定PHP所能允许最大上传文件大小,默认为2MB。根据实际应用需求,可以适当增大该设置。

PHP开发中需要注意的,特别是在高并发网站中,注意了自然而然就做了优化:比如:

阅读全文

PHP交换两个值得几种方法

2013/04/26 | 星期五 分类:PHP | 没有评论 标签: | 作者: | 1,380 views

关于使用PHP交换两个值得几种方法:分别为通过字符串截取,与通过异或运算来解决。
通常要互换两个变量的值,在PHP中通常需要借助第三个变量,如以下代码所示:.

以上后三句代码的执行即可完成变量的互换任务,而现在人家要求不使用第三个变量来完成互换。
这属于一个典型的算法问题,在PHP中,没有内部函数,咋一看实现起来不是那么容易。
方法1:字符串截取。

以上方法使用字符串的截取操作:substr(),.可以实现不通过第三方变量的实现变量值交换操作。

方法2,通过异或操作符:^ 通过三次异或操作,也实现了字符串的互换操作。

方法3,使用数组分割

方法4.纯数字,比如$a,$b 分别是数字则

综述:不使用第三变量的情况,可以使用如上四种方法(字符串截取,.通过异或操作符,使用数组分割,纯数字)实现了变量交换。

Mysql互为主从订单号数据冲突方案

2013/04/25 | 星期四 分类:系统架构 | 没有评论 标签: | 作者: | 1,936 views

本文研究的不是如下1所描述的一般解决方案,而是2说所描述的解决方案,重点说文中的PHP自动生成订单号函数:new_order_number();
1.Mysql数据库互为主从服务器A、B,解决数据冲突问题:只要保证两台服务器上插入的自增长数据不同就可以了。
比如:A插奇数ID,B插偶数ID,当然如果服务器多的话,可以定义算法,只要不同就可以了。.

在这里我们在A,B上加入参数,以实现奇偶插入

A:my.cnf上加入参数
auto_increment_offset = 1
auto_increment_increment = 2
这样A的auto_increment字段产生的数值是:1, 3, 5, 7, …等奇数ID了。

B:my.cnf上加入参数
auto_increment_offset = 2
auto_increment_increment = 2
这样B的auto_increment字段产生的数值是:2, 4, 6, 8, …等偶数ID了。

可以看出,当auto_increment字段在不同的服务器之间绝对不会重复,所以Master-Master结构就没有任何问题了。当然,你还可以使用3台,4台,或者N台服务器,只要保证auto_increment_increment = N 再设置一下auto_increment_offset为适当的初始值就可以了,那样,我们的MySQL可以同时有几十台主服务器,而不会出现自增长ID 重复。

2.但本文重点说的不是如上描述的,而是Mysql数据库互为主从,特别是非内外网的情况下,不是自增ID,数据经常出现延迟,怎么解决插入冲突问题!
场景:内网公司员工操作平台手工单,外网网站运营平台客户下单!其他平台数据订单导入到内网平台单.
#订单自增ID参考如上设置,而订单号处理则参考如下。

通过如上的函数,.
很好的解决了订单号冲突问题!或许有人说,订单号使用自增ID不就解决了?对单一平台当然可以,但需要对不同平台订单导入时,肯定不满足需求,比如运营下单、ebay、amazon平台的单要导到自己运营的平台,还有使用zen-cart、magento平台的单导入到自己运营的平台时,必须要有额外的订单号统一管理并做好数据对接。

也许这不是必须的,但如上函数的思路挺好的!可以引导处理相关冲突问题提供一种思路…

第 4 页,共 7 页1234567