冒泡服务器关了吗?怎么有时候上cf进不去服务器

小站会根据您的关注,为您发现更多,
看到喜欢的小站就马上关注吧!
下一站,你会遇见谁的梦想?
关注web领域技术的发展和学习&【js&/&html5&/&css3&/&jquery&/&jqm】【php&/&nodejs】【apache&/&nginx&】【redhat&/&CentOs】
一棵歪脖子树——全栈工程师
  老张有一个林场,专门种植树木,待树木成材后销到城里做家具。林场里有不少杉树,长得都非常挺拔,偏偏不知怎的长了一棵歪脖子树,长得倒是郁郁葱 葱,偏偏造型奇特,别的树都力争上油,可这棵歪脖子树不仅横着长,还长得颇为怪异。老张几次都想挖掉它当柴火烧,看它那怪异的造型又忍住了,心想等这批杉 树成材,一起砍掉吧。&  一到晚上夜深人静的时候,林场里就炸开了锅,杉树们极力取笑歪脖子树。&你知道作为一棵树,我们的终极目标就是成为有用之材吗,你看旁边那个,可以做梁柱,小歪脖子,你丫能干啥啊?&;"这个臭歪脖子树,抢了我们的养分和阳光,长成这样,完全是丢我们的脸,我呸!".&  歪脖子树有自己的梦想,它要长成它喜欢的造型,如此日复一日,林场里的杉树渐渐长大了,老张决定逐步卖掉这些杉树。随着一批批杉树被运出去,奚落与 嘲笑更多了。&瞧睢人家,你左边的那棵,现在在被打造成前台,在知名大企业,右边的那棵更牛逼了,它被做成了老板桌,你知道天天用的老板是谁吗,说出来吓 死你。你个臭傻逼,作为一棵树,你居然不向上长?&&  林场里的树越来越少了,歪脖子树也有些失落,对自己的未来产生了怀疑,当初为什么不和他们一样长呢。&  有一天,一个老板和他弟弟过来买树,他弟弟是个园艺家。园艺家正在筹划一个大型的园林,一切都弄好了,唯独还差一棵造型奇特的树作为点睛之用,他找了很多地方,不是造型不满意就是人为痕迹太过于严重。终于,他看到了这棵歪脖子树,立马柏板重金购买。&  老张觉得不可思议,林场里的杉树们更是炸开了锅,&凭什么啊,我们长这么高,它就那么点高,还长得这么怪,凭啥卖了这么高的价钱&。原来,随着经济条件的的变好,人们有闲钱了,也愿意花钱去欣赏园艺了,长得高的树木很多,但长得怪的树木却是极为难得。&  一棵歪脖子树&  有些人一听这个全字满腔怒火,凭啥你的职业中带一个全字,你是要前端后端通吃吗,还要吃掉移动端,你是不是要抢我的饭碗。你凭什么啊,做技术就应该专精,你知道茴香豆的茴字有几种写法吗?&  记得三年前我在一篇文章《两个重要而又容易被忽视的角色》中有谈到前端工程师和产品工程师的重要性,结果有一大波后端工程师批评我,他们认为前端就是一个低端的职位,切切图写写JS就完事了,重要个屁啊。现在你来看,到处都在招前端,而且工资不比后端低,甚至略高,还不一定能请到人。&  全端工程师不是什么高大上,它只是一种职业,和DBA运维产品工程师一样,只是职业的细分。全端工程师不是要吃掉前端更不是要吃掉后端,它是环境发 生到一情况况所催生的一种新的职业,它恰恰是市场更细分的结果。我能理解某些工程师的那种紧张与孤傲,早些年出现前端吞掉我们的一部分工作,现在又要炒全 端吃掉我们的一部分工作,你让我们这些垂直发展的人怎么活,连茴字有几种写法你都不知道,你有什么资格拿着和我们一样的工资?&  与新技术的任何方面打交道的人,他们确信自己是在做天生的高科技业务&&在我们两人看来,他们一般都不是。在这些领域中, 那些有根本性突破的研究人员是在做高科技业务。我们所有其他局外人只是他们工作成果的应用者。我们用计算机和其它新技术组件来开发我们的产品或者组织我们 的事务&&《人件》&  很抱歉,不管你同不同意,我们大多数人都是技术的使用者,除了极少数的牛人之外,我们都在为产品服务。我们的客户并不想知道你有多么牛逼的算法,也不想知道你用了多少种设计模式,他们要的是,你能给我带来什么价值,能不能让我用得爽用得值。&  一幢房子&  我很喜欢把软件工程与建筑业相比,我很抱歉又把大家和农民工相提并论了,其实我们与他们,并没有本质上的区别,他们在搬砖,而我们在搬bit,他们 晒着太阳累一点活得长一点,咱们吹着空调死得早一点。做得好一点的工程师,无非就是一个代码工匠,我们都是手艺人,手熟而已,无它。&  垂直发展是钢筋,而横向发展可能就是水泥。没有钢筋的房子建不高,没有水泥的房子也是有的,不过水泥+钢筋还是多数了吧。无需你自己是钢筋就指责水 泥,就象Node.js刚出来的时候,被人指责是一班臭前端搞出来玩的的东西。任何技术都有它的适用场景,离开某个场景可能一文不值,人也一样。&  不要因为自己用Java就批评ASP.net,也无需自己开发Android就骂果粉,我知道,PHP是全世界最好的语言。如果我们能在各自喜欢的领域有更好的发展,不是更好么。你觉得横向发展不好,你不跟就是,他强由他强,清风拂山冈;他横由他横,明月照大江。&  为什么会需要全端工程师&  我们需要有全局视野的人&  老板们都说,开发人员要有产品意识,要有用户意识,如果你只做后端,恐怕你是不能理解前端对用户的重要性。其实说来惭愧,很多人误以为我是个臭前 端,其实我从来没有专职做过前端,我很抱歉我站错了队。这么多年,我一直是在写点前端并厚着脸皮混在后端,作为一个低水平的臭后端,我只是更喜欢和用户接 近一点而已。&  IT行业的鄙视链是很严重的,大家之间相互鄙视,或者,你换个岗去做对方的工作,我相信你就能了解到他们的工作价值了。前端说用户体验重要,后端说没有后端你前端屁都不是,彼此对调一下,你能感受更多。&  一种技术不能解决所有问题,我们需要从多种技术中权衡,到底是用Hybrid还是用Native,这是要根据你的业务场景和人员配置情况来判断的,不是说看别人写的几篇教程或者指南就能决定的。&  创业公司越来越多&  IT的创业公司越来越多,除了少数真正玩技术的公司,恐怕还是要玩产品的。既然是玩产品,就免不了各种设备各种平台各种兼容。新公司的资源总是有限 的,单个工种的工作量又没那么饱和。所以有一个多面手在创业初期是很有帮助的,不可能为了一个iOS的客户端去专门请一个月薪上万的人来做iOS应用,再 花上万的月薪找人来做Android客户端,省钱是创业公司的主流,但又希望自己的产品能全面铺开,所以全端工程师是不二之选。&  硬件设备的发展&  有人一定会说,硬件设备和全端工程师有半毛钱关系,还真有那么一些关系。软件最初的时候是单机版,要求的只是软件工程师,后来因为网速的提升与网络 的普及,B/S取代了C和C/S,所以就演变成了后端工程师占主流地位。到现在,客户的硬件设备越来越强大,网速也越来越快,所以Web前端会占主流,而 所谓的后端会越来越萎缩。不管你愿意不愿意,我认为,未来的后端,会发展到只提供Web API的数据,只需要少数工程师就能搞定。大部工作会由所谓的前端和各种客户端来完成,这就是我讲的后端已死。&  移动设备的发展和云的概念以及第三方平台,肯定对这种需求起到了推波助澜的作用。一方面,企业需要一个能掌握多种技术的人以降低成本,另一方面,也需要一个有全局视野的人来参与,他需要对产品中用到的多种技术都熟悉,所以,全端工程有时候会是一个胶水的作用。&  结语&  全端工程师不会替代后端工程师,也不会替代替代前端工程师,这个职业不是要替代谁,它只是让我们更好的工作,只是一种新的职业而已。胶水有胶水的价值,催化剂有催化剂用处。积极地拥抱变化吧,唯一不变的是变化的本身,你我都无法阻止。&  专精是一个方向,横向也是一个方向,没有谁比谁厉害。不用担心别人呼吸你就没有氧气了,坚持自己的发展方向,你总会有价值的。尺有所长寸有所短,不 必因为彼此的发展方向不一就大动干戈,有这力气,还是多搬个砖吧,多动一下,总是要活得长一点的。我知道Master Wugui是不会同意我这个看法的。&  全端工程师,就是掌握多种技能,并能利用多种技能独立完成产品的人&&涂雅
