当自己拥有一个查看有关“服务器”的文章">服务器以后,就希望把自己的博客迁到新的服务器上。

新的服务器是Centos5+nginx+php+mysql,不能再跑ASP的程序了,也就无从使用ZBLOG了。

自己不可能再花冤枉钱去买ASP虚拟主机的钱了,同时也想尝试一下PHP+MYSQL的博客程序。

从ASP+ACCESS迁移到PHP+MYSQL,有点麻烦。

之前之所以选择ZBLOG。有两个原因:

一、之前一直害怕mysql的数据的备份、导入、导出不方便,所以不敢选择PHP的博客程序。(现在觉得好笑)

二、受月光博客的影响,也想把自己的博客做成他的样子,每天有那么多的访问量。

使用之后发现ZBLOG确实是ASP博客里最优秀单人博客程序,良好的静态化设计,可以让搜索引擎快速的收录。尽管买的虚拟主机很烂,但竟然很少不能访问,我想静态化的作用不小。

在众多的PHP博客程序面前,我花了眼,网上有说这个好的,有说那个好的。

于是,我都下载下来体验了一把。有wordpress,bo-blog,emblog等等,都还不错。

wordpress是全球下载最多,使用量最多的PHP博客程序,但是我用了之后,不是很习惯,到不是语言的问题,而是整个用户习惯的问题。外国人设计的东西,而国内的用户习惯就是一样,而且写博客的时候加载特别慢,编辑器里,尽然没有CODE,不能加入代码,很是不方便。也需你会告诉wordpress有很多插件可以实现你要的功能,是你不知道用吧了。你说的很对,我就是不喜欢搞那么多杂七杂八的东西,我需要的是简单,能快速方便的书写博客的系统。所以,我不想选择wordpress。

Bo-blog试用之后,感觉还行,毕竟是中国人自己设计的博客系统,虽然比较简单,但是很符合我的用户习惯。再说,张宴的博客就是用的BOBLOG,访问的人挺多的,应该是款不错的博客程序。我很想把博客转到bo-blog上,可以一直在网上没有发现转换程序,找不到zblog to bo-blog的转换程序。不可能从头再来的,所以只能放弃。

emblog没有详细试用,感觉比较普通,没有什么特别吸引我的地方,一个比较普通的Php博客而已。

为了放自己的博客能顺利转到PHP博客上,我好选择了Wordpress因为网上,唯一提供的ZBLOG转PHP的就是WORDPRESS。

最后由ZBLOG顺利转换到WORDPRESS上,开始使用这款很火的程序,但最终我还是受不了了,他的用户习惯让我难以忍受。

于是,我继续寻找更适合我的PHP程序……

我想,我的博客系统,应该是简单方便的,能像ZBLOG生成真的静态页面的(这样方便搜索引擎能快速收录),而不需要太多我不要的复杂功能,也不需要多美化简单就是美……

最后,我找到现在用这个JBLOG,他第一吸引我的地方是可以生成真实的静态博客页面,而不是伪静态,这样对与服务器和搜索引擎都有好处。安装试用后,感觉真的很简单,就是一个发博客和管理评论的功能,也正好符合我的个人需求。

刚好,我又找到了wordpress转到Jblog的转换工具(这个工具不怎么样,需要自己做太多的工作,另外写文说明),于是一并转到了jblog上。

现在比较担心的JBLOG的问题是,他是一个人开发的,而是他发布时间不长,变化会比较大,可能会频繁升级。

我喜欢真实的静态化,所以我选择JBLOG了,尽管它有很多不成熟的地方,他的简单打动了我。

最后,我还打算做一个测试,我之前的博客百度收录210篇左右的静态文本在目录/post/nnn.html,我这次全部删除,生成新的article/2009-05/nnn.html的路径,我看看搜索引擎如何对待我这个网站,我现在PR是3,看搜索引擎需要多久变过来。

之前我用的是www.gisblogs.net ,我现在改成了gisblogs.net ,我设置了一个网站www.gisblogs.net让他跳转到gisblogs.net ,空间做了个错误页面,也是转到gisblogs.net ,看搜索引擎如何对待这次转换。

得出结论后,再发文与大家分享。

偶然间看到一篇云风的CSDN的讲座,让在游戏服务器方面的经验,让我突然眼前一亮:

一。引擎三大部分

基于 freebsd 的服务器
跨平台的客户端
二进制跨平台
支持 Win32 MacOs Linux Freebsd
3d 部分基于 openGL
C 语言编写底层、逻辑部分动态脚本语言
开发用相关工具
跨平台命令行工具
Windows 下的视觉编辑工具

二。服务器的设计
底层全部由 C 语言编写
逻辑层语言无关
类 COM 的模块化设计
多语言混合编程
多进程单线程结构
服务器组内各进程功能有明显的层次划分
数据和逻辑分离

三。服务器群
单一登陆点做进入系统的认证
全局数据库仅保存用户身份信息
不保持常连接
玩家可以在整个大世界中发生联系
物理上玩家分属不同服务器组管理
用户数据库各自独立,无须实时交互
虚拟世界中的距离即物理世界上的距离

四。服务器组间消息传递
避免交互性协议
游戏设计上考虑远程通讯的时间差
允许数据复制,并考虑多个副本相遇时的处理
每组服务器有唯一的数据输入输出点
海关服务
玩家的交互受游戏设计的限制
限制是为了更丰富的可能性
虚拟世界的战争、贸易以及资源分配

五。外部连接处理
多个外部接入点
国情问题:电信网通问题
特别通道:用于管理人员进入
组播
分组管理的问题
心跳控制
流水线作业
时间控制
录象回放调试(监督数据合法性)
聊天信息分离
利用广播服务器减低负载
广义聊天信息

六。时间校对
校对玩家机器和服务器组的时间
防止时间作弊
估算消息发生时刻,更流畅的完成交互动作
精确保证时间的一致性
NTP 协议的问题
Client 的不合作(区分恶意和无意)
服务器组间的时间校对
心跳控制

七。数据服务
唯一的数据储存点
使用本地文件系统
使用简单文本结构
使用简单的交互协议
物品发放服务
虚拟物品的控制
数据监控和备份

八。开发经验和教训
曾经追求大一统的设计
过分信赖 C++
设计模式滥用
数据应当文本化
应将每单个任务足够简化
不为尚不存在的需求做设计

  云风,之前我拜读过他的《我的编程感悟》,牛人一个。看过他的演讲ppt内容,正是我需要的解决的许多问题,一直搜寻这个讲座的视频。



未果,寻一连接:


http://subject.csdn.net/2009video/content-635659.html

以前零零散散的玩过,没有一个系统的理解,正好趁放假研究了一下,主要资料来自handbook。

概念

Jail是chroot机制的一种进化后的机制,可以提高更为高级和灵活的隔离和监管机制,除了文件系统监管外,还实现了设备隔离,用户隔离,系统资源隔离,使其更像是一种虚拟机机制了,与此相似的概念有linux下的openvz,以及Solaris下的Container。在下认为此类的技术会与虚拟化技术逐渐融合并逐渐集成入操作系统本身甚至硬件,最终成为新的操作系统资源分配机制(继多用户,多进程,Virtual Memory架构之后新的隔离机制)。

设计

Jail可以说是一种轻量级的虚拟机制,就我目前所了解到的资料来看,它实现了文件系统隔离,进程隔离,用户隔离,设备隔离。比较起linux下的openvz,差的地方有网络地址分配,共享库控制这两大方面,当然细节会有很大不同了。

部署

写了一大堆废话,下面才是真正开始安装使用了。

构建一个Jail,必备的几个参数有Jail的根目录,用户态程序,主机名以及IP地址,还有一个可选的dev。根据用户态程序的不同考虑可以将Jail做成完整的系统型Jail以及服务型Jail。下面搞的一种,其实个人比较感兴趣的是服务型Jail,但是handbook没有提及,资料也较少。

时至当前6.2的版本,各项脚本以及工具可以说是十分成熟了,因此也就有一个比较统一的部署和管理方式了,基本可以按照handbook来做了,具体如下:

1,构建Jail的根目录,假设建立一个名为test的Jail,放在/jail/test下。很简单,就一句命令:

#mkdir /jail/test

2,构建用户态程序,因为是完整的系统型Jail,自然这些用户态程序也就是FreeBSD的world了,make world实现:

# cd /usr/src
# make world DESTDIR=/jail/test
这里make world=make buildworld + make installworld,因此如果以前做过buildworld的话可以偷懒直接用以前build好的安装,可以节省大量时间,也就是

#make installworld DESTDIR=/jail/test
3,构建jail内系统运行需要的配置文件,也就是jail的etc了,也就一条:

# make distribution DESTDIR=/jail/test
4,修改rc.conf添加jail服务运行的必要参数,必备的有:
jail_enable="YES" # 如果设为 NO 则表示不自动启动 jail
jail_list="test" # 以空格分隔的 jail 名字列表


还需指定单个jail的必备参数:
jail_test_rootdir="/jail/test" # jail 的根目录
jail_test_hostname="jail.dawnh.net" # jail 的主机名
jail_test_ip="192.168.1.81" # jail 的 IP 地址

另外还有可选的devfs,可用于控制jail里面可以使用哪些设备

jail_test_devfs_enable="YES" # 在 jail 中挂接 devfs
jail_test_devfs_ruleset="test_ruleset" # 在 jail 中应用的devfs 规则集


至此Jail基本就建立完成了,可以启动了。

这里注意还有一点是handbook没有提到但必须做的事情,就是设置IP,前面虽然为Jail指定了IP,但这个IP似乎是指定这个Jail可以从宿主系统接受数据报的IP,要其真正起作用,还必须在宿主系统配置上这个IP才可以,一般的做法是在宿主系统的接口上设置alias,命令如下:

#ifconfig re0 inet 192.168.1.81 netmask 255.255.255.0 alias
这样才算真正完成了,然后就是启动这个jail了。

#/etc/rc.d/jail start
如果前面做的都没问题的话可以看到Jail服务正常启动。

使用

然后的问题就是怎么进到这个Jail里面去使用了。因为刚构建好的Jail类似刚安装好的FreeBSD,是一个任何服务都没启用,连root密码都为空的系统,此时只能从控制台登陆进去配置各项服务,然而这里关键的问题就是–Jail是没有控制台的!

当然不会有人傻到对这种问题束手无策,最容易想到的是直接通过宿主系统进到/jail/test/etc里去修改各种配置文件,貌似这也是大部分网上有的资料所写的办法。然而由于我玩openvz的习惯,总以为会有那么一个jailctl enter test的命令可以直接从宿主进入到jail中去,不幸的是–没有。

然而我却找到了jexec这样一个命令可以执行jail里的命令,于是就简单多了,按照安装FreeBSD系统的经验,装好后第一步就是设置root密码并开启ssh,这样才方便下面登陆进去管理嘛,于是这样做:

#jls

此命令列出当前运行的jail,这里的关键是取得这个jail的jid,因为下面要用到。我这里假设id为1

#jexec 1 passwd root

要求输入密码了,和平时该密码一样的效果。

#jexec /etc/rc.d/sshd forcestart

启动ssh

至此这个Jail就可以ssh上去管理了。

参考:http://www.wangchao.net.cn/bbsdetail_61107.html
http://www.ooso.net/archives/436

mysql 5.1支持触发器以及自定义函数接口(UDF)的特性,如果配合libmemcache以及Memcached Functions for MySQL,就能够实现memcache的自动更新。简单记录一下安装测试步骤。

安装步骤
安装memcached,这个步骤很简单,随处可见
安装mysql server 5.1RC,安装办法也很大众,不废话了
编译libmemcached,解压后安装即可./configure; make; make install
编译Memcached Functions for MySQL,在http://download.tangent.org/找一个最新的版本下载就是,./configure --with-mysql=/usr/local/mysql/bin/mysql_config --libdir=/usr/local/mysql/lib/mysql/
make
make install
接下来有两个办法让Memcached Functions for MySQL在mysql中生效
在mysql的shell中执行memcached_functions_mysql源码目录下的sql/install_functions.sql,这会把memcache function作为UDF加入mysql
运行memcached_functions_mysql源码目录下的utils/install.pl,这是一个perl脚本,作用同上一条
测试memcache function
以下测试脚本摘自memcached_functions_mysql的源码目录,有兴趣可以试试

PLAIN TEXTCODE:
drop table if exists urls;
create table urls (
  id int(3) not null,
  url varchar(64) not null default '',
  primary key (id)
  );

select memc_servers_set('localhost:11211');
select memc_set('urls:sequence', 0);

DELIMITER |

DROP TRIGGER IF EXISTS url_mem_insert;
CREATE TRIGGER url_mem_insert
BEFORE INSERT ON urls
FOR EACH ROW BEGIN
    SET NEW.id= memc_increment('urls:sequence');
    SET @mm= memc_set(concat('urls:',NEW.id), NEW.url);
END |

DELIMITER ;

insert into urls (url) values ('http://google.com');
insert into urls (url) values ('http://www.ooso.net/index.php');
insert into urls (url) values ('http://www.ooso.net/');
insert into urls (url) values ('http://slashdot.org');
insert into urls (url) values ('http://mysql.com');
select * from urls;

select memc_get('urls:1');
select memc_get('urls:2');
select memc_get('urls:3');
select memc_get('urls:4');
select memc_get('urls:5');

继续参看:
http://www.jackxiang.com/post/2628/
SOA宣称的一大优势是异构系统服务整合,最大化利用现有的,旧系统的功能。

但怎么热论的都是B/S结构的,基于WebService的系统之间的SOA解决方案呢?甚至大多都是基于java的,也有.net和java之间的,但这有什么稀奇的呢? 在SOA这个概念出来之前, B/s结构的系统之间通信,整合方法本来就很多(http,xml,soap,webservice等等),SOA只不过把这些方法归拢,并形成一个标准的模式,也即包装而已。当然SOA提出的构建系统的理念还是很值得吸取的。

问题在由,SOA强调的它最大的功能就是,异构,任何语言编写的,新的,旧的系统之间都能共享服务,数据。

那么如果是3个旧的系统(C/S结构的),分别用vb, delphi, c++ 或者其它任何语言编写的系统之间,如何通过应用SOA来让这三个旧的系统协同工作,服务,流程,数据共享呢?  如果有办法,那是否需要花费大量的时间对这些系统进行重新开发呢?

如果没有办法,或有办法太花费的代价太大,那是不是可以说,能够应用SOA这个概念进行整合的系统,其开发时必须遵守SOA的标准规范呢? 如果不遵守,将不能应用SOA, 或者说将付出很大的代价才能SOA. 那这对于那些想整合共享异构的老系统的服务的用户来说还有什么意义呢? SOA的“充分发挥,利用legacy system 服务”的这一优势又如何体现呢?

以或这里的legacy system是指的不能太老? 至少能支持web service的?
也就是说,不是任何系统的改造都能套用SOA的,但是SOA的概念里面可是说的任何系统,所有语言啊,这可是让很多客户为止狂欢的主要原因啊
B/S基本都是通过web service来干的吧?
像LZ这样几个C/S来搞SOA的,以前还真没想过。如果是不同的语言编写的话又要协同,应该要使用一种通用的数据格式了,最直接的大概是XML吧,那不又像WS一样了?
期待高人的想法出现

是啊,我们给客户吹了半天SOA,人家很感兴趣。但人家的系统都是C/S的老系统,而且用的很好,不愿意重新开发新的,只是希望能在这几个旧系统里做整合。
怎么做? 到处宣扬平台,语言无关性,但到处讨论的都是有局限性的,基于java, .net的应用。

遇到这种老式语言开发的C/S系统怎么应用呢? 会不会经过调研,预算后得出结论:在这种结构上应用SOA代价过大,因此SOA不适用!那就又和SOA的最亮点冲突了。

期待指点,谢谢!

SOA只是个名词,落到实处,异构应用的整合问题,也就是要让说不同语言的人之间能够交流,本来就没有什么灵丹妙药,只能设定出一个世界语让大家来通用。妄想扔个SOA锦囊进去,世界就马上大同了,这是天方夜谭,呵呵。

好像SOA不是一种技术吧,在我看来SOA是一种态度. 以前老的系统怎么样了.如果跑的很好又何必重新开发呢?你要做的只是把老的系统提供的功能适配成你的SOA平台能够识别的服务.