addEventListener()与removeEventListener()
addEventListener()与removeEventListener()用于处理指定和删除事件处理程序操作。所有的DOM节点中都报站这两种方法,并且它们都接受3个参数:要处理的时间名、作为事件处理程序的函数和一个布尔值。最有这个布尔值参数是true,表示在捕获节点调用事件处理程序;如果是false,表四在冒泡节点调用事件处理程序。要在按钮上为click事件添加事件处理程序,可以使用下列代码:var btn = document.getElementById("myBtn");btn.addEventListener("click", function () {&& &alert(this.id);}, false);使用DOM2级方法添加事件处理程序的主要好处是可以添加多个事件处理程序。来看下面的例子:var btn = document.getElementById("myBtn");btn.addEventListener("click", function () {&&& alert(this.id);}, false);btn.addEventListener("click", function () {&&& alert("Hello World");}, false);通过addEventListener()添加的事件处理程序只能使用removeEventListener()来移除;移除时传入的参数与添加处理程序时使用的参数相同。这也意味着通过addEventListener()添加的匿名函数无法移除,如下面的例子所示:var btn = document.getElementById("myBtn");btn.addEventListener("click", function () {&&& alert(this.id);}, false);btn.removeEventListener("click", function () {& //无效!&&& alert(this.id);}, false);
在这个例子中,我使用addEventListener()添加一个事件处理程序。虽然调用removeEventListener(0是看似使用了相同的参数,但实际上,第二个参数与传入addEventListener()中的那一个完全不同的函数。而传入removeEventListener()中的事件处理程序函数必须与传入addEventListener()中的相同,如下面的例子所示:var btn = document.getElementById("myBtn");var handler = function () {&&&&&&& alert(this.id);&&& };btn.addEventListener("click", handler, false);btn.removeEventListener("click", handler, false);& //有效!重写后的这个例子没有问题,是因为在addEventListener()和removeEventListener()中用来相同的函数。&大多数情况下,都是将事件处理程序添加到事件流的冒泡阶段,这样可以最大限度地兼容各种浏览器。最好只在需要在是时间到达目标之前截获它的时候将事件处理程序添加到捕获阶段。如果不是特别需要,我们不建议在事件捕获阶段注册事件处理程序。
css小记——ie系列私有属性
#tip { &background: /*firefox 背景变蓝色*/ &background:red \9; /*ie8 背景变红色*/ &*background: /*ie7 背景变黑色*/ &_background: /*ie6 背景变橘色*/& } &&【说明】:因为ie系列浏览器可读「\9」,而ie6和ie7可读「*」(米字号),另外ie6可辨识「_」(底线),因此可以依照顺序写下来,就会让浏览器正确的读取到自己看得懂得css语法,所以就可以有效区分ie各版本和非ie浏览器(像是firefox、opera、google chrome、safari等)
MVC模式已死?何不试试MOVE
MVC模式在编程中的应用,是一个很了不起的主意。&数据模型(Model)&可以封装与应用程序的业务逻辑相关的数据及对数据的处理方法;&视图层(View)&能够实现数据有目的的显示;&控制器(Controller)&能够在不同层面间起到组织作用,对应用程序的流程进行控制。&不过,可能你在使用这种三层架构模式的过程中会逐渐迷惑。因为有很多代码你不知道把它放哪,就只好把它放到控制层,最后发现在控制层中塞了太多的代码。&LinkedIn 的软件工程师 Conrad Irwin也遇到同样的问题,于是他开始使用另一种模式:MOVE,即 Models(模型)、Operations(操作)、Views(视图)、Events(事件)。近日 Conrad Irwin 在 个人博客上分享了关于这种模式的一些观点。&概述
&Irwin 结合上图对 MOVE 模式先作了简单定义:&Models&,封装该应用程序中知道的一切;&Operations&,封装该应用程序要做的一切;&Views&,帮助用户与应用程序完成交互;&Events&,用于安全地连接所有这些组件。&为了避免意大利面条式的代码,图中标示出了对哪种类型的对象进行操作是允许的。例如,视图允许监听由模型产生的事件;操作允许修改模型,但模型不应涉及视图或操作。&Models(模型)这里以一个&User&对象为原型,它至少应用有一个 Email 地址,也可能有用户名和电话号码。&在一个 MOVE 模式的 Models 中只包装知识。这意味着除了 Get 和 Set 功能,它们可以包含检查用户密码是否正确这样的方法,但不会包含把密码保存到数据库或传递给外部 API 这样的功能,因为后面这些工作将由 Operations 来完成。&Operations(操作)对应用程序来说,一个常见的操作是用户登陆。这实际上是由两个子操作组成:首先从用户那里获得邮件地址和密码,然后从数据库载入&user&模型并检查密码是否匹配。&Operations 是 MOVE 模式中的行动者。它负责修改模型,在正确的时间显示正确的视图,以及响应由用户交互引发的事件。在一个分解良好的应用程序中,每个子操作都可以独立运行。&采用这种方式的操作有一点很令人振奋,即程序启动后,整个应用本身就可以被当作一个 Operations。它会根据需要生成尽可能多的子操作,其中每个子操作都并行地运行。当所有子操作都完成时,程序也便退出。&Views(视图)登陆页面即是一个视图,它负责显示一些文本框给用户。当用户点击&登陆&按钮时,视图将产生一个&loginAttempt&事件,其中包含用户输入的用户名和密码。&用户能够看到的内容,以及能感受到的互动都由视图提供支持。它们会以一种用户能理解的形式呈现应用反馈,同时还能将简单的用户交互转换成有意义的事件。更重要的是视图不会直接改变模型,它们只是向 Operations 发起事件,然后通过监听等待由模型发起的事件。&Events(事件)当用户登陆时,视图会发起&loginAttempt&事件。在登陆操作完成后,&currentUser&模型会发起一个事件通知应用登陆状态已改变。&事件监听让 MOVE(及 MVC)实现控制反转,允许模型更新视图。这是一种强大的抽象技巧,允许组件互不干扰地耦合在一起。&为什么是现在?当然,Conrad Irwin 并不想被人认为自己是在暗示 MVC 模式很差,这种大型应用程序架构在过去的几十年里确实非常成功。不过几十年后的今天,新的编程技术已经变得越来越流行,所以你也会在使用过程中逐渐产生一些疑惑。&MVC 模式确实很了不起,但它毕竟是几十年前为老的技术而设计。MOVE 模式是在其基础上的升级,让你可以更好地利用当前已有的新工具。
【Magicsky原创】php版获取文章摘要的函数
/**&* 获取文章摘要&* @author Magicsky&* @time &* @param string $text 被处理文本&* @param int $length 截取长度&* @return string&*/function getBrief($text,$length=55){// 替换html实体特殊符号$search = array('&','&','&','&', '&', '&',"\r\n","\n","\t");$replace = array('','[',']','&', '&', '&','','','');$brief = str_replace($search,$replace,strip_tags($text));&// 统计字符个数$j = 0; // 汉字计数器$k = 0; // 英文计数器for( $i=0; $i&strlen($brief); $i++ )&{& &if( ord(substr($brief, $i, 1))& 0xa0 )&& &{&& & & &$j++;& & & &$i++;& & & &$i++; // utf-8编码下,跳过两个字节;gb2312,则跳过一个字节即可& &}& &else $k++;& &if( $j+$k &= $length ) // 超出字数限制则跳出}&// 截取需要的长度return substr( trim($brief), 0, $i-2 ); // 去除尾部出现的汉字乱码(不满三个字符)};&Author By @
基于OpenCV的PHP图像人脸识别技术
本文所介绍的技术不是原创,而是从一个叫Robert Eisele的德国人那里学习来的。他写了一个PHP扩展openCV,只封装了两个函数,叫face_detect和face_count。openCV是一个开源的用C/C++开发的计算机图形图像库,非常强大,研究资料很齐全。本文重点是介绍如何使用php来调用其中的局部的功能。人脸侦查技术只是openCV一个应用分支。&1.安装&从源代码编译成一个动态的so文件。&1.1.安装 OpenCV (OpenCV 1.0.0)&下载地址:http://sourceforge.net/project/showfiles.php?group_id=22870&package_id=16948&#tar xvzf OpenCV-1.0.0.tar.gz&#cd opencv-1.0.0&#./configure&#make&#make install&#make check (检查是否安装全部正确)&提示: 不要指定安装路径,否则后面编译facedetect会找不到OpenCV的路径。&1.2 安装facedetect&下载地址http://www.xarg.org/download/facedetect-1.0.0.tar.gz&#tar xzvf facedetect-1.0.0.tar.gz&#cd facedetect-1.0.0&#phpize && ./configure && make && make install&编译完之后会提示facedetect.so 文件所在的位置。&最后确认在php.ini加入&extension=facedetect.so,重启apache.&2.函数使用&在phpinfo()里检查是否有facedetect这个模块。&从openCV源代码/data/haarcascades/里头取出所有xml文件放在php的执行目录下&//检查有多少个脸型&var_dump(face_count(&party.jpeg', haarcascade_frontalface_alt.xml'));&//返回脸型在图片中的位置参数,多个则返回数组&$arr = face_detect(&party.jpeg', haarcascade_frontalface_alt2.xml');&print_r($arr);&3.应用&结合imagick可以将图片做一下应用。因为 face_detect只返回一个矩形参数,包含x,y坐标和w,h长宽参数。下面是我的一个应用demo&&代码如下:&&?php&if($_FILES){&$img = $_FILES['pic']['tmp_name'];&$arr = face_detect($img, &haarcascade_frontalface_alt2.xml');&//$arr1 = face_detect($img, 'haarcascade_frontalface_alt_tree.xml');&if(is_array($arr1)) $all =array_merge($arr,$arr1);&else $all = $&$im = new Imagick($img);&//$draw =new ImagickDraw();&//$borderColor = new ImagickPixel('red');&//$draw-&setFillAlpha(0.0);&//$draw-&setStrokeColor ($borderColor);&//$draw-&setStrokeWidth (1);&if(is_array($all)){&foreach ($all as $v){&$im_cl = $im-&clone();&$im_cl-&cropImage($v['w'],$v['h'],$v['x'],$v['y']);&$im_cl-&swirlImage(60);&$im-&compositeImage( $im_cl, Imagick::COMPOSITE_OVER , $v['x'], $v['y'] );&//$draw-&rectangle($v['x'],$v['y'],$v['x']+$v['w'],$v['y']+$v['h']);&//$im-&drawimage($draw);&}&}&header( &Content-Type: image/png& );&echo $&}else{&?&&&meta http-equiv=&Content-Type& content=&text/ charset=utf-8&P /&&&form method=&POST& enctype=&multipart/form-data&&&人脸识别试验:只支持jpg,png&br&&上传一张图片 &input type=&file& name=&pic&&&&input type=&submit& value=&upload&&&&/form&&&?&}&?&&
Mysql memory的表和索引解析,很强大很好用哟~~~
基本内容:&MEMORY存储引擎用存在内存中的内容来创建表,每个内存表与一个物理文件关联,table_name.frm,创建格式举例:CREATE TABLE t (i INT) ENGINE = MEMORY;MEMORY表被存储在内存中,且默认使用哈希索引
当服务器关闭之时,所有存储在MEMORY表里的数据被丢失但表结构还在。&内存表的特点:1)参数max_heap_table_size,可以控制内存的大小2)服务器需要足够内存来维持所有在同一时间使用的MEMORY表3)空间被以小块来分配;动态分配insert hash值,不会过多分配空间;删除的行放到一个链接列表中,空间可以给新insert值重用4)如果你在一个有高度键重复的(许多索引条目包含同一个值)MEMORY表上有一个哈希索引,对影响键值的表的更新及所有删除都是明显地慢的。这个变慢的程度比例于重复的程度(或者反比于索引cardinality)。你可以使用一个B树索引来避免这个问题。5)MEMORY表在所有客户端之间共享&MEMORY表内容被存在内存中,内存是MEMORY表和服务器在查询处理之时的空闲中创建的内部表共享DELETE FROM或TRUNCATE TABLE或drop table可以释放memory表使用的内存(ERROR 1114 (HY000): The table 't_memory' is full)&当MySQL服务器启动时,可以使用--init-file选项初始化memory表数据对于m-s,当主服务器被关闭且重启动之时,主服务器的MEMORY表变空。可是从服务器意识不到这些表已经变空,所以从slave查询数据,就会返回过时的内容。&适用的场景:数据量不大且DML很多的表对于非索引列的更新,memory表的更新时间是myisam表的1/4。但是,对于索引列的更新(b列,非唯一索引),且索引结构是hash结构的,memory表的更新非常非常慢;对于500万数据量,myisam表会消耗5 min 34.58 sec,但memory表会在15分钟以上。对于memory表,在更新时尽量要使用唯一索引(主键/唯一键),这个速度很快;对于非唯一索引,建索引为btree结构,不要使用hash结构,否则更新速度会非常慢。 &
Apache绑定域名
&&& 有时候你需要一些顶级域名访问方式来访问你本地的项目文件而不是目录方式访问,这时候就需要配置虚拟主机,给你的目录绑定一个域名(本地的话可以通过修改 hosts 文件随便绑定什么域名比如
或者 localdemo)。现在假定你有两个目录,一个存在于 /xampp/htdocs/a,另一个存在于 /xampp/htdocs/b 。现在你想要在本地测试的时候访问
对应的目录是 /xampp/htdocs/a ,访问
对应的目录是 /xampp/htdocs/b 。懂得 Apache配置的其实就可以绕开了,因为 XAMPP 无非就是集成了 APache 之类的环境集成包,实现多域名也就是通过配置 Apache 实现的。
当然网上搜索到的方法很多,但是网上的信息都是转载来转载去的,有的方法我怀疑是否验证过是否正确都不知道。以下的方法是我亲测的,如果你按照我的配置还是无法实现本地多域名调试的话,可能是因为你的 XAMPP 的版本和我的不一致造成的。你可以在下面评论告知我,我会给你一一解答。以下配置针对的是XAMPP Windows 1.7.1 版本。
1、首先修改C盘WINDOWS\system32\drivers\etc目录下的 hosts 文件,用记事本打开,加入:127.0.0.1 127.0.0.1
2、打开xampp\apache\conf\httpd.conf文件,搜索 &Include conf/extra/httpd-vhosts.conf&,确保前面没有 # 注释符,也就是确保引入了 vhosts 虚拟主机配置文件。
开启了httpd-vhosts.conf,默认的httpd.conf默认配置失效(确保 httpd-vhosts.conf 文件里也开启了虚拟主机配置,见第3条),访问此IP的域名将全部指向 vhosts.conf 中的第一个虚拟主机。
3、在虚拟主机设置文件xampp\apache\conf\extra\httpd-vhosts.conf里设置:取消 NameVirtualHost *:80 前面的 ##,这样就启用了 vhosts.conf ,默认的httpd.conf默认配置失效。虚拟主机配置将只设置在 httpd-vhosts.conf 里。&VirtualHost *:80&DocumentRoot /xampp/htdocs/aServerName &/VirtualHost&
&VirtualHost *:80&DocumentRoot /xampp/htdocs/bServerName &/VirtualHost&
4、设置完了第3条之后,你会发现访问 localhost直接指向到设置的 a 那个路径去了,这个问题在第2条有讲。也就是开启了 vhosts后,默认的 httpd 的配置就会失效了,默认的访问就指向到 vhosts 里的第一条设置去了。这时候你要把 localhost的目录配置给设置回来。&VirtualHost *:80&DocumentRoot /xampp/htdocs/ServerName localhost&/VirtualHost&
至此,XAMPP 的虚拟主机设置完毕,现在 访问 localhost 还是原来的 XAMPP 的帮助指南,访问
将指向到绑定的 a 目录,访问
将指向到绑定的 b 目录。一般会出现&Forbidden&& You don't have permission to access \ on this server.
&Directory /&&&&& Options FollowSymLinks&&&& AllowOverride None&&&& Order deny,allow&&&& deny from all&&&& Satisfy all&/Directory&然后试着把deny from all中的deny改成了allow,保存后重起了apache,然后再一测试我的网页,哈哈!居然问题就出在这,访问测试网站完全正常了。
SSH Secure Shell Client中文乱码的解决方法
这是SSH Secure Shell Client多年未解决的短板,要求客户端和服务器端都要&UTF-8&编码,Windows中文版的编码是非UTF-8。zh_CN.UTF-8是UTF编码的中文语言环境。Windows使用的是GB2312编码,大多数linux系统支持的是UTF-8编码,而远程登陆时使用的是本地编码,所以会出现乱码的问题;现有几种解决方案:&方案一:修改linux服务器的环境变量使用linux,在用户根目录下有一个.bash_profile配置文件,该配置只对当前用户有效.若对所有的用户有效,修改/etc/profile文件使用ls -a命令可以查看到该文件.使用vi编辑器打开该文件后,在其中加入LANG=zh_CN.GB2312export LANG即可正常显示中文.更改.bash_profile配置文件后,该文件内容如下:# .bash_profile# Get the aliases and functionsif [ -f ~/.bashrc ]; then & & & &. ~/.bashrcfi# User specific environment and startup programsPATH=$PATH:$HOME/binLANG=zh_CN.GB2312export PATHexport LANGunset USERNAME&方案二:或使用其他远程登陆软件,并修改配置,将字符编码设置为UTF-8。PS:远程登陆软件 命令行界面putty,Cterm,SecureCRT,含FTP功能的有Filezilla,Secure Shell Client,图形界面的有Xming,XShell,Xmanager等下面以Putty和SecureCRT为例。修改SecureCRT设置:选项(Options)-&会话选项(Session Options)-&外观(Appearance)-&字符(Character),选择UTF-8。
putty选择配置窗口左边的Windows&& Translation,在右边的 Received data assumed to be in which character set 下拉列表中选择&UTF-8&
Linux 内存管理机制简介
  在中经常发现空闲很少,似乎所有的都被系统占用了,表面感觉是内存不够用了,其实不然。这是Linux内存管理的一个优秀特性,在这方面,区别于 Windows的内存管理。主要特点是,无论物理内存有多大,Linux 都将其充份利用,将一些程序调用过的数据读入内存,利用内存读写的高速特性来提高Linux系统的数据访问性能。而Windows 是只在需要内存时,才为应用程序分配内存,并不能充分利用大容量的内存空间。换句话说,每增加一些物理内存,Linux 都将能充分利用起来,发挥了硬件投资带来的好处,而Windows只将其做为摆设,即使增加8GB甚至更大。  Linux 的这一特性,主要是利用空闲的物理内存,划分出一部份空间,做为 cache 和 buffers ,以此提高数据访问性能。  1、什么是 cache ?  页高速缓存(cache)是 Linux内核实现的一种主要磁盘缓存。它主要用来减少对磁盘的I/O操作。具体地讲,是通过把磁盘中的数据缓存到物理内存中,把对磁盘的访问变为对物理内存的访问。  磁盘高速缓存的价值在于两个方面:第一,访问磁盘的速度要远远低于访问内存的速度,因此,从内存访问数据比从磁盘访问速度更快。第二,数据一旦被访问,就很有可能在短期内再次被访问到。  页高速缓存是由内存中的物理页组成的,缓存中每一页都对应着磁盘中的多个块。每当内核开始执行一个页I/O操作时(通常是对普通文件中页大小的块进行磁盘操作),首先会检查需要的数据是否在高速缓存中,如果在,那么内核就直接使用高速缓存中的数据,从而避免访问磁盘。  举个例子,当使用文本编辑器打开一个源程序文件时,该文件的数据就被调入内存。编辑该文件的过程中,越来越多的数据会相继被调入内存页。最后,当你编译它的时候,内核可以直接使用页高速缓存中的页,而不需要重新从磁盘读取该文件了。因为用户往往会反复读取或操作同一个文件,所以页高速缓存能减少大量的磁盘操作。  2、cache 如何更新?  由于页高速缓存的缓存作用,写操作实际上会被延迟。当页高速缓存中的数据比后台存储的数据更新时,那么该数据就被称做脏数据。在内存中累积起来的脏页最终必须被写回磁盘。在以下两种情况发生时,脏页被写回磁盘:  ◆当空闲内存低于一个特定的阈值时,内核必须将脏页写回磁盘,以便释放内存。  ◆当脏页在内存中驻留时间超过一个特定的阈值时,内核必须将超时的脏页写回磁盘,以确保脏页不会无限期地驻留在内存中。  在2.6内核中,由一群内核线程&pdflush后台回写例程统一执行两种工作。  首先,pdflush线程在系统中的空闲内存低于一个特定的阈值时,将脏页刷新回磁盘。该后台回写例程的目的在于在可用物理内存过低时,释放脏页以重新获得内存。特定的内存阈值可以通过dirty_background_ratio sysctl系统调用设置。当空闲内存比阈值:dirty_background_ratio还低时,内核便会调用函数wakeup_bdflush()唤醒一个pdflush线程,随后pdflush线程进一步调用函数background_wriout()开始将脏页写回磁盘。函数background_ writeout()需要一个长整型参数,该参数指定试图写回的页面数目。函数background_writeout()会连续地写出数据,直到满足以下两个条件:  ◆已经有指定的最小数目的页被写出到磁盘。  ◆空闲内存数已经回升,超过了阈值dirty_background_ratio。  上述条件确保了pdflush操作可以减轻系统中内存不足的压力。回写操作不会在达到这两个条件前停止,除非pdflush写回了所有的脏页,没有剩下的脏页可再被写回了。  为了满足第二个目标,pdflush后台例程会被周期性唤醒(和空闲内存是否过低无关),将那些在内存中驻留时间过长的脏页写出,确保内存中不会有长期存在的脏页。如果系统发生崩溃,由于内存处于混乱之中,所以那些在内存中还没来得及写回磁盘的脏页就会丢失,所以周期性同步页高速缓存和磁盘非常重要。在系统启动时,内核初始化一个,让它周期地唤醒pdflush线程,随后使其运行函数wb_kupdate()。