“把老的系统提供的功能适配成你的SOA平台能够识别的服务” 这句话是核心。但是怎么做呢? 我想用一些传统的,老套的办法也可能解决问题,但这是不是SOA呢? 怎么做才算的上是正宗的SOA呢。

还是SOA说了"只要你整合,共享服务了,就都属于我SOA了”

太过强调SOA的概念。其实客户关心的是如何整合原来老的系统,共享数据,提高效率。是否采用SOA和如何采用SOA不是他们关心的事情。抓住事情的本质

SOA确实就是个大忽悠,没有它之前异构系统的整合的案例照样存在,而且实施的很好

如果把SOA理解成技术,首先看SCA的C++版能不能很容易的封装旧代码,如果不能,就直接考虑数据级别的整合吧,你们可以针对数据库开发一个web service的应用然后和SOA平台进行整合


SOA的目的就是为了整合老应用系统,实现数据交互,并且,最重要的,减少耦合,降低二次开发量。
讨论少的原因是,这里许多人没有(VC,带耳非,VB)等工作经验,也没用过。怎么交流?而且,每本书上,每个人都在谈C/S维护难的问题,自然没人愿意去趟这浑水。

SOA其实也是要解决新系统和老系统的互联问题。 当然还是得通过web services. 用JBI举例, 对老的C/S结构的系统, 你需要开发一个BC作为老系统的web services接口和其他系统通信, 同时这个BC也是老系统的一个Client。这也是为什么会有很多JDBC, File, SMTP等等BC的原因

不同意这个说法,SOA不一定要通过WS 通过WS的SOA我觉得很危险,不论你是内部路由调度还是服务发布用WS接口 后期性能都将极其的低.特别是内部路由这块,服务发布用ws倒是可以考虑. 在SOA平台内部建议使用长连接去进行通信. 根据我的测试结果  简单一个报文在短连接的情况下 要比长连接的情况最少慢一个到两个数量级. 而且SOA是不暴露WS的 他暴露的仅仅是一个访问接入的接入点(服务的协议发布形式是不暴露的).应用统一通过这个接入点接入到SOA平台内,如果你直接暴露服务的协议那这个平台缺少安全性和规范性.

SOA是概念, 集成构架, 而JBI是一种实现SOA的技术。两个是不同层次的东西。 JBI是要求用SOAP进行通信, 但SOA完全可以不基于Web services, 更何况SOAP。

SOA是不暴露WS的: 我觉得SOA是一种理念, 只有一个应用才有暴露WS的问题。

至于性能,你的BC可以保持长连接, 但ESB内部还是通过消息传递(都不一定是IPC), 这也是在实施时考虑的具体优化问题

SOA是概念, 集成构架, 而JBI是一种实现SOA的技术。两个是不同层次的东西。 JBI是要求用SOAP进行通信, 但SOA完全可以不基于Web services, 更何况SOAP。

SOA是不暴露WS的: 我觉得SOA是一种理念, 只有一个应用才有暴露WS的问题。

至于性能,你的BC可以保持长连接, 但ESB内部还是通过消息传递(都不一定是IPC), 这也是在实施时考虑的具体优化问题。

RMI也可以实现SOA的,前面很多人说过,SOA只是一种架构方式.
兄弟我经常需要用到bash 的好用的快捷键,ctrl+l:清屏,相当于clear。
装了个金山词霸(当然盗版啦),发现ctrl+l:清屏没有用了,于是在软件设置里面有个朗读的快捷键也是ctrl+l,去掉了就ok了。嘻嘻
命令重定向:
在Bash命令执行中,除了有>符号,还有3种输出输入状况,分别是:
1 标准输入: 代码为0,或称为stdin,使用方式为<
2 标准输出: 代码为1,或称为stdout,使用方式为1>
3 错误输出: 代码为2,或称为stderr,使用方式为2>
>>  累加到文件中,文件累加,旧数据保留.
例:
[test @test test]# ls –al 1>list.txt 2>list.err
将显示数据正确输出到list.txt,错误的数据输出到list.err

>与>>比较,区别:

>: 将原来由屏幕输出的正确数据输出到>右边的文件或设备
>>: 将原来由屏幕输出的正确数据输出到>>右边,与>不同的是,该文件将不会被覆盖,而新的数据将以累加方式添加到文件的最后面.
/dev/null是什么呢?

答: 基本上,它有点象一个无底洞,专门收集垃圾,当您输入的任何东西导向到这个虚拟的垃圾桶,它就会凭空消失,非常有用.

例:
[test @test test]# find /-name testing 1> list_right 2> /dev/null

如果要把数据都写到同一个文件中
[test @test test]# find /-name testing 1> list_right 2>&1



          管线命令
管线命令使用的是”|”界定符号
管线命令”|”仅能处理经由前一个指令传来的正确信息,也就是标准输出(stdout)信息,对于标准错误信息并没有直接处理能力.

每个管线部分都是指令,而后一个指令的输入乃是前一个指令的输出.


常用的管线命令:
cut
语法:
[root @test /root]# cut –d “分隔字符” [-cf] fields
参数说明:
-d: 后面接的是分割字符,默认是空格符
-c: 后面接的是第几个字符
-f: 后面接的是第几个区块
cut的主要用途在于将同一行里的数据进行分解,最常用在分析一些数据或文件数据的时候,因为有时候我们会以某些字符当作分割参数,然后将数据加以切割,以取得我们需要的数据(常用与分析我们的日志文件).


sort
语法:
[root @test /root]# sort [-t 分隔符] [(+起始)(-结束)][-nru]

参数说明:
-t 分隔符: 使用分隔符隔开不同区块,默认是tab
+start –end: 由第start区块排序到end区块
-n: 使用纯数字排序(否则会以字母方式排序)
-r: 反向排序
-u: 相同出现的一行,只列出一次

[root @test /root]# cat /etc/passwd | sort
将列出来的个人帐号排序


wc
语法:
[root @test /root]#  wc [-lmw]

参数说明:
-l: 多少行
-m: 多少符号
-w: 多少字

例:
[root @test /root]# cat /etc/passwd | wc –l
这个文件里有多少行.


uniq
语法:
[root @test /root]#uniq

uniq删除重复的行从而只显示一个



tee
例:
[root @test /root]# last | tee last.list | cut –d “ ” –fi
使用tee,会将数据同时传给下一个命令执行,也会将数据写入last.list文件中



tr
语法:
[root @test /root]# tr [-ds] SET1
参数说明:
-d: 删除SET1这个字符串
-s: 取代重复的字符

例:
[root @test /root]# cat /etc/passwd | tr –d:
“:”这个符号在/etc/passwd中不见了



split
语法:
[root @test /root]# split [bl] 输入文件 输出文件前导字符
参数说明:
-b: 以文件SIZE来分
-l: 以行数来分