几个大型网站提供的IP API接口调用方法
腾讯的IP地址API接口地址:/ipaddress &新浪的IP地址查询接口:http://int..cn/iplookup/iplookup.php?format=js &新浪多地域测试方法:http://int..cn/iplookup/iplookup.php?format=js&ip=218.192.3.42 &搜狐IP地址查询接口(默认GBK):/cityjson &搜狐IP地址查询接口(可设置编码):/cityjson?ie=utf-8 &搜狐另外的IP地址查询接口:http://txt./ip/soip&
用微软Node.js:建立企业新的起跑线
  【IT168技术】如今,Javascript在前端开发领域占据主导地位,成为Web开发人员的首选语言。Node作为服务器端的JavaScript运行环境,帮助更多的人将技术延伸到后端系统。它具有无阻塞、事件驱动等特点,让熟悉JavaScript的开发者无需学习Java、C++等传统&后台&语言就可快速简便地创建服务器端应用。  关于如何用Node.js实现&Hello, World&,我相信大家已经见怪不怪了。然而,曾有人怀疑:初出茅庐的Node.js,其成熟和健壮程度是否足够应用于企业级的生产环境中?这也一直是技术社区关注的热点。令人欣喜的是,我们看到越来越多的企业开发者在实际应用中采用了Node相关技术,并给予了肯定。LinkedIn、沃尔玛和微软这样的大公司都对Node.js兴奋异常.大家是否知道背后的原因?  Node.js提供了一个强大的平台,可以用来构建企业级应用。从流程管理、利用多核计算、安全,到NoSQL数据库、信息队列,甚至是反向代理,Node.js全部能搞定。不仅如此,还有一个彻头彻尾的、基于云的开发环境,能提供丰富的调试和团队协作开发体验。除此之外,有很多云供应商都对部署Node.js应用提供全面支持。在本演讲中,我们将会看到Node真的开始起跑之后,能展现出多大潜力。  以下是精彩演讲:  您好!我来自微软,很高兴来到这里。我在上海待了一个月,在微软云平台上面工作。我的太太和我的家人,在上海一个礼拜学两次中文,每次学两个小时,一个礼拜学四个小时。学了那么多小时,今天终于鼓起勇气说给大家了。  Node.js是什么  我在负责Node.js团队,Node.js是我们的云平台,也在开展这个工作,Windows Azure,微软对Node.js非常感兴趣,这么多年来大力发展Node.js。今天不会像上课一样告诉大家Node.js是什么,我会很快的做一个介绍,实际上是一个平台能够用Java脚本做Windows应用,可以写非常完善的程序。Node.js的长处在于在服务器里面使用Java脚本。人们听到Java脚本,觉得很慢,我们用外部语言Java怎么够呢?当今的Java脚本跟四五年前不太一样了。比如说谷歌的、微软的,都可以把Java语言提升到新的台阶,而且充分利用。  大家会看到Node.js提出了一个没有任何阻断的IO模型。所写的代码不会阻断的。很多时候写一些应用可能会发送一个HTTP要求,在做HTTP呼叫的时候,中间做一些阻断,要发一个请求才会顺畅。在当今看到的很多语言都是一些多现成的执行,但是必须要把现有的拿出来用才行。如果同时发生阻断会把IO阻断的。Node.js可以用异步的方式看一下。没有多少API是异步的,我们这里异步。我们发出HTTP呼叫,不会出现阻断呼叫。每次呼叫有一个反呼叫发回来给我。  微软在这方面投了很多的资金,到底投了哪些资金呢?三年前刚刚发明了Node.js,在Linux的操作系统上,所使用的系统和Windows不一样的,有多少人跟Linux打交道?有多少人Windows打交道的?很少人。你们用的是什么呢?  Node.js一开始用的Linux系统上,用Windows不怎么样。但很多人在环境里面使用Windows,我喜欢Node.js,因为Node.js非常简单,占用空间小,而且速度非常快。因此,开始在Windows用Node.js。但是用的转换装置,用比较慢,在Windows上开发Node.js,无法把Node.js部署在Windows上,因为转换器太慢了。因为工作环境只有Windows。或者加上几个服务器来用用。  微软发现这个商机,现在很多客户想用Node.js,微软做了里程碑的事情,我们和开源社区开展合作,建立一个Node.js的核心团队,为Windows打造Node.js。PPT左边的图,Windows的安装器,成功将Node.js安装到上面。用开发的方式参加开源的项目从而成功。我们达到微软的Node.js,在Windows可以用的。我想在云端使用,我们又把Node.js带到云端,用开源的方式做的。  Node.js安装管理器,实际上就是一些模式化、模块化的东西,让你使用Windows Azure。如果是Node.js的环境里面就可以使用Windows Azure了。我们还提供了工具组件,无论在Windows还是非Windows系统里面都可以用Node.js。很少人知道,上面有很多的开源项目,有非常丰富的社区资源,而且中国有一个Node.js的社区,其中很多人淘宝的创始人,在北京、上海等其他地方的使用Node.js的用户群体。数量在不断增加,淘宝现在也在用Node.js。  Node.js确实引发了人们越来越多的兴趣。现在看到的图里面告诉我们客户对于Node.js的兴趣越来越高涨,这么多编程语言中和Java、PHP相比总量不高,但是对感兴趣的程度、增长的趋势来讲,Node.js远胜于主流的操作。  而这部分看到新的工作越来越多,呈爆发式增长。绿色的增长的非常快,目前在不同的网站上,通过Node.js做了不同的工作数量正在极速的攀升,Node.js呈爆发式增长的趋势,高增长引发人们一轮又一轮的使用热潮,确实非常吸引人。  而且使用Node.js的公司非常认真,非常看重Node.js。比如说有skype,微软收购了skype,我们和skype团队一起合作,在Node.js开发上也做了很多工作,微软不是简单帮助开发人员使用Node.js,自己也在用Node.js,充分利用了Node.js的产品帮助,实际上还能给我们其他的帮助。有些东西卖东西,像eBay也在用Node.js,还有Joyent等都提供微软服务,在云端用Node.js。接下来举一个案例,有Linkedin、沃尔玛。沃尔玛主要做零售、批发,在Node.js开发也开展了很多工作,雅虎也是一样。不是流行一阵子就没有了,如果看这么多列表、这么多公司。觉得麻烦是这些企业发展的时候,觉得扩展是大问题,所以才用Node.js。因为Node.js的扩展性非常出色,有效实现企业这方面的业务扩展。  现在看到的是我挑出使用Node.js公司的列表,对Node.js的网站,还有微机百科的主页,也列出了用Node.js公司的列表。比如说沃尔玛,我们用Node.js,用的非常好,很想告诉大家用很好,你们也来用,现在看到的列表是很小的公司。但是,接下来他们有37(英文),这个公司也会用Node.js,也会展示一下使用Node.js的项目跟大家分享。  And npm是Node.js包管理,需要很多的概念、需要很多的社区和支持。有很多人都做模块的存储,比如说(英文)知道吗?Java知道吗?Java有(英文)。npm实际上从刚才这些中吸取了很多的做法,是最好的模块化分装的工具。所以上网了解一下为什么有这么强大的威力,可以解决很多问题。因为用npm在同样的模块上用两个不同的版本,用统一个上面,不会崩溃。威力非常强大。如果有新的模块出来之后,可以尝试新的模块,跟之前的模块版本不同,必须要同时使用。所以,可以继续延用用的好的模块。  2011年有一个叫事件,在全世界有Node.js的活动,比如说在日本也做Node.js的大会。我们对Node.js的兴趣非常的浓厚,所以在全世界出席这种Node.js的会议和活动。像编写npm的人,2011年有1800个项目,明年大家想象不到有多少个数字,2012年一定会震惊,1.2万个。1800个项目,今年猛增到1.2万个项目。而并不是说应用的项目,而是一些资料库的项目,解决各种各样的问题项目。所以Node.js的挑战是我们想解决问题的时候,发现不是一两个,有时候可能50、100个,两个不同的模块来解决问题,这时候是一个挑战了,这个数字还是很惊人的,主动的数据包的作者,实际上是增长了5倍,达到730个。所以我们可以看到这个数字的增长是爆炸式的增长。&&  企业为什么使用Node.js  第一个是Linkedin,当他们发表一篇文章,是一个杂志上的访问文章时,(英文)在Linkedin移动团队,可能想象不到,有了Linkedin针对LOS的应用了,整个都是建立在Node.js上的,用很多服务器来支持。现在看到以前在LOS的版本。  现在看到的是我们的架构,Node.js的位置,可以看到我们的服务在不同的客户端,包括LOS、安卓等,他们都是一些消费者,有自己的API,基本上所做的是在中间这一层(英文),处理这些不同来源的指令,把它介入(英文)功能,这之间全部用Node.js来编写的。Node.js的扩展性非常好,用的对,IO如何频繁的操作就很适合用Node.js了。大部分的(英文)都会使用Node.js,因为我们之前用HOL(音)时,有很多的框架,有多少人用Java(英文)写客户端的代码?还是不少。  基本上Linkedin所做的把Node.js放在终端,有非常好的扩展性,从16个服务器削减到4个服务器,使服务器所需要的数量大大减少,也可以支持Linkedin的应用。另外一个原因,很适合IO的呼叫。实际上Node.js做得最好的,收到一个请求、发出一个呼叫,Linkedin不是只用一个Node.js,但是Node.js是策略的核心。Node.js是一个单线层的执行模式,怎么样扩展呢?为什么可以扩展?是因为当你做一个Node.js的呼叫时,把可以放权给IO系统,放权给应用系统,应用系统通过IO执行,这样的话可以处理大量数据的请求,因为把IO权限放在这一块。用Node.js的原因实际上不是因为数据分析,因为数据分析是一种数据块的分析能力,要进行复杂运算的功能,这不是Node.js所擅长的,可以把Node.js放在中间,有请求的时候,可以传给其他一些分析的过程,分析做出反应之后,可以进行处理。  另外,比(英文)有一个重大的性能提升,这是很关键的一点,希望能注意。因为听到新的事物时,首先要想到,这是玩具吗?对于Linkedin来说,他们发现是一个非常大的服务,可以支持数百万计的同步用户,这是我 为什么喜欢Linkedin的例子。  eBay发布了一个产品,也是用Node.js的,eBay的IO是把不同系统因为汇总,提供域的语言,有不同的服务器抽取信息,作为客户端不需要找服务去找这个信息,可以通过QL.IO提供这个信息。在中国也许我们没有太好的带宽,在中国带宽质量比较低,QL.IO就算这块IO不算好,但是可以发送一个请求,可以通过QL.IO进入不同的服务器检索。自己不用发多次的请求,而QL.IO把一次的请求到不同服务器查找。  现在看到的是易购的服务,是不同的,QL.IO进行检索。已经成为最流行的网页体验应用的工具了,这些非常流行。在这里可以看到S-1、S-2、S-3,分布在不同地方的服务器,但是QL.IO实际上就成为网关的形式。  现在看到的是我们一段代码,看上去是一个选择的(英文)的语句,但是并不是一个(英文)的查找,QL.IO是帮助我进行多点查找。选择Node.js的时候,第一个要点是扩展性,操作性是第二个特点。  今天如果使用Node.js的话,在Windows上面有一个单一可以操作的。单一执行文件可以连接到(英文)上,运行是一个单独的执行文件。我们觉得非常重要的一点是,他们可以密切的监控他们选择的哪种语言、哪种引擎是可以达到效果的。可以通过监控确保执行是有效的。而非常好的监控功能来看(英文)的运行。QL.IO能对信息处理进行监控。所以他们也会有一个非常低的IO的工作负载。有些客户延迟,但是对内存占用少的。(英文)是动态语言,希望能够开发一种敏捷的工具,动态语言的好处是不需要花很多的时间做这种类、编写。因为(英文)可以简单的变成一种对象进行使用。他们发现可以很快的进行重复,用(英文)和Node.js可以快速更迭使用。  刚开始使用Node.js的时候,Node.js太年轻了,如果撞墙怎么办?如果发现想做一些东西,但是Node.js没有能力做到。后来发现Node.js本身是一个很小的程序。在文件夹里面就可以了。这个模块系统可以把中间感觉到的差距填补,想做什么都可以帮你做好,看上去很简单,是一种非常好的方式,HTTP上一些复杂的高级方式来完成工作。  开发源级别的工作站里面,超过12万个动态连接,但是每个连接用了2K的内存,在服务器使用非常好。在服务器上使用不想占用太多的内存。所以简化的IO模型给公司带来很多的帮助。写了Node.js应用时,什么东西都不用担心,因为在同一个应用里面,不可能同时使用资源,不同的线程。可能有好几个不同Node.js在使用同样的资源,但是不会担心在应用里面,这些Node.js不同的线程会导致资源不足,最终运行不下去。刚才讲了QL.IO在eBay的情况。  沃尔玛是最大的在线商店,在网站上什么都可以买到,也有实体超市。沃尔玛也使用了Node.js,移动战略,让客户更好的通过移动设备来游览沃尔玛的主页,希望提供一些本地的应用及浏览器的应用,在设备上用的应用程序。这给了他们很大的投资回报。使用Node.js很快定制终端用户的体验,Node.js让他们很快、很轻易地部署他们的程序。还做了一件事情很吸引人,因为Node.js是用Java脚本写的,把客户断的Java脚本放在服务器上。  雅虎,用雅虎的网站,不用加很多额外的附加东西,直接用简单的编码就可以了。他们写了一次编码,用了不支持Java脚本的浏览器浏览,如果发现不支持的话,会在后端把编码转成HDL格式就可以了。写一个逻辑语言,放在上面,如果客户端不支持可以在后台做调整。  另外,Node.js可以直接帮助客户端,也可以帮助服务器,如果不会写Java脚本,有专门写Java的编程人员,拿回来用就可以了。  有些设备浏览器版本不是最新的,可能不支持,也可以帮助客户成功使用网站。原来在前端操作的,也可以改成后端,这也是雅虎所做的工作,非常接近。  Node.js的扩展能力太强了,沃尔玛有世界各地的用户,Node.js像关卡一样,有效的应对这么多要求,而且很好扩展发起IO呼叫,这对沃尔玛绝对是大幸事,把沃尔玛的服务都放在Node.js后端进行扩展。  下面看一看Turner公司,它是世界上最大的多媒体广播公司。Turner公司也在使用Node.js,现在看到的是他们用的代码,他们用API,也用了(英文)来做数据库。很有意思的是Turner公司用Node.js,不是很关注它的扩展能力。(英文)是我的朋友,他在Turner工作,使用Node.js打破陈规,进行颠覆式的思维方式。我和Turner公司交流之后,他们想颠覆传统方式,希望重头再来,用新的方式写应用。一个人站在毯子上,把毯子抽出来,跌倒重新开始。为什么?Node.js可以更好的帮助你解决问题。写出的应用程序能够更好的扩展,而且得到更好的支援。  很多的开发程序员写代码写的太多了,而且都是为了写代码而写代码。到底关注了什么呢?其实我们关注的并不是网络上的(英文),希望用简单的方式写编码,打破固定思维。  它们公司已经不是传统公司写应用,而是创业公司一样,行动非常快,编码很快写出来了,不是尽可能的耗时间,他们的部署也更加简单,因为Node.js有很好的Node.js包管理器。部署Node.js的应用,很大的应用部署在上面,非常简单。不需要很多的安装包什么的,很简单就可以放上去了。会发现他们的开发人员现在关注的是怎么样能够把工作做好就行,而不是像以前一样画蛇添足。  它们开始使用相关的模型之后,也更多的参与到关于Node.js的开源社区,帮助公司的人进一步巩固新的思维,用更敏捷的方式来建造这些模型。更快的写应用程序,更快的获得反馈,这也是开源社区给它的一大帮助。Node.js获得了很大公司,在Turner公司取得的成功是另外的成功。  Linkedin、微软、eBay、沃尔玛、Turner,他们都在分享在Node.js里面用的东西,大家可以去(英文)等都可以分享到具体的应用。微软公司不仅仅让他们使用,而且通过分享让Node.js更加流行有更好的势头。可能你会说你是小公司,没有那么多资金做这些工作,可以让沃尔玛分享一些给你,自己拿回去试试。&&  走进Node.js世界,怎么写Node.js应用  首先,Node.js吸引人的地方,不需要一个开发人员的环境,一个Java脚本就可以,用文本编辑器就可以了。我在这里写infoq shenzhen,建立子目录,生成一个文件叫(英文),会编辑一下文件,加一些内容。很简单的文本编辑器,(英文)好处在于可以(英文)高量处理和完成处理。可以写一个Java的应用,在不同服务器里使用,满足HTTP的请求,如果不能满足HTTP的请求可以用(英文)。下面花一段时间,写一个非常小的编码。  首先,进入Node.js提供的HTTP的功能,要求功能,给HTTP,有了HTTP对象之后,可以生成一个web服务器,这是世界化的IO模型,会阻断。IO在倾听要求时,中间没有任何阻断了,既然发出了要求,会给我一个反馈。反馈需要两个参数,一个是要求,一个是反应,这两个参数都有的话,会给你一个反馈。  我在(英文)的时候,写出(英文),会写出&您好,InfoQ深圳&,接下来要做HTTP的服务器,要倾听、监听某一个端口。80端口,是对外的端口。我用listen的命令写出干庭的方法和端口。服务器已经开始监听了,接下来写(英文),在Java当中不需要作为服务器监听。如果只做浏览器的话,可能是对我来说,可能多个(英文),跟操作系统进行集成、呼叫、发出指令。浏览器在沙盘当中,希望进入整个系统,不仅仅是沙盒,需要API的软件,做非常丰富的操作,真正充分的发挥我这台机器的功能。写入&3000端口上运行的服务器&。  这就是一个很简单的外服务器了这时就可以运行我们的(英文)。这是单一的文件,放在一个文件夹里,这里是(英文),要运行(英文)。上面有一个服务器运行在端口3000。打开浏览器看一下接入服务器。有多少人能够三四行代码就写一个服务器出来呢?如果不用Node.js的话,有谁能够几行代码做一个服务器呢?我们有一个很好的模型,可以写网页、服务器,用很小的代码。其他方法也很简单,但是扩展性不是很好。我可以用几句代码可以充分做出服务器功能的。  我是讲得很简单、很基本的Node.js,Node.js还有很多数据包的管理工具,现在看一下其他的数据包的工具。  npm,我们讲了Node.js(英文)是一个Node.js的管理器,可以给我们储存一个(英文),可以储存当地的(英文),也可以储存命令行的工具。刚才写了很简单的一个服务器,但是我自己还是要管理所有的功能。一般来说,并不好玩,如果用全方位的功能,可以用(英文),不需要担心要去处理所有的请求,有一些模板引擎。Node.js也可以提供同样的功能,还可以使用express的模块,可以帮你很快的做出一些Web的应用。  首先,安装express,到了npm的注册表,这就是Node Packaged的管理器,有1.3万个Packaged,其中有一个是Azure的模块,我们团队正在研究的。(英文)模块互相连接的,通过一个(英文)的文件,安装了express,是一个脚手架的工具,很快搭建应用。express就是用Node.js来编写的,所以脚手架工具就是Node.js的了,我呼叫express,就可以运行了。运行时出现了错误,为什么呢?我并没有这个模块,为什么没有这个模块,刚才安装了express为什么没有模块呢?安装模块到Node.js有两个方法,要么有命令行的工具,在本地(英文)给我们做新的模块文件夹,Java(英文)有一些模块可以用Node.js,有些做不到的。Java(英文)的(英文)可以进行扩展。所以,有一些原生的Windows模块,大部分是Java的模块。  下面看一下脚手架工具的作用,给我生成的(英文)的文件,说明现在运行在哪几个模块上,可以帮助你说明现在运用于哪几个模块,也取决于jade,可以帮我做出文件的渲染,给我了一个(英文)的文件,但是我现在还没有模块,没有安装必要的模块。所以只需要做(英文)的安装。当我做了(英文)的安装之后,自动会帮我看一下到(英文)的文件。到(英文)的文件当中把所有依赖的模块都提炼出来了。  所以我觉得Node.js跟其他相比做得很好的一点,其他的做法可以延引这些模块,但是都是本地的模块。这里可以取出很多不同的模块,也拉入了jade,其他的模块有自己的Node.js的模块文件夹,可以帮助你让不同的模块放入不同的文件夹结构当中。这样的话内容的丰富,比如说A和B的模块他们都可能有不同的版本,一个是放入本地文件的,但是可以同时使用不同的模块。现在做了之后,应用不行了。比如说现在做一个(英文),正在监听3000端口。  欢迎到Express,这跟我之前很相似,express带来什么功能呢?express本身有一个路由引擎,可以帮助我看到不管你在什么地方来做的请求,可以把路由到Java的功能,有非常高的路由,可以设定一些模板,在不同的ULO当中,比如说(英文)也可以在当中进入路由。另外中间件可以帮我们做(英文)。比如说我们有一些favicon或者(英文)的贴纸,可以从主体当中提取出来放入Java的功能。另外有模板的功能,可以把它转变成为(英文)。比如说这里有一个(英文)的对象,呼叫渲染(英文),改成深圳架构师峰会。再运行一次,只需要写(英文),就可以做出非常好的功能。  有些非常多不同的模块供大家使用,我称之为Node.js工具包,其中一个是1.3万个不同模块供你使用,还有很多不同的产品,其中一个文件的编辑器,文件编辑器是全功能的,而且大家可以做(英文)文本的编辑器。在工具包当中还有什么样的工具呢?加起来可能没有1.3万个模块,是其中一小部分,是比较重要的工具。有213个web的框架,为什么有200多个不同的框架,因为有数以百万计的程序员,如果要的没有,自己编写一个web的框架,编写之后发布出来。这样可以看到有些模块在工具包当中。而且Node.js有测试框架。  在(英文)有75个项目,都是放在(英文)里面的。有些是企业级的,可以拿出来做企业的应用。现在是一个BDB方式的测试。(英文)中间件在不同的请求间使用的。现在看到的正文主体就是用(英文)。如果在安全、登陆方面做更复杂、更高级就可以用这个。  模板引擎,是一个不同类型的(英文),可以选择有时候用(英文),也可以用(英文),既然是模板可以灵活的选择,能给你做(英文),在浏览器上实时的web沟通。看模块很有意思的,要做一个Node.js的应用要做数据库对话的话,必须在Node.js进行驱动,(英文)。最近微软也刚刚建立了一个Node.js的(英文)驱动。如果想在环境里面使用Node.js的话,可以用它。还有(英文)负责高速缓存的。  我们有一个发展非常完善的开发环境,叫做(英文),是一个开发基地,本身完全用Node.js写出来的,在浏览器里面,编写Node.js的应用,可以对它进行调试。主要用浏览器就可以进行编写和发布。大家可以回去自己看一下。  刚才花了一点时间看了Node.js的演进过程,有些大公司把Node.js以非常认真的态度应用。另外,我们在Node.js的工具箱里面展示工具,建立自己的Node.js。