例:
[root @test /root]# split –l 5 /etc/passwd test
会产生testaa,testab,testac等文件
curl_close — 关闭一个curl会话
curl_copy_handle — 拷贝一个curl连接资源的所有内容和参数
curl_errno — 返回一个包含当前会话错误信息的数字编号
curl_error — 返回一个包含当前会话错误信息的字符串
curl_exec — 执行一个curl会话
curl_getinfo — 获取一个curl连接资源句柄的信息
curl_init — 初始化一个curl会话
curl_multi_add_handle — 向curl批处理会话中添加单独的curl句柄资源
curl_multi_close — 关闭一个批处理句柄资源
curl_multi_exec — 解析一个curl批处理句柄
curl_multi_getcontent — 返回获取的输出的文本流
curl_multi_info_read — 获取当前解析的curl的相关传输信息
curl_multi_init — 初始化一个curl批处理句柄资源
curl_multi_remove_handle — 移除curl批处理句柄资源中的某个句柄资源
curl_multi_select — Get all the sockets associated with the cURL extension, which can then be "selected"
curl_setopt_array — 以数组的形式为一个curl设置会话参数
curl_setopt — 为一个curl设置会话参数
curl_version — 获取curl相关的版本信息
curl_init()函数的作用初始化一个curl会话,curl_init()函数唯一的一个参数是可选的,表示一个url地址。
curl_exec()函数的作用是执行一个curl会话,唯一的参数是curl_init()函数返回的句柄。
curl_close()函数的作用是关闭一个curl会话,唯一的参数是curl_init()函数返回的句柄。
<?php
$ch = curl_init("http://www.baidu.com/");
curl_exec($ch);
curl_close($ch);
?>
curl_version()函数的作用是获取curl相关的版本信息,curl_version()函数有一个参数,不清楚是做什么的
<?php
print_r(curl_version())
?>
curl_getinfo()函数的作用是获取一个curl连接资源句柄的信息,curl_getinfo()函数有两个参数,第一个参数是curl的资源句柄,第二个参数是下面一些常量:
<?php
$ch = curl_init("http://www.baidu.com/");
print_r(curl_getinfo($ch));
?>
可选的常量包括:
CURLINFO_EFFECTIVE_URL
最后一个有效的url地址
CURLINFO_HTTP_CODE
最后一个收到的HTTP代码
CURLINFO_FILETIME
远程获取文档的时间,如果无法获取,则返回值为“-1”
CURLINFO_TOTAL_TIME
最后一次传输所消耗的时间
CURLINFO_NAMELOOKUP_TIME
名称解析所消耗的时间
CURLINFO_CONNECT_TIME
建立连接所消耗的时间
CURLINFO_PRETRANSFER_TIME
从建立连接到准备传输所使用的时间
CURLINFO_STARTTRANSFER_TIME
从建立连接到传输开始所使用的时间
CURLINFO_REDIRECT_TIME
在事务传输开始前重定向所使用的时间
CURLINFO_SIZE_UPLOAD
上传数据量的总值
CURLINFO_SIZE_DOWNLOAD
下载数据量的总值
CURLINFO_SPEED_DOWNLOAD
平均下载速度
CURLINFO_SPEED_UPLOAD
平均上传速度
CURLINFO_HEADER_SIZE
header部分的大小
CURLINFO_HEADER_OUT
发送请求的字符串
CURLINFO_REQUEST_SIZE
在HTTP请求中有问题的请求的大小
CURLINFO_SSL_VERIFYRESULT
Result of SSL certification verification requested by setting CURLOPT_SSL_VERIFYPEER
CURLINFO_CONTENT_LENGTH_DOWNLOAD
从Content-Length: field中读取的下载内容长度
CURLINFO_CONTENT_LENGTH_UPLOAD
上传内容大小的说明
CURLINFO_CONTENT_TYPE
下载内容的“Content-type”值,NULL表示服务器没有发送有效的“Content-Type: header”
curl_setopt()函数的作用是为一个curl设置会话参数。curl_setopt_array()函数的作用是以数组的形式为一个curl设置会话参数。
<?php
$ch = curl_init();
$fp = fopen("example_homepage.txt", "w");
curl_setopt($ch, CURLOPT_FILE, $fp);
$options = array(
CURLOPT_URL => 'http://www.baidu.com/',
CURLOPT_HEADER => false
);
curl_setopt_array($ch, $options);
curl_exec($ch);
curl_close($ch);
fclose($fp);
?>

本文来自: 脚本之家(www.jb51.net) 详细出处参考:http://www.jb51.net/article/16224.htm
 这次是Fotolog的经验,传说中比Flickr更大的网站,Fotolog在21台服务器上部署了51个memcached实例,总计有254G缓存空间可用,缓存了多达175G的内容,这个数量比很多网站的数据库都要大的多,原文是A Bunch of Great Strategies for Using Memcached and MySQL Better Together,我这里还是选择性的翻译以及按照我的理解补充,感谢Todd Hoff,总能给我们一些学习的案例,从这里也能看出国外技术的开放态度,不似我们,其实就那么点小九九还藏着掖着,好了,进入正题。
一、关于memcached
  还不知道这个?那你去面试的时候要吃亏了,赶紧去官方网站看一下http://www.danga.com/memcached/,另外google一下用法,硬盘总是太慢,把数据存在内存里面吧,如果你只有一台服务器,推荐用一下APC(Facebook在用)或者eaccelerator或者Xcache(国人开发的),这些产品单机效果更好,如果你需要分布式的缓存方案,那么用memcached吧。
二、memcached如何与mysql并肩作战?

    * 通过数据库分片来解决数据库写扩展的问题把数据库分片,部署到不同的服务器上,免得只有一个主服务器,写操作成为瓶颈以及可能有的“单点故障”,一般的数据库分片主要是按照业务来分,尽可能的拆分业务,不相干的都独立起来做成服务也好
    * 前端mysql和一堆memcached服务器来应付读的问题应用程序首先从memcached中获取数据,获取不到再从数据库中获得并保存在 memcached中,以前看过一篇文章说好的应用95%的数据从memcache的中获得,3%的数据从mysql的query cache中获得,剩下2%才去查表,对比一下你的应用,差距有多远?
    * 通过mysql复制(master-slave)来解决读的问题
      首先mysql数据库通过master-slave读写分离,多个slave来应对应用程序读的操作。

三、为什么不用mysql的query cache?
  我们都知道mysql有个query cache,可以缓存上次查询的结果,可实际上帮不上太多的忙,下面是mysql quety cache的不足:

    * 只能有一个实例
      意味着你能存储内容的上限就是你服务器的可用内存,一台服务器能有多少内存?你又能存多少呢?
    * 只要有写操作,mysql的query cache就失效
      只要数据库内容稍有改变,那怕改变的是其他行,mysql的query cache也会失效
    * mysql的query cache只能缓存数据库数据行
      意味着其他内容都不行,比如数组,比如对象,而memcached理论上可以缓存任何内容,甚至文件^_^

四、Fotolog的缓存技术

    * 非确定性缓存你不确定你要的数据缓存中有没有,你也不知道是不是过期了,于是你就试探性的问memcached,我要的什么什么数据你那有吗?我可不要过期的数据啊,memcached告诉你说有并且给你,你就开心了,如果没有呢,你就要从数据库或者别的地方去获取了,这是 memcached典型的应用。主要应用在:
      1.复杂的数据需要多次读取,你的数据库做了分片处理,从多个数据库中获取数据并组合起来是一个非常大的开销,你大可以把这些数据取出来之后存到memcached中
      2.mysql query cache的一个好的替代方案,这样数据库其他部门改变了,只要自己没改变就没问题(注意数据库更新的问题,后面会提到)
      3.把关系或者列表缓存起来,比如某个栏目下的多篇文章列表
      4.被多个页面调用并且获取起来很慢的数据,或者是更新很慢的数据,比如文章浏览排行榜
      5.如果cache的开销超过重新获取的开销,那么不要缓存它吧
      6.标签云和自动建议(类似google sugest)
      例如:当一个用户上传一个图片,这个用户的好友页面上都要列出这张图片来,那么把它缓存起来吧。
      潜在问题:
      memcached消耗的主要是服务器内存,对CPU消耗很小,所以Fotolog把memcached部署在他们的应用服务器上(貌似我们也是这样),他们遇到了CPU搞到90%的使用率(怎么会那么高?哪出问题了吧)、内存回收(这是个大问题)等等问题。
    * 状态缓存把应用服务的当前状态存在memcached中主要应用在:
      1.“昂贵”的操作,开销大的操作
      2.sessions会话,Flickr把session存在数据库中,个人感觉还是存memcached比较“便宜”些,如果memecached服务器down掉了,那么重新登录吧。
      3.记录用户在线信息(我们也是这样做的)
    * 确定性缓存对于某些特定数据库的全部内容,都缓存到memcached,有一个专门的应用服务来保障你要的数据都在memcached中,其他应用服务直接从memcached中获取数据而不去取数据库,因为数据库已经全部保存到memcached中并保持同步。主要应用在:
      1.读取伸展,所有的读取都从memcached中获得,数据库没有负载
      2.”永不过期“(相对的)的数据,比如行政规划数据,变动很小吧
      3.经常调用的内容
      4.用户的认证信息
      5.用户的概要信息
      6.用户的参数设置
      7.用户当前常用的媒体文件列表,比如用户的图片
      8.用户登录,不走数据库,只走memcached(个人觉得这个不太好,登录信息还是需要持久化的,用类似BDB这样效果也不错)
      使用方式:
      1.多个专门的缓存池而不是一个大的缓存服务器,多个缓存池保障了高可用性,一个缓存实例挂掉了走其他的缓存实例,所有的缓存实例挂掉了,走数据库(估计数据库抗不住^_^)
      2.所有的缓存池都用程序来维护,比如数据库有更新时,程序自动把更新后的内容同步到多个缓存实例中
      3.服务器重启之后,缓存要比网站先启动,这就意味着当网站已经启动了,所有的缓存都可用
      4.读取的请求可以负载均衡到多个缓存实例中去,高性能,高可靠性
      潜在的问题:
      1.你需要足够多的内存来存储那么多的数据
      2.数据以行记录数据,而memcached以对象来存储数据,你的逻辑要把行列的数据转换成缓存对象
      3.要维护多个缓存实例非常麻烦,Fotolog用Java/Hibernate,他们自己写了个客户端来轮询
      4.管理多个缓存实例会增加应用程序的许多开销,但这些开销相对于多个缓存得到的好处来说算不了什么
    * 主动缓存数据魔法般的出现在缓存中,当数据库中有更新的时候,缓存立马填充,更新的数据被调用的可能性更高(比如一篇新文章,看的的人当然多),是非确定性缓存的一种变形(原文是It’s non-deterministic caching with a twist.我觉得这样翻译怪怪的)。主要应用在:
      1.预填充缓存:让memcached尽可能的少调用mysql如果内容不展现的话。
      2.“预热”缓存:当你需要跨数据中心复制的时候
      使用步骤:
      1.解析数据库更新的二进制日志,发现数据库更新时对memcached也进行同样的更新
      2.执行用户自定义函数,设置触发器调用UDF更新,具体参考http://tangent.org/586/Memcached_Functions_for_MySQL.html
      3.使用BLACKHOLE策略,传说中Facebook也用mysql的Blackhole存储引擎来填充缓存,写到Blackhole的数据复制到缓存中,Facebook用这来设置数据作废以及跨国界的复制,好处是数据库的复制不走mysql,这就意味着没有二进制日志以及对CPU使用不那么多(啊?难道通过memcached 存储二进制日志,然后复制到不同的数据库?有经验的同志在这个话题上可以补充。)
    * 文件系统缓存把文件直接缓存在memcached中,哇,够BT的,减轻NFS的负担,估计只缓存那些过于热门的图片吧。
    * 部分页面内容缓存如果页面的某些部分获取起来非常费劲,以其缓存页面的原始数据还不如把页面的部分内容直接缓存起来直接调用
    * 应用程序级别的复制通过API来更新缓存,API的执行细节如下:1.一个应用把数据写到某个缓存实例,这个缓存实例把内容复制到其他缓存实例(memcached同步)
      2.自动获得缓存池地址以及实例个数
      3.同时对多个缓存实例更新
      4.如果某个缓存实例down掉了,跳到下一个实例,直到更新成功
      整个过程非常高效以及低开销
    * 其他技巧1.多节点以应对”单点故障”2.使用热备技术,当某个节点down掉了,另外一台服务自动替换成它的IP,这样客户端不用更新memcached的IP地址
      3.memcached可以通过TCP/UDP访问,持续连接可以减轻负载,系统设计成可同时承受1000个连接
      4.不同的应用服务,不同的缓存服务器群
      5.检查一下你的数据大小是否匹配你分配的缓存,更多请参考http://download.tangent.org/talks/Memcached%20Study.pdf
      6.不要考虑数据行缓存,缓存复杂的对象
      7.不要在你的数据库服务器上跑memcached,两个都是吃内存的怪兽
      8.不要被TCP延迟困扰,本地的TCP/IP对内存复制是做了优化的
      9.尽可能的并行处理数据
      10.并不是所有的memcached的客户端都是一样的,仔细研究你用的语言所对应的(好像php和memcached配合的不错)
      11.尽可能的是数据过期而不是使数据无效,memcached可以设定过期时间
      12.选择一个好的缓存标识key,比如更新的时候加上版本号
      13.把版本号存储在memcached中
这两天在做WEB SERVICE,想详细了解一下soap提交的数据,于是把$_SERVER和$_REQUEST两个数组全打在日志里,但就是没有看见POST的内容. 没法只得找了个本地抓包软件抓了下.想了一下肯定是$_REQUEST或$_POST数组都是解析过的数据,对于非a=b方式的数据无法解析,所以是空的!