李彦宏:给青年创业者的7大建议
当年李彦宏在美国抛弃唾手可得的博士帽,艰苦创业的时候,美国IT界最火的是电子商务。无数人拼了老命想要挤上这辆被看好的网络列车,甚至不惜抛掉自己熟悉的行业。
第一招:向前看两年
当年李彦宏在美国抛弃唾手可得的博士帽,艰苦创业的时候,美国IT界最火的是电子商务。无数人拼了老命想要挤上这辆被看好的网络列车,甚至不惜抛掉自己熟悉的行业。
李彦宏没有跟随大流进入电子商务领域,而是悄悄走到了尚少有人问津的网络搜索领域。因为他看到了搜索对网络世界可能产生的巨大影响。
李彦宏告诫跃跃欲试的年轻人:一定要有向前看两年的眼光。跟风、赶潮流,你吃到的很可能只是残羹冷饭。
第二招:少许诺,多兑现
&&&这个项目多久可以完成?&
&&&6个月。&
&&&4个月行吗?给你加50%的报酬。&
&&&对不起,我做不到。&
这是在李彦宏创业之初和一个客户的一次对话。后来,这个客户告诉他,对于李彦宏的拒绝,他感到非常满意,因为这反映出李彦宏是一个很真实和稳重的人,这样他的产品在质量上一定会有保证的。
第三招:不需要钱的时候借钱
在创业过程中,&有钱走遍天下,无钱寸步难行&是颠扑不破的真理。在美国硅谷里,每天都有公司因为有了风险投资而开山立派,每天也都有公司因为囊中羞涩而关门大吉。李彦宏认为,一定要在不需要钱的时候去向投资人寻求投资。
用一年的时间来做半年的事情,这是李彦宏的风格。他认为,这样可以保证有一半的钱仍然在自己的掌握当中。在这样的情况下去向投资人借钱,你就会立于不败之地。因为&就算借不到,我的公司也不会马上垮掉&。
在这种情况下,新创业的公司在寻求投资的时候才能表现得像个爷们,才能够与投资人以平等的身份来切磋具体事项。而投资人看到公司的经济状况良好,也就认为公司运作不错,便会很乐意进行投资了。
&不要轻易将主动权交给投资人,在创业的过程中没有人会乐善好施。&李彦宏告诫创业的青年人,&一定要在尚不缺钱的时候借到下一步需要的钱。&
第四招:分散客户
在创业的初期,创业者常常会因为有了一两个固定的大用户而偷笑不止。&或许不久就是想哭都哭不出来啊。&李彦宏这样说。
他刚回国创业的时候,公司主要是服务于几大门户网站。这几大网站都占据了公司收入的10%以上,任何一个客户的流失,都会对公司的效益造成极大的影响。
&命运只能掌握在自己手中,绝不能操纵在别人手中。&
第五招:专注自己的领域
从1999年公司成立到现在,4年的时间里,互联网世界沧海桑田,&网络游戏&&短信平台&纷纷强势登场,不少人捷足先登,赚得盆满钵溢;不少人跟风而动,也摔得头破血流。而李彦宏说他只在做一件事:搜索。
他说不少人曾鼓动他向网络游戏、短信等领域涉足,但李彦宏并没有这样做。在他眼里,自己的公司,自己的领域还有很深的潜力可以挖掘,自己目前要做的只是将搜索这一个领域不断翻新。
&在今后的若干年,百度也将只在搜索领域发展。&李彦宏如是说。
第六招:保持激情
一个创新的过程,绝对不是一个一帆风顺的过程。如果没有足够的热爱和激情,创业者将是很难坚持下去了。所以,李彦宏对青年创业者们说,先确保你对这个事业的热爱和激情,然后再创业吧。
&我选择放弃博士学位来进行创业,并不是为了钱,而是真的出于对这个行业的热爱。同时,我也并非完全不考虑钱的因素,但我始终坚信:在今天的社会中,只要你给了社会好的产品,社会一定会给你更多的回报。&
第七招:不要过早地追求赢利
过早地实现赢利就是在大量地缩减对技术的投入。
李彦宏认为,一个创新的公司,在技术上一定需要大规模的投入。这样才能使自己在技术上一直处于领先甚至于垄断的地位。而这种领先在今后一定会带给企业大的回报。牺牲企业的长远利益宣布赢利,是不理智的行为。&
SVN修改用户名与密码
由于在svn的界面中并没有为我们提供直接更换用户名密码的地方,所以一旦我们需要更换用户名的就需要自己想一些办法。&
&&& 解决方案如下:&
在Eclipse使用SVN的过程中大多数人往往习惯把访问SVN的用户名密码自动保存起来&
以便下次自动使用,不要再次手工输入,但是有些时候需要变更密码或者用户名,&
这时候怎么办?在网上查找后发现如下方法:&
1. 查看你的Eclipse中使用的是什么SVN Interface&
windows & preference & Team & SVN #SVN Interface&
2. 如果是用的JavaHL, 找到以下目录并删除auth目录下的文件.&
C:"Documents and Settings"[YourUserName]"Application Data"Subversion"&
3. 如果你用的SVNKit, 找到以下目录并删除.keyring文件.&
[eclipse]"configuration"org.eclipse.core.runtime&
&&& 主要有两种方法,一种是删除SVN客户端的账号配置文件;另外一种就是去SVN服务端将账号设置成不可用。&
&&& 具体步骤:&
&&& 1、通过删除SVN客户端的账号配置文件&
&&& (1)找到我们使用的客户端配置文件,在window xp下面他们的位置在系统盘的 Documents and Settings\alex\Application Data\Subversion\auth\文件夹中,把里面的所有文件删除。&
&&& (2)使用SVN更新或提交,使得客户端与服务端进行通讯,这样就会SVN客户端就要求我们输入新的用户名密码,输入我们的用户名密码就可以替换掉旧的用户名密码。&
&&& 2、通过修改SVN服务端账号配置文件,这部分需要SVN的管理员配合&
&&& (1)找到服务端账号配置文件,这个文件位于SVN服务器的安装路径 config文件夹,打开并编辑passwd文件,删除或注释需要被替换的账号&
&&& (2)在客户端使用SVN更新或提交,使得客户端与服务端进行通讯,这样就会SVN客户端就要求我们输入新的用户名密码,输入我们的用户名密码就可以替换掉旧的用户名密码。&
最近辛苦了一阵子的作品,望大家多提提意见
提高PHP运行速度的几大方法
摘要:&一般情况下,PHP总是具有足够的速度支持Web内容动态生成,许多时候甚至无法找出比它更快的方法。然而,当面对庞大的访问量、高负荷的应用、有限的带宽....&
使用PHP的最大1个优势就是速度快。一般情况下,PHP总是具有足够的速度支持Web内容动态生成,许多时候甚至无法找出比它更快的方法。然而,当面对庞大的访问量、高负荷的应用、有限的带宽,以及其他各种带来性能瓶颈的因素时,就需要考虑怎样提高PHP的性能了。
1、代码优化
代码优化不仅仅是写出干净和清晰的代码,而是对代码进行一定的简化。可以使用Zend Optimizer来自动帮助完成这些繁杂的工作。Zend Optimizer可以从Zend Technologies的网站/免费得到,但必须同意它的许可约定,因为它不是以GPL方式发行的。它的原理很简单,即通过检测Zend引擎产生的中间代码,并对它进行优化,从而获得更高的执行速度。
在使用了Zend Optimizer后,复杂的PHP源程序的执行效率马上会得到显着提高,缺点是优化后的代码可读性下降,给代码修改带来困难。
Zend Optimizer的安装方法非常简单,只要根据用户使用的平台,下载相关的预编译版本,把下面2行代码加入到php.ini文件中,重新启动Web 服务器就行了:
zend_optimizer.optimization_level=15
zend_extension=&P/path/to/ZendOptimizer.so&P
zend_loader.enable=Off
额外增加的第三行代码是可选的,因为禁用zend_loader将会使优化速度更快。需要注意的是,只有在不使用Zend Encoder Runtime的时候,才可以禁用zend_loader。
2、使用缓存
如果PHP程序的规模很大,那么提高速度的办法就是使用缓存。现在已经有许多缓存方案可供选择,其中包括Zend Cache、APC和Afterburner Cache。
上面这几种都是&缓存模块&(caching modules)。第一次调用PHP文件时,缓存模块从PHP源代码生成一些中间代码,并把这些中间代码存储在Web服务器的内存中。以后再调用这些文件时,就可以直接使用内存中&编译&过的代码。这种方法确实能够改善应用的性能,因为它使得磁盘访问量减低到了最少的程度(代码已经读取和解析),代码直接在内存中运行,使得服务器响应请求的速度大大提高。
当然,缓存模块还会监视PHP源文件的变化,必要时会重新缓存页面,从而防止用户得到的页面仍旧由过时的PHP代码生成。由于缓存模块能够明显地降低服务器的负载,提高PHP应用的响应效率,因此它们非常适合于负载较大的网站使用。
Zend Cache是Zend Technologies公司开发的商业软件。在第一次运行后,PHP页面的运行速度立刻会有很大的提高,服务器的空闲资源也更多了。缺点是它不是免费的,但性价比还是很高的。
Afterburner Cache是Bware Technologies公司开发的免费缓存模块。功能与Zend Cache基本一样,但提高性能方面比不上Zend Cache。
APC(Alternative PHP Cache)是由Community Connect公司开发的另一种免费缓存模块,目前版本是2.0.4,可以从http://pecl.php.net/package/APC获得。对于产品应用来说,它的性能很稳定,而且也能在很大程度上提高响应请求的速度。
3、压缩网页内容
影响站点的访问速度还有1个重要因素,那就是下载速度。解决的办法就是压缩网页内容。对于纯文本内容而言,HTTP压缩技术可压缩至原大小的40%以下,从而提供60%以上的数据传输节约。虽然Web服务器会因为压缩导致CPU占用的略微上升,但可以节约大量用于传输的网络IO。
根据IETF规范,大部分浏览器都支持使用gzip压缩算法进行内容压缩。也就是说,可以先用gzip压缩网页内容,然后发送到客户端浏览器,浏览器在接收的时候会自动解压数据,再显示页面。这个过程对用户来说,是完全透明的。同样,压缩Web页面的内容也有不同的方法。
Mod_gzip是1种开放源代码的、标准的Apache模块,也叫互联网内容加速模块。可以将它和Apache一起编译,也可以作为DSO使用。相对于普通的浏览过程,它可以节省40%左右的流量。Mod_gzip不仅可以压缩静态的内容,如HTML、XML,而且对动态生成的,包括SQL、Java、WML、VRML等产生的内容,在服务器端进行实时压缩并传输,其压缩效率惊人,一般都为60%~85%。
压缩动态网页的内容,还可以使用class.gzip来对。php文件编码,class.gzip通过在PHP脚本的开头和结尾调用它的一些函数来压缩网页内容。如果整个站点都需要这样的压缩,可以在php.ini文件中的auto_prepend和auto_append中调用这些函数,但是会占用一定的系统开销。
PHP4.0.4推出了1种新的输出缓冲的处理手段&ob_gzhandler,它的作用和class.gzip完全一样,区别是可以直接把它加到php.ini 文件中,语法如下:
output_handler = ob_
这样将激活PHP的输出缓冲功能,并在发送内容前进行压缩。如果不想在这里设置,只在需要的地方才改变这个默认设置(不压缩),只要在需要压缩的PHP源程序目录中,修改一下。htaccess文件就行了,语法如下:
php_value output_handler ob_gzhandler
或者直接在PHP代码中调用它:
ob_start("ob_gzhandler");
输出缓冲的效果确实很理想,并且不会为服务器带来额外的系统开销。要注意的一点是Netscape Communicator不支持图像的压缩。因此除非知道访问者都使用Internet Explorer,否则必须禁止压缩jpeg和gif图象。
4 其它技巧
在编程时,使用一些小技巧也可以加快PHP的运行速度:
(1)用i+=1代替i=i+1,既符合c/c++的习惯,效率相对还更高。
(2)尽可能使用PHP内部函数。
(3)能使用单引号字符串时,尽量使用单引号字符串。单引号字符串的效率要高于双引号字符串。
(4)用foreach代替while遍历数组,foreach的效率明显高于while循环,而且不需要调用reset函数。
Forbidden You don't have permission to access ... on this server的解决方案
最近好多人又问了这个问题,下面是要注意的事项和检测步骤:&
1、查看服务器80端口是否启动
Windows平台
& & & 在windows命令行窗口下执行:C:\&netstat -aon|findstr "80"
& & & 开始终端输入:netstat -tln
显示如: TCP && 127.0.0.1:80 & & & & 0.0.0.0:0 & & & & & && LISTENING & & & 2448 ,则表示开启&
如果发现端口没有被启用,则需要关闭防火墙
在windows中的cmd运行: netsh advfirewall set currentprofile state off
在linux中的终端中运行:/etc/init.d/iptable stop&&
2、设置根目录文件夹的访问权限&windows中找到根目录文件夹:& & & 右击&&属性&&安全&&增加用户&&查找用户,& & & 将everyone添加到权限组里面去linux中运行chown和chmod命令来设置权限和用户组
PHP 序列化(serialize)格式详解
由 andot 写的非常经典介绍PHP序列化的文章,原文来自: /?p=170
1.前言PHP (从 PHP 3.05 开始)为保存对象提供了一组序列化和反序列化的函数:serialize、unserialize。不过在 PHP 手册中对这两个函数的说明仅限于如何使用,而对序列化结果的格式却没做任何说明。因此,这对在其他语言中实现 PHP 方式的序列化来说,就比较麻烦了。虽然以前也搜集了一些其他语言实现的 PHP 序列化的程序,不过这些实现都不完全,当序列化或反序列化一些比较复杂的对象时,就会出错了。于是我决定写一份关于 PHP 序列化格式详解的文档(也就是这一篇文档),以便在编写其他语言实现的 php 序列化程序时能有一个比较完整的参考。这篇文章中所写的内容是我通过编写程序测试和阅读 PHP 源代码得到的,所以,我不能 100% 保证所有的内容都是正确的,不过我会尽量保证我所写下的内容的正确性,对于我还不太清楚的地方,我会在文中明确指出,也希望大家能够给予补充和完善。
2.概述PHP 序列化后的内容是简单的文本格式,但是对字母大小写和空白(空格、回车、换行等)敏感,而且字符串是按照字节(或者说是 8 位的字符)计算的,因此,更合适的说法是 PHP 序列化后的内容是字节流格式。因此用其他语言实现时,如果所实现的语言中的字符串不是字节储存格式,而是 Unicode 储存格式的话,序列化后的内容不适合保存为字符串,而应保存为字节流对象或者字节数组,否则在与 PHP 进行数据交换时会产生错误。
PHP 对不同类型的数据用不同的字母进行标示,Yahoo 开发网站提供的 Using Serialized PHP with Yahoo! Web Services 一文中给出所有的字母标示及其含义:
a - arrayb - booleand - doublei - integero - common objectr - references - stringC - custom objectO - classN - nullR - pointer referenceU - unicode stringN 表示的是 NULL,而 b、d、i、s 表示的是四种标量类型,目前其它语言所实现的 PHP 序列化程序基本上都实现了对这些类型的序列化和反序列化,不过有一些实现中对 s (字符串)的实现存在问题。
a、O 属于最常用的复合类型,大部分其他语言的实现都很好的实现了对 a 的序列化和反序列化,但对 O 只实现了 PHP4 中对象序列化格式,而没有提供对 PHP 5 中扩展的对象序列化格式的支持。
r、R 分别表示对象引用和指针引用,这两个也比较有用,在序列化比较复杂的数组和对象时就会产生带有这两个标示的数据,后面我们将详细讲解这两个标示,目前这两个标示尚没有发现有其他语言的实现。
C 是 PHP5 中引入的,它表示自定义的对象序列化方式,尽管这对于其它语言来说是没有必要实现的,因为很少会用到它,但是后面还是会对它进行详细讲解的。
U 是 PHP6 中才引入的,它表示 Unicode 编码的字符串。因为 PHP6 中提供了 Unicode 方式保存字符串的能力,因此它提供了这种序列化字符串的格式,不过这个类型 PHP5、PHP4 都不支持,而这两个版本目前是主流,因此在其它语言实现该类型时,不推荐用它来进行序列化,不过可以实现它的反序列化过程。在后面我也会对它的格式进行说明。
最后还有一个 o,这也是我唯一还没弄清楚的一个数据类型标示。这个标示在 PHP3 中被引入用来序列化对象,但是到了 PHP4 以后就被 O 取代了。在 PHP3 的源代码中可以看到对 o 的序列化和反序列化与数组 a 基本上是一样的。但是在 PHP4、PHP5 和 PHP6 的源代码中序列化部分里都找不到它的影子,但是在这几个版本的反序列化程序源代码中却都有对它的处理,不过把它处理成什么我还没弄清楚。因此对它暂时不再作更多说明了。
3.NULL 和标量类型的序列化NULL 和标量类型的序列化是最简单的,也是构成符合类型序列化的基础。这部分内容相信许多 PHP 开发者都已经熟知。如果您感觉已经掌握了这部分内容,可以直接跳过这一章。
3.1.NULL 的序列化在 PHP 中,NULL 被序列化为:
N;3.2.boolean 型数据的序列化boolean 型数据被序列化为:
b:&digit&;其中 &digit& 为 0 或 1,当 boolean 型数据为 false 时,&digit& 为 0,否则为 1。
3.3.integer 型数据的序列化integer 型数据(整数)被序列化为:
i:&number&;其中 &number& 为一个整型数,范围为:- 到 。数字前可以有正负号,如果被序列化的数字超过这个范围,则会被序列化为浮点数类型而不是整型。如果序列化后的数字超过这个范围(PHP 本身序列化时不会发生这个问题),则反序列化时,将不会返回期望的数值。
3.4.double 型数据的序列化double 型数据(浮点数)被序列化为:
d:&number&;其中 &number& 为一个浮点数,其范围与 PHP 中浮点数的范围一样。可以表示成整数形式、浮点数形式和科学技术法形式。如果序列化后的数字范围超过 PHP 能表示的最大值,则反序列化时返回无穷大(INF),如果序列化后的数字范围超过 PHP 所能表示的最小精度,则反序列化时返回 0。
3.5.string 型数据的序列化string 型数据(字符串)被序列化为:
s:&length&:"&value&";其中 &length& 是 &value& 的长度,&length& 是非负整数,数字前可以带有正号(+)。&value& 为字符串值,这里的每个字符都是单字节字符,其范围与 ASCII 码的 0 - 255 的字符相对应。每个字符都表示原字符含义,没有转义字符,&value& 两边的引号("")是必须的,但不计算在 &length& 当中。这里的 &value& 相当于一个字节流,而 &length& 是这个字节流的字节个数。
4.简单复合类型的序列化PHP 中的复合类型有数组(array)和对象(object)两种,本章主要介绍在简单情况下这两种类型数据的序列化格式。关于嵌套定义的复合类型和自定义序列化方式的对象的序列化格式将在后面的章节详细讨论。
4.1.数组的序列化数组(array)通常被序列化为:
a:&n&:{&key 1&&value 1&&key 2&&value 2&...&key n&&value n&}其中 &n& 表示数组元素的个数,&key 1&、&key 2&&&&key n& 表示数组下标,&value 1&、&value 2&&&&value n& 表示与下标相对应的数组元素的值。
下标的类型只能是整型或者字符串型,序列化后的格式跟整型和字符串型数据序列化后的格式相同。
数组元素值可以是任意类型,其序列化后的格式与其所对应的类型序列化后的格式相同。
4.2.对象的序列化对象(object)通常被序列化为:
O:&length&:"&class name&":&n&:{&field name 1&&field value 1&&field name 2&&field value 2&...&field name n&&field value n&}其中 &length& 表示对象的类名 &class name& 的字符串长度。&n& 表示对象中的字段1个数。这些字段包括在对象所在类及其祖先类中用 var、public、protected 和 private 声明的字段,但是不包括 static 和 const 声明的静态字段。也就是说只有实例(instance)字段。
&filed name 1&、&filed name 2&&&&filed name n&表示每个字段的字段名,而 &filed value 1&、&filed value 2&&&&filed value n& 则表示与字段名所对应的字段值。
字段名是字符串型,序列化后格式与字符串型数据序列化后的格式相同。
字段值可以是任意类型,其序列化后的格式与其所对应的类型序列化后的格式相同。
但字段名的序列化与它们声明的可见性是有关的,下面重点讨论一下关于字段名的序列化。
4.3.对象字段名的序列化var 和 public 声明的字段都是公共字段,因此它们的字段名的序列化格式是相同的。公共字段的字段名按照声明时的字段名进行序列化,但序列化后的字段名中不包括声明时的变量前缀符号 $。
protected 声明的字段为保护字段,在所声明的类和该类的子类中可见,但在该类的对象实例中不可见。因此保护字段的字段名在序列化时,字段名前面会加上
\0*\0的前缀。这里的 \0 表示 ASCII 码为 0 的字符,而不是 \0 组合。
private 声明的字段为私有字段,只在所声明的类中可见,在该类的子类和该类的对象实例中均不可见。因此私有字段的字段名在序列化时,字段名前面会加上
\0&declared class name&\0的前缀。这里 &declared class name& 表示的是声明该私有字段的类的类名,而不是被序列化的对象的类名。因为声明该私有字段的类不一定是被序列化的对象的类,而有可能是它的祖先类。
字段名被作为字符串序列化时,字符串值中包括根据其可见性所加的前缀。字符串长度也包括所加前缀的长度。其中 \0 字符也是计算长度的。
--------------------------------------------------------------------------------
1注:在 PHP 手册中,字段被称为属性,而实际上,在 PHP 5 中引入的用 __set、__get 来定义的对象成员更适合叫做属性。因为用 __set、__get 来定义的对象成员与其它语言中的属性的行为是一致,而 PHP 手册中所说的属性实际上在其他语言中(例如:C#)中被称为字段,为了避免混淆,这里也成为字段,而不是属性。
5.嵌套复合类型的序列化上一章讨论了简单的复合类型的序列化,大家会发现对于简单的数组和对象其实也很容易。但是如果遇到自己包含自己或者 A 包含 B,B 又包含 A 这类的对象或数组时,PHP 又该如何序列化这种对象和数组呢?本章我们就来讨论这种情况下的序列化形式。
5.1.对象引用和指针引用在 PHP 中,标量类型数据是值传递的,而复合类型数据(对象和数组)是引用传递的。但是复合类型数据的引用传递和用 & 符号明确指定的引用传递是有区别的,前者的引用传递是对象引用,而后者是指针引用。
在解释对象引用和指针引用之前,先让我们看几个例子。
&?phpecho "&pre&";class SampleClass {&&& var $}$a = new SampleClass();$a-&value = $a;&$b = new SampleClass();$b-&value = &$b;&echo serialize($a);echo "\n";echo serialize($b);echo "\n";echo "&/pre&";?&这个例子的输出结果是这样的:
O:11:"SampleClass":1:{s:5:"value";r:1;}O:11:"SampleClass":1:{s:5:"value";R:1;}大家会发现,这里变量 $a 的 value 字段的值被序列化成了 r:1,而 $b 的 value 字段的值被序列化成了 R:1。
但是对象引用和指针引用到底有什么区别呢?
大家可以看下面这个例子:
echo "&pre&";class SampleClass {&&& var $}$a = new SampleClass();$a-&value = $a;&$b = new SampleClass();$b-&value = &$b;&$a-&value = 1;$b-&value = 1;&var_dump($a);var_dump($b);echo "&/pre&";大家会发现,运行结果也许出乎你的预料:
object(SampleClass)#1 (1) {& ["value"]=&& int(1)}int(1)改变 $a-&value 的值仅仅是改变了 $a-&value 的值,而改变 $b-&value 的值却改变了 $b 本身,这就是对象引用和指针引用的区别。
不过很不幸的是,PHP 对数组的序列化犯了一个错误,虽然数组本身在传递时也是对象引用传递,但是在序列化时,PHP 似乎忘记了这一点,看下面的例子:
echo "&pre&";$a = array();$a[1] = 1;$a["value"] = $a;&echo $a["value"]["value"][1];echo "\n";$a = unserialize(serialize($a));echo $a["value"]["value"][1];echo "&/pre&";结果是:
1大家会发现,将原数组序列化再反序列化后,数组结构变了。原本 $a["value"]["value"][1] 中的值 1,在反序列化之后丢失了。
原因是什么呢?让我们输出序列化之后的结果来看一看:
$a = array();$a[1] = 1;$a["value"] = $a;&echo serialize($a);结果是:
a:2:{i:1;i:1;s:5:"value";a:2:{i:1;i:1;s:5:"value";N;}}原来,序列化之后,$a["value"]["value"] 变成了 NULL,而不是一个对象引用。
也就是说,PHP 只对对象在序列化时才会生成对象引用标示(r)。对所有的标量类型和数组(也包括 NULL)序列化时都不会生成对象引用。但是如果明确使用了 & 符号作的引用,在序列化时,会被序列化为指针引用标示(R)。
5.2.引用标示后的数字在上面的例子中大家可能已经看到了,对象引用(r)和指针引用(R)的格式为:
r:&number&;R:&number&;大家一定很奇怪后面这个 &number& 是什么吧?本节我们就来详细讨论这个问题。
这个 &number& 简单的说,就是所引用的对象在序列化串中第一次出现的位置,但是这个位置不是指字符的位置,而是指对象(这里的对象是泛指所有类型的量,而不仅限于对象类型)的位置。
我想大家可能还不是很明白,那么我来举例说明一下:
class ClassA {&&& var $&&& var $&&& var $&&& var $&&& var $}&$a = new ClassA();$a-&int = 1;$a-&str = "Hello";$a-&bool =$a-&obj = $a;$a-&pr = &$a-&&echo serialize($a);这个例子的结果是:
O:6:"ClassA":5:{s:3:"int";i:1;s:3:"str";s:5:"Hello";s:4:"bool";b:0;s:3:"obj";r:1;s:2:"pr";R:3;}在这个例子中,首先序列化的对象是 ClassA 的一个对象,那么给它编号为 1,接下来要序列化的是这个对象的几个成员,第一个被序列化的成员是 int 字段,那它的编号就为 2,接下来被序列化的成员是 str,那它的编号就是 3,依此类推,到了 obj 成员时,它发现该成员已经被序列化了,并且编号为 1,因此它被序列化时,就被序列化成了 r:1; ,在接下来被序列化的是 pr 成员,它发现该成员实际上是指向 str 成员的一个引用,而 str 成员的编号为 3,因此,pr 就被序列化为 R:3; 了。
PHP 是如何来编号被序列化的对象的呢?实际上,PHP 在序列化时,首先建立一个空表,然后每个被序列化的对象在被序列化之前,都需要先计算该对象的 Hash 值,然后判断该 Hash 值是否已经出现在该表中了,如果没有出现,就把该 Hash 值添加到这个表的最后,返回添加成功。如果出现了,则返回添加失败,但是在返回失败前先判断该对象是否是一个引用(用 & 符号定义的引用),如果不是则也把 Hash 值添加到表后(尽管返回的是添加失败)。如果返回失败,则同时返回上一次出现的位置。
在添加 Hash 值到表中之后,如果添加失败,则判断添加的是一个引用还是一个对象,如果是引用,则返回 R 标示,如果是对象,则返回 r 标示。因为失败时,会同时返回上一次出现的位置,因此,R 和 r 标示后面的数字,就是这个位置。
5.3.对象引用的反序列化PHP 在反序列化处理对象引用时很有意思,如果反序列化的字符串不是 PHP 的 serialize() 本身生成的,而是人为构造或者用其它语言生成的,即使对象引用指向的不是一个对象,它也能正确地按照对象引用所指向的数据进行反序列化。例如:
echo "&pre&";class StrClass {&&& var $a;&&& var $b;}&$a = unserialize('O:8:"StrClass":2:{s:1:"a";s:5:"Hello";s:1:"b";r:2;}');&var_dump($a);echo "&/pre&";运行结果:
object(StrClass)#1 (2) {& ["a"]=&& string(5) "Hello"& ["b"]=&& string(5) "Hello"}大家会发现,上面的例子反序列化后,$a-&b 的值与 $a-&a 的值是一样的,尽管 $a-&a 不是一个对象,而是一个字符串。因此如果大家用其它语言来实现序列化的话,不一定非要把 string 作为标量类型来处理,即使按照对象引用来序列化拥有相同字符串内容的复合类型,用 PHP 同样可以正确的反序列化。这样可以更节省序列化后的内容所占用的空间。
6.自定义对象序列化TBD
7.Unicode 字符串的序列化TBD
8.参考文献PHP 3 中关于序列化和反序列化的源代码
PHP 4 中关于序列化的源代码
PHP 4 中关于反序列化的源代码
PHP 5 中关于序列化的源代码
PHP 5 中关于反序列化的源代码
PHP 6 中关于序列化的源代码
PHP 6 中关于反序列化的源代码
PHP 手册中关于序列化和反序列化的介绍
Using Serialized PHP with Yahoo! Web Services
一些其他语言实现的 PHP serialize
JavaScript 版本(stable):http://www.devpro.it/code/102.htmlPerl 版本(stable):/code/perl/serialize/另一个 Perl 版本:http://www.cpan.org/modules/by-module/PHP/JBROWN/php-serialization/Python 版本(beta):/code/python/serialize/Java 版本(pre-alpha):/code/java/serialize/Ruby 版本:http://www.aagh.net/files/ruby/php_serialize.rbFlash/Actionscript 版本:http://sourceforge.net/projects/serializerclass/C# 版本:http://sourceforge.net/projects/csphpserial/
站长在关注}

我要回帖

更多关于 cf进不去服务器 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信