今天在看XMLRPC的一文章时(http://www.programfan.com/article/2944.html),发现了 $HTTP_RAW_POST_DATA 这个变量能取到post的内容.网上有文章如下介绍



The RAW / uninterpreted HTTP POST information can be accessed with:   $GLOBALS['HTTP_RAW_POST_DATA'] This is useful in cases where the post Content-Type is not something PHP understands (such as text/xml).

意思是,由于PHP默认只识别application/x-www.form-urlencoded标准的数据类型,因此,对型如text/xml的内容无法解析为$_POST数组,故保留原型,交给$HTTP_RAW_POST_DAT来接收。
telnet到memcached服务器后有很多的命令可以使用,除了大家熟知的add、get、set、incr、decr、replace、delete等赋值命令外,还有一系列的获取服务器信息的命令,这部分命令都是以stats开头的。
用PHP的Memcache::getStats($cmd)也可以访问这些命令

常用的命令



stats
显示服务器信息、统计数据等

stats reset
清空统计数据



stats malloc
显示内存分配数据

stats maps
这个不太确定,看源代码是把/proc/self/maps的数据显示出来。这个文件的数据貌似是动态库的映射地址?

stats maps
00365000-00378000 r-xp 00000000 08:01 149004     /lib/libnsl-2.3.4.so
00378000-00379000 r--p 00012000 08:01 149004     /lib/libnsl-2.3.4.so
00379000-0037a000 rw-p 00013000 08:01 149004     /lib/libnsl-2.3.4.so
0037a000-0037c000 rw-p 0037a000 00:00 0
0070c000-00722000 r-xp 00000000 08:01 147620     /lib/ld-2.3.4.so
00722000-00723000 r--p 00015000 08:01 147620     /lib/ld-2.3.4.so
00723000-00724000 rw-p 00016000 08:01 147620     /lib/ld-2.3.4.so
00726000-0084c000 r-xp 00000000 08:01 147621     /lib/tls/libc-2.3.4.so
0084c000-0084e000 r--p 00125000 08:01 147621     /lib/tls/libc-2.3.4.so
0084e000-00850000 rw-p 00127000 08:01 147621     /lib/tls/libc-2.3.4.so
00850000-00852000 rw-p 00850000 00:00 0
00891000-0089f000 r-xp 00000000 08:01 147624     /lib/tls/libpthread-2.3.4.so
0089f000-008a0000 r--p 0000d000 08:01 147624     /lib/tls/libpthread-2.3.4.so
008a0000-008a1000 rw-p 0000e000 08:01 147624     /lib/tls/libpthread-2.3.4.so
008a1000-008a3000 rw-p 008a1000 00:00 0
008a5000-008b4000 r-xp 00000000 08:01 147628     /lib/libresolv-2.3.4.so
008b4000-008b5000 r--p 0000f000 08:01 147628     /lib/libresolv-2.3.4.so
008b5000-008b6000 rw-p 00010000 08:01 147628     /lib/libresolv-2.3.4.so
008b6000-008b8000 rw-p 008b6000 00:00 0
009c7000-009cf000 r-xp 00000000 08:01 149005     /lib/tls/librt-2.3.4.so
009cf000-009d0000 r--p 00007000 08:01 149005     /lib/tls/librt-2.3.4.so
009d0000-009d1000 rw-p 00008000 08:01 149005     /lib/tls/librt-2.3.4.so
009d1000-009db000 rw-p 009d1000 00:00 0
00d28000-00d3b000 r-xp 00000000 08:02 688822     /usr/local/sinawap/lib/libevent-1.4.so.2.0.0
00d3b000-00d3c000 rw-p 00013000 08:02 688822     /usr/local/sinawap/lib/libevent-1.4.so.2.0.0
00d3c000-00d3d000 rw-p 00d3c000 00:00 0
08048000-08052000 r-xp 00000000 08:02 905179     /usr/local/sinawap/bin/memcached
08052000-08053000 rw-p 0000a000 08:02 905179     /usr/local/sinawap/bin/memcached
08053000-08056000 rw-p 08053000 00:00 0
08499000-084ba000 rw-p 08499000 00:00 0
b7f64000-b7fa8000 rw-p b7f64000 00:00 0
bff9f000-c0000000 rw-p bff9f000 00:00 0
ffffe000-fffff000 r-xp 00000000 00:00 0



stats cachedump slab_id limit_num
显示某个slab中的前limit_num个key列表,显示格式如下
ITEM key_name [ value_length b; expire_time|access_time s]
其中,memcached 1.2.2及以前版本显示的是  访问时间(timestamp)
1.2.4以上版本,包括1.2.4显示 过期时间(timestamp)
如果是永不过期的key,expire_time会显示为服务器启动的时间

stats cachedump 7 2
ITEM copy_test1 [250 b; 1207795754 s]
ITEM copy_test [248 b; 1207793649 s]

stats slabs
显示各个slab的信息,包括chunk的大小、数目、使用情况等

stats items
显示各个slab中item的数目和最老item的年龄(最后一次访问距离现在的秒数)

stats detail [on|off|dump]
设置或者显示详细操作记录

参数为on,打开详细操作记录
参数为off,关闭详细操作记录
参数为dump,显示详细操作记录(每一个键值get、set、hit、del的次数)

stats detail dump
PREFIX copy_test2 get 1 hit 1 set 0 del 0
PREFIX copy_test1 get 1 hit 1 set 0 del 0
PREFIX cpy get 1 hit 0 set 0 del 0
memcached的服务器客户端通信并不使用复杂的XML等格式,而使用简单的基于文本行的协议。因此,通过telnet 也能在memcached上保存数据、取得数据。下面是例子。

$ telnet localhost 11211
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
set foo 0 0 3     (保存命令)
bar               (数据)
STORED            (结果)
get foo           (取得命令)
VALUE foo 0 3     (数据)
bar               (数据)

delete foo

DELETED



Tencent:~ # telnet 172.24.18.5* 11211  
Trying 172.24.18.56...
Connected to 172.24.18.56.
Escape character is '^]'.
set foo 0 0 3
bar
STORED
get foo
VALUE foo 0 3
bar
END
delete foo
DELETED


清空全部Memcached的变量,shell下的Telnet操作如下:
[/usr/local/apache2/*/vhost.d]# telnet 172.25.*.70 12000
Trying 172.25.38.70...
Connected to 172.25.38.70.
Escape character is '^]'.
flush_all
OK


另辟蹊径-检查memcached中指定的key是否存在:
们都知道,memcached的协议中是没有任何一个协议提供给我们检查某个key是否存在的。但是我们可能会有这样的需求。
    一些开源的客户端提供了KeyExists()这样的方法,但是其实现原理是调用了memcached的get协议,以此来达到判断某个key是否存在的目的:能取到表示这个key存在,取不到则不存在。这样的效率是比较低的,特别是当数据包比较大的情况下。

    在不读取memcached的数据的情况下,如何高效的判断某个key是否存在呢?

    大家都知道memcached的cas(check and set)协议吧,该协议在写memcached时先判断是否有人在你之前更新过数据,如果有更新过,则此次写memcached失败。

    那我们来看一下cas的语法:

    cas key flag exptime bytes version\r\n

    其中的version是memcached内部维护的一个版本号,是个uint64_t的值,这个值是调用memcached的gets协议获得的,version从1开始,memcached刚启动的时候,节点数为0,从存储第一个节点开始,version不断累加。因此,version是不可能出现0这个情况,这点很重要,是达到我们的目的的一个关键点。

    好了,我们已经知道了cas的用法,根据它的特性可以实现我们检查一个key是否存在的目的,聪明的读者可能已经知道该怎么做了吧。

    比如要检查foo这个key是否存在,可以构造这样的命令

  

    cas foo 0 0 1 0\r\n

    这里构造一个字节的数据包,将version字段设置成0,尝试写memcached。

    如果foo已经存在,因为它的version不可能等于0,所以memcached提示EXISTS

    如果foo不存在,memcached提示NOT_FOUND

------------------------------------------

    set foo 0 0 3                # 先写入
    bar
    STORED
    cas foo 0 0 1 0             # 判断foo是否存在,系统提示EXISTS
    a
    EXISTS
    delete foo                     # 将foo删除
    DELETED
    cas foo 0 0 1 0             # 判断foo是否存在,系统提示NOT_FOUND
    a
    NOT_FOUND

------------------------------------------

    这样,我们就知道foo这个key是否存在了。


----------------------------------------------引用-------------------------------------------------

memcached的基本设置:

-p 监听的端口
-l 连接的IP地址, 默认是本机
-d start 启动memcached服务
-d restart 重起memcached服务
-d stop|shutdown 关闭正在运行的memcached服务
-d install 安装memcached服务
-d uninstall 卸载memcached服务
-u 以的身份运行 (仅在以root运行的时候有效)
-m 最大内存使用,单位MB。默认64MB
-M 内存耗尽时返回错误,而不是删除项
-c 最大同时连接数,默认是1024
-f 块大小增长因子,默认是1.25
-n 最小分配空间,key+value+flags默认是48
-h 显示帮助

mixi的设置,单台:

每台memcached服务器仅启动一个memcached进程。分配给memcached的内存为3GB,启动参数如下:

/usr/bin/memcached -p 11211 -u nobody -m 3000 -c 30720
由于使用了x86_64的操作系统,因此能分配2GB以上的内存。32位操作系统中,每个进程最多只能使用2GB内存。也曾经考虑过启动多个分配2GB以下内存的进程,但这样一台服务器上的TCP连接数就会成倍增加,管理上也变得复杂,所以mixi就统一使用了64位操作系统。

另外,虽然服务器的内存为4GB,却仅分配了3GB,是因为内存分配量超过这个值,就有可能导致内存交换(swap)。连载的第2次中前坂讲解过了memcached的内存存储“slab allocator”,当时说过,memcached启动时指定的内存分配量是memcached用于保存数据的量,没有包括“slab allocator”本身占用的内存、以及为了保存数据而设置的管理空间。因此,memcached进程的实际内存分配量要比指定的容量要大,这一点应当注意。

mixi保存在memcached中的数据大部分都比较小。这样,进程的大小要比指定的容量大很多。因此,我们反复改变内存分配量进行验证,确认了3GB的大小不会引发swap,这就是现在应用的数值。


Redhat5下利用yum安装SVN客户端

由于Redhat5自带的SVN的版本是1.4.1的,比较老,不能读取SVN1.5的库,所有要更新:
直接运行:yum update subversion
会抱错:
http://ftp.sjtu.edu.cn/centos/5/updates/i386/repodata/repomd.xml: [Errno 14] HTTP Error 403: Forbidden
将repo地址改称USTC(科大的),
即:/etc/yum.repos.d/rhel-debuginfo.repo中的所有ftp.sjtu.edu.cn改成centos.ustc.edu.cn
然后运行yum update subversion就可以了. ......
http://bbs.5y6s.com/htm_data/20/0702/9283.html
一、什么是C/S和B/S

第一、什么是C/S结构
C/S (Client/Server)结构,即大家熟知的客户机和服务器结构。它是软件系统体系结构,通过它可以充分利用两端硬件环境的优势,将任务合理分配到Client端和Server端来实现,降低了系统的通讯开销。目前大多数应用软件系统都是Client/Server形式的两层结构,由于现在的软件应用系统正在向分布式的Web应用发展,Web和Client/Server 应用都可以进行同样的业务处理,应用不同的模块共享逻辑组件;因此,内部的和外部的用户都可以访问新的和现有的应用系统,通过现有应用系统中的逻辑可以扩展出新的应用系统。这也就是目前应用系统的发展方向。

传统的C/S体系结构虽然采用的是开放模式,但这只是系统开发一级的开放性,在特定的应用中无论是Client端还是Server端都还需要特定的软件支持。由于没能提供用户真正期望的开放环境,C/S结构的软件需要针对不同的操作系统系统开发不同版本的软件, 加之产品的更新换代十分快,已经很难适应百台电脑以上局域网用户同时使用。而且代价高, 效率低。如我院使用的上海超兰公司“案件统计”管理软件就是典型的C/S体系结构管理软件。

第二、什么是B/S结构
B/S(Browser/Server)结构即浏览器和服务器结构。它是随着Internet技术的兴起,对C/S结构的一种变化或者改进的结构。在这种结构下,用户工作界面是通过WWW浏览器来实现,极少部分事务逻辑在前端(Browser)实现,但是主要事务逻辑在服务器端(Server)实现,形成所谓三层3-tier结构。这样就大大简化了客户端电脑载荷,减轻了系统维护与升级的成本和工作量,降低了用户的总体成本(TCO)。以目前的技术看,局域网建立B/S结构的网络应用,并通过Internet/Intranet模式下数据库应用,相对易于把握、成本也是较低的。它是一次性到位的开发,能实现不同的人员,从不同的地点,以不同的接入方式(比如LAN, WAN, Internet/Intranet等)访问和操作共同的数据库;它能有效地保护数据平台和管理访问权限,服务器数据库也很安全 。特别是在JAVA这样的跨平台语言出现之后,B/S架构管理软件更是方便、快捷、高效。

第三、管理软件主流技术
管理软件技术的主流技术与管理思想一样,也经历了三个发展时期。首先,界面技术从上世纪DOS字符界面到Windows图形界面(或图形用户界面GUI),直至Browser浏览器界面三个不同的发展时期。其次,今天所有电脑的浏览器界面,不仅直观和易于使用,更主要的是基于浏览器平台的任何应用软件其风格都是一样的,使用人对操作培训的要求不高,而且软件可操作性强,易于识别;再者,平台体系结构也从过去单用户发展到今天的文件/服务器(F/S)体系、客户机/服务器(C/S)体系和浏览器/服务器(B/S)体系。

二、C/S和B/S 之比较

C/S和B/S是当今世界开发模式技术架构的两大主流技术。C/S是美国 Borland公司最早研发,B/S是美国微软公司研发。目前,这两项技术以被世界各国所掌握,国内公司以C/S和B/S技术开发出产品也很多。这两种技术都有自己一定的市场份额和客户群,各家企业都说自己的管理软件架构技术功能强大、先进、方便,都能举出各自的客户群体,都有一大群文人墨客为自己摇旗呐喊,广告满天飞,可谓仁者见仁,智者见智。

1、C/S架构软件的优势与劣势

(1)、应用服务器运行数据负荷较轻。最简单的C/S体系结构的数据库应用由两部分组成,即客户应用程序和数据库服务器程序。二者可分别称为前台程序与后台程序。运行数据库服务器程序的机器,也称为应用服务器。一旦服务器程序被启动,就随时等待响应客户程序发来的请求;客户应用程序运行在用户自己的电脑上,对应于数据库服务器,可称为客户电脑,当需要对数据库中的数据进行任何操作时,客户程序就自动地寻找服务器程序,并向其发出请求,服务器程序根据预定的规则作出应答,送回结果,应用服务器运行数据负荷较轻。

(2)、数据的储存管理功能较为透明。在数据库应用中,数据的储存管理功能,是由服务器程序和客户应用程序分别独立进行的,前台应用可以违反的规则,并且通常把那些不同的(不管是已知还是未知的)运行数据,在服务器程序中不集中实现,例如访问者的权限,编号可以重复、必须有客户才能建立定单这样的规则。所有这些,对于工作在前台程序上的最终用户,是“透明”的,他们无须过问(通常也无法干涉)背后的过程,就可以完成自己的一切工作。在客户服务器架构的应用中,前台程序不是非常“瘦小”,麻烦的事情都交给了服务器和网络。在C/S体系的下,数据库不能真正成为公共、专业化的仓库,它受到独立的专门管理。

(3)、C/S架构的劣势是高昂的维护成本且投资大。首先,采用C/S架构,要选择适当的数据库平台来实现数据库数据的真正“统一”,使分布于两地的数据同步完全交由数据库系统去管理,但逻辑上两地的操作者要直接访问同一个数据库才能有效实现,有这样一些问题,如果需要建立“实时”的数据同步,就必须在两地间建立实时的通讯连接,保持两地的数据库服务器在线运行,网络管理工作人员既要对服务器维护管理,又要对客户端维护和管理,这需要高昂的投资和复杂的技术支持,维护成本很高,维护任务量大。

其次,传统的C/S结构的软件需要针对不同的操作系统系统开发不同版本的软件,由于产品的更新换代十分快,代价高和低效率已经不适应工作需要。在JAVA这样的跨平台语言出现之后,B/S架构更是猛烈冲击C/S,并对其形成威胁和挑战。

2、B/S架构软件的优势与劣势

(1)、维护和升级方式简单。目前,软件系统的改进和升级越来越频繁,B/S架构的产品明显体现着更为方便的特性。对一个稍微大一点单位来说,系统管理人员如果需要在几百甚至上千部电脑之间来回奔跑,效率和工作量是可想而知的,但B/S架构的软件只需要管理服务器就行了,所有的客户端只是浏览器,根本不需要做任何的维护。无论用户的规模有多大,有多少分支机构都不会增加任何维护升级的工作量,所有的操作只需要针对服务器进行;如果是异地,只需要把服务器连接专网即可,实现远程维护、升级和共享。所以客户机越来越“瘦”,而服务器越来越“胖”是将来信息化发展的主流方向。今后,软件升级和维护会越来越容易,而使用起来会越来越简单,这对用户人力、物力、时间、费用的节省是显而易见的,惊人的。因此,维护和升级革命的方式是“瘦”客户机,“胖”服务器。

(2)、成本降低,选择更多。大家都知道windows在桌面电脑上几乎一统天下,浏览器成为了标准配置,但在服务器操作系统上windows并不是处于绝对的统治地位。 现在的趋势是凡使用B/S架构的应用管理软件,只需安装在Linux服务器上即可,而且安全性高。所以服务器操作系统的选择是很多的,不管选用那种操作系统都可以让大部分人使用windows作为桌面操作系统电脑不受影响,这就使的最流行免费的Linux操作系统快速发展起来,Linux除了操作系统是免费的以外,连数据库也是免费的,这种选择非常盛行。

比如说很多人每天上“新浪”网,只要安装了浏览器就可以了,并不需要了解“新浪”的服务器用的是什么操作系统,而事实上大部分网站确实没有使用windows操作系统,但用户的电脑本身安装的大部分是windows操作系统。

(3)、应用服务器运行数据负荷较重。由于B/S架构管理软件只安装在服务器端(Server)上,网络管理人员只需要管理服务器就行了,用户界面主要事务逻辑在服务器(Server)端完全通过WWW浏览器实现,极少部分事务逻辑在前端(Browser)实现,所有的客户端只有浏览器,网络管理人员只需要做硬件维护。但是,应用服务器运行数据负荷较重,一旦发生服务器“崩溃”等问题,后果不堪设想。因此,许多单位都备有数据库存储服务器,以防万一。

Web服务作为炙手可热的技术,如何应用到企业的IT系统和商业流程之中、并给企业带来直接的经济效益,一直备受国内外企业管理者的高度关注和推崇。而在近两年,出现了一种技术架构被誉为下一代Web服务的基础架构,它就是SOA(Service-oriented architecture,面向服务架构)。1996年,Gartner最早提出SOA。2002年12月,Gartner提出SOA是”现代应用开发领域最重要的课题”,还预计到2008年,SOA将成为占有绝对优势的软件工程实践方法,主流企业现在就应该在理解和应用SOA开发技能方面进行投资。

更好支持商业流程
SOA并不是一个新事物,IT组织已经成功建立并实施SOA应用软件很多年了,BEA、IBM、等厂商看到了它的价值,纷纷跟进。SOA的目标在于让IT变得更有弹性,以更快地响应业务单位的需求,实现实时企业(Real-Time Enterprise,这是Gartner为SOA描述的愿景目标)。而BEA的CIO Rhonda早在2001年6月就提出要将BEA的IT基础架构转变为SOA,并且从对整个企业架构的控制能力、提升开发效率、加快开发速度、降低在客户化和人员技能的投入等方面取得了不错的成绩。

SOA是在计算环境下设计、开发、应用、管理分散的逻辑(服务)单元的一种规范。这个定义决定了SOA的广泛性。SOA要求开发者从服务集成的角度来设计应用软件,即使这么做的利益不会马上显现。SOA要求开发者超越应用软件来思考,并考虑复用现有的服务,或者检查如何让服务被重复利用。SOA鼓励使用可替代的技术和方法(例如消息机制),通过把服务联系在一起而非编写新代码来构架应用。经过适当构架后,这种消息机制的应用允许公司仅通过调整原有服务模式而非被迫进行大规模新的应用代码的开发,使得在商业环境许可的时间内对变化的市场条件做出快速的响应。

SOA也不仅仅是一种开发的方法论–它还包含管理。例如,应用SOA后,管理者可以方便的管理这些搭建在服务平台上的企业应用,而不是管理单一的应用模块。其原理是,通过分析服务之间的相互调用,SOA使得公司管理人员方便的拿到什么时候、什么原因、哪些商业逻辑被执行的数据信息,这样就帮助了企业管理人员或应用架构师迭代地优化他们的企业业务流程、应用系统。

SOA的一个中心思想就是使得企业应
Crontab计算器:https://tooltt.com/crontab-parse/

0 0 07 01 * /bin/sh /usr/local/tads/htdocs/*/crontab/install.sh >/dev/null 2>&1

1月7日凌晨0点执行一个脚本!

注意:
1.尽量写绝对路径;
2.sh要写/bin/sh
3.给要执行的sh文件,这儿install.sh赋予权限:chmod a+x install.sh

Tencent:/usr/local/tads/htdocs/maestro/crontab # cat /usr/local/tads/htdocs/*/crontab/install.sh
cp -Rf /usr/local/tads/htdocs/*/view/usershow2.php /usr/local/tads/htdocs/*/view/usershow.php
cp -Rf  /usr/local/tads/htdocs/*/view/images/flow.jpg.need.replace /usr/local/tads/htdocs/*/view/images/flow.jpg




周一到周五每天下午 5:00 寄一封信给 alex@domain.name :
0 17 * * 1-5 mail -s "hi" alex@domain.name < /tmp/maildata
#周一到周五每天下午 5:00 寄一封信给 alex@domain.name :
0 17 * * 1-5 mail -s "hi" alex@domain.name < /tmp/maildata
#每月每天的午夜 0 点 20 分, 2 点 20 分, 4 点 20 分....执行 echo "haha"
20 0-23/2 * * * echo "haha"
#晚上11点到早上8点之间每两个小时,早上8点
0 23-7/2,8 * * * date
#每个月的4号和每个礼拜的礼拜一到礼拜三的早上11点
0 11 4 * mon-wed date
#1月份日早上4点
0 4 1 jan * date

第1列表示分钟1~59 每分钟用*或者 */1表示
第2列表示小时1~23(0表示0点)
第3列表示日期1~31
第4列表示月份1~12
第5列标识号星期0~6(0表示星期天)
第6列要运行的命令
crontab文件的一些例子:
30 21 * * * /usr/local/etc/rc.d/lighttpd restart
#上面的例子表示每晚的21:30重启apache。
45 4 1,10,22 * * /usr/local/etc/rc.d/lighttpd restart
#上面的例子表示每月1、10、22日的4 : 45重启apache。
10 1 * * 6,0 /usr/local/etc/rc.d/lighttpd restart
#上面的例子表示每周六、周日的1 : 10重启apache。
0,30 18-23 * * * /usr/local/etc/rc.d/lighttpd restart
#上面的例子表示在每天18 : 00至23 : 00之间每隔30分钟重启apache。
0 23 * * 6 /usr/local/etc/rc.d/lighttpd restart
#上面的例子表示每星期六的11 : 00 pm重启apache。
* */1 * * * /usr/local/etc/rc.d/lighttpd restart
#上面的例子每一小时重启apache
* 23-7/1 * * * /usr/local/etc/rc.d/lighttpd restart
#上面的例子晚上11点到早上7点之间,每隔一小时重启apache
0 11 4 * mon-wed /usr/local/etc/rc.d/lighttpd restart
#上面的例子每月的4号与每周一到周三的11点重启apache
0 4 1 jan * /usr/local/etc/rc.d/lighttpd restart
#上面的例子一月一号的4点重启apache


来自:http://bbs.chinaunix.net/thread-1699269-1-1.html
Memcache是什么?
Memcache是一个自由和开放源代码、高性能、分配的内存对象缓存系统。用于加速动态web应用程序,减轻数据库负载。 
它可以应对任意多个连接,使用非阻塞的网络IO。由于它的工作机制是在内存中开辟一块空间,然后建立一个HashTable,Memcached自管理这些HashTable。
Memcached是简单而强大的。它简单的设计促进迅速部署,易于发展所面临的问题,解决了很多大型数据缓存。它的API可供最流行的语言。
Memcache的知名用户有:LiveJournal、Wikipedia、Flickr、Bebo、Twitter、Typepad、Yellowbot、Youtube 等。
Memcache官方网站:http://memcached.org/

Memcached又是什么?
Memcache是该系统的项目名称,Memcached是该系统的主程序文件,以守护程序方式运行于一个或多个服务器中,随时接受客户端的连接操作,使用共享内存存取数据。

那PHP中的Memcache是什么?
php中的所讲的memcache是用于连接Memecached的客户端组件。



Memcache如何安装?

Memcached 服务端安装:(源码包官方网站下载)
系统命令

   1. tar xvf memcached-1.2.6.tar.gz  
   2. cd memcached-1.2.6  
   3. ./configure --prefix=/usr/local/memcached  
   4. make    
   5. make install  



然后就可以启动memcached的守护进程了:
系统命令

   1. /usr/local/memcached/bin/memcached -p 11211 -l 127.0.0.1 -d -u nobody -P /var/run/memcached.pid -m 64M -c 1024  



几个参数的解释:

-p memcached监听的TCP端口
-l 监听的ip地址,127.0.0.1是本机,当然也可以写上你的服务器IP,如:61.150.91.26,这是我服务器的IP地址,如果你需要多个服务器都能够读取这台memcached的缓存数据,那么就必须设定这个ip
-d 以daemon方式运行,将程序放入后台
-u memcached的运行用户,我设定的是nobody
-P memcached的pid文件路径
-m memcached可以使用的最大内存数量
-c memcached同时可以接受的最大的连接数

如果你希望以socket方式来访问memcached,那么在启动的时候就必须去掉 -l和-p参数,并加上-s参数:

-s memcached的socket文件路径



php中memcache扩展组件的安装:
系统命令

   1. tar xvf memcache-3.0.3.tgz  
   2. cd memcache-3.0.3  
   3. /usr/local/php5/bin/phpize  
   4. ./configure --with-php-config=/usr/local/php5/bin/php-config --enable-memcache  
   5. make  
   6. make install  



    按照我的环境,编译出来的memcache.so保存在 /usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/ 目录下,如果你的环境不一样,你得根据自己情况修改你的php.ini了。

接着要做的工作就是让php加载这个扩展,编辑你的php.ini,在适当位置(通常是最后,也可以是独立的一个ini文件)加入如下行:

extension=memcache.so

然后重启你的phpfastcgi进程或者apache,运行一个phpinfo()来确认一下,正常的话你应该可以看到这个了:memcache



php-memcache的简单使用举例:


PHP代码

[code]
   1. <?php  
   2.  
   3. $memcache = new Memcache;  
   4. $memcache->connect('127.0.0.1','11211');  
   5. $memcache->setCompressThreshold(20000, 0.2);    // 设置压缩  
   6. echo $memcache->getVersion();                   // 输出memcached版本  
   7.  
   8. $test = array(1,2,3,4,5,'abcde');               //生成一个数组  
   9.  
  10. if($memcache->get('test')){  
  11.         print_r($memcache->get('test'));        //获取数据  
  12.         echo "\n";  
  13.         echo 'cached';  
  14.         echo "\n";  
  15. }else{  
  16.         $memcache->set('test',$test,0,30);      //写入数据  
  17.         echo 'no cache';  
  18.         echo "\n";  
  19. }  
  20. ?>  [/code]



附:网上有朋友提供的《Memcached 的使用和协议分析详解》
分页: 187/272 第一页 上页 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 下页 最后页 [ 显示模式: 摘要 | 列表 ]