分页: 21/105 第一页 上页 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 下页 最后页 [ 显示模式: 摘要 | 列表 ]
      可能由于nginx现在太过抢眼或火爆了,现在apache正在孵化新产品以示竞争

  Apache基金会近日发布了Traffic Server的最新版本2.1.0-unstable版,新版本带来了一些新的特性和性能方面的优化提升,同时还包括支持FreeBSD和Mac OS x以及Solaris系统。此外,新版Traffic Server还提升了缓存的搜索和读写方面的效率。
Traffic Server是一套快速、模块化的兼容 HTTP/1.1的反向代理服务器,与Nginx和Squid 类似,目前该项目已经转到Apache基金会,暂时还是孵化状态。
  目前使用该产品的主要有Yahoo,Traffic Server在Yahoo每日承担超过400TB的正向和反向代理。
  Traffic Server下载地址:http://www.apache.org/dyn/closer.cgi/incubator/trafficserver/


点击在新窗口中浏览此图片

介绍:http://trafficserver.apache.org/
参考:http://blog.sina.com.cn/s/blog_502c8cc40100mw7n.html
下载:http://labs.renren.com/apache-mirror//trafficserver/trafficserver-2.0.1.tar.bz2


我的机子配置 2G内存
1:安装好apache和nginx。它们共用80端口(哈哈,当然修改端口是很简单的),apache安装在 /opt/httpd目录下,nginx安装在/opt/nginx中。
2:安装好webbench(很简单,下载解压后,进入目录,make ,make install即可进行安装),用于压力测试。
3:cd /opt/httpd/bin
./apachectl start
netstat -antl | grep 80 //用以确认该服务是否真正启动!以下是测试部分:
[root@*bin]# webbench -c 5000 -t 60 http://127.0.0.1/apache_pb.png
Webbench - Simple Web Benchmark 1.5
Copyright (c) Radim Kolar 1997-2004, GPL Open Source Software.

Benchmarking: GET http://127.0.0.1/apache_pb.png
5000 clients, running 60 sec.

Speed=208453 pages/min, 5741557 bytes/sec.
Requests: 208279 susceed, 174 failed.


-t 60 表示在60秒的时间内,-c 表示并发数。红色字体部分为性能表示。
很直观的一点就是说有174个响应失败。
4:为了测试的准确性,我

cp /opt/httpd/htdocs/apache_pb.png /opt/nginx/html/   //复制文件


接着关闭apache服务器, 以nginx来测试(我必须将其关闭,因为共用80端口,不关闭, 我启动不了nginx)

[root@qingheliu bin]# pkill httpd //将服务kill掉
[root@qingheliu bin]# netstat -antl | grep 80 //确认apache是否被kill
[root@qingheliu bin]# /opt/nginx/sbin/nginx //启动nginx
[root@qingheliu bin]# netstat -antl | grep 80 //确认是否正常启动
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN

//压力测试:
[*]# webbench -c 5000 -t 60 http://127.0.0.1/apache_pb.png
Webbench - Simple Web Benchmark 1.5
Copyright (c) Radim Kolar 1997-2004, GPL Open Source Software.

Benchmarking: GET http://127.0.0.1/apache_pb.png
5000 clients, running 60 sec.

Speed=325235 pages/min, 8656698 bytes/sec.
Requests: 325235 susceed, 0 failed.
[root@qingheliu bin]#
比较红色字体的部分。事实胜过雄辩,显然nginx服务器功能更好!
转自 http://hi.baidu.com/sheshi37c/blog/item/27417e1ed96942fc1bd57699.html

每秒持续10W的ajax请求,现在用mina来处理http请求,单机c10k搞不定,业务逻辑基本就根据url进行数据过滤并返回json,
以下测试数据通过ab -n 100000 -c 1 http://localhost/,client, server都在一个ubuntu上~
mina处理能力是2K request/s,即使不带业务代码,也不到3k request/s。
在这方面没有过多的经验,在公司也是一个人闭门造车,自己学习新技术能力较强,对nginx的性能也比较有信心,处理静态文件返回是7K request/s。

对erlang比较感兴趣,但是这个技术在公司基本不会采用,所以想直接在apache/nginx(首选nginx)上开发模块,处理http请求,java负责将数据装进memcache,nginx模块直接从memcache取数据,感觉这样性能有保障,这方面的资料网上不多,可能nginx模块本身就不应该用来处理业务逻辑。

故在javaeye请教各位,nginx业务模块,这种方案是否靠谱?有没有相应的案例或者资料来学习的,当然有更好的方案来解决这个问题也希望您能不吝赐教~

谢啦~
问题补充:
其实最终也就是想提高单机吞吐量,负载均衡肯定是需要做的。
对TCP/IP这些理论还没有深入的了解,仅仅停留在知道nginx以C为主的http比java快这个基础上。
还是尝试一下,用C来处理高并发这段的业务,用测试数据说话,谢谢啦

2009-08-22 fjlyxx (中级程序员)
在WIN下面 你同时并非3K到4K 信道就不够了 在LINUX下可以到3W到4W 你同时并发10W 只是一个梦想. 如果你要在1S内吞吐达到10W是可以的 但是一次HTTP请求是一个短连接的过程  连接时间可能就占用了几百毫秒甚至几秒 看LZ的意思 是想从业务处理时间上提高吞吐 但是个人觉得 在单向短连接的情况下 提高余地不高  如果业务处理时间都少于1S的话 那么这个时间基本和你建立连接时间持平  TOMCAT默认15条现场 在TOMCAT LF线程模型下 其实同时并非最大也就15个 但是这15个能同在1S内处理上百个简单请求 这时候瓶颈并不在IO方面  IO方面的瓶颈基本上是因为 访问量过大 建立连接耗时  如果访问量过大那么楼主就不能靠缩小业务处理时间 进行提高吞吐量(因为提高不多) 这时候更应该考虑负载均衡了.  如果访问量不多 但是吞吐量很低 这时候楼主可以考虑 业务优化

一般来说短连接和业务处理时间短的东西很难靠NIO去提高吞吐量

来源:http://www.javaeye.com/problems/23085
  从11岁时,我就一直在编程,并且一直都很喜欢技术和编程。这些年来,我积累了一些艰难又容易的经验。作为一名程序员,你或许还没这些经验,但我会把它们献给那些想从中学到更多的朋友。
  我会持续更新这些经验,我可能还会有更多的感想,但就我这20年来看,我想下面这个列表中基本不需要增添额外的东西了。下面就是我至今最难忘的经验。
  1. 估算解决问题所需要的时间。不要怕,承认吧!我曾见过一些程序员为了解决一个特殊问题而坐在显示器前面8小时。为自己定一个时间限制吧,1小时、30分钟或甚至15分钟。如果在这期间你不能解决问题,那就去寻求帮助,或到网上找答案,而不是尝试去做“超级堆码员”。
  2. 编程语言是一种语言,只是一种语言。随着时光推移,只要你理解了一种语言的原理,你会发现各种语言之间的相似之处 。你所选择的语言,你应该觉得“舒服”,并且能够写出有效(而且简洁)的代码。最重要的,让语言去适应项目,反之亦然。
  3. 不要过于注重程序的“设计模式”。 有时候,写一个简单的算法,要比引入某种模式更容易。在多数情况下,程序代码应是简单易懂,甚至清洁工也能看懂。
  4. 经常备份代码。在我年轻时,我就有过因硬盘故障而丢了大量代码的经历,这经历很恐怖的。只要你一次没有备份,就应当像有着严格的期限,客户明天就需要。此时就该源码/版本控制软件大显身手了。
  5. 承认自己并不是最顶尖的程序员 - 知不足。我常想,我对编程了解已足够多,但是总有其他人比你优秀。正所谓,“一山总比一山高”。所以,向他们看齐吧!
  6、学习再学习。正如第5点所说,我经常会在手里拿一本计算机或编程相关的杂志或书(不信,可以问我的朋友)。诚然,总有很多你不知道的技术,你可以从中学习以保持不落后。如果你有一种灵巧的方式来获取你需要的新技术,那你每天都应该坚持学习。
  7. 永恒的变化。你对待技术/编程知识,就应像你对待股票一样:多样化。不要在某一特定技术上自我感觉良好。如果那种技术或语言已经没有足够支持,那你还不如现在就开始更新你的简历,并启动培训新计划。我能保持前行的主要原则是什么呢?至少了解两到三种语言,所以,如果某种语言过时了,你在学习新技术的时候还可以依靠另一种语言。
  8. 提携新人。协助并且培养初级/入门的开发人员学习优秀的编程方法和技巧。也许你还不知道,在帮助他们向更高一层前进时,你自己也在向更高一层提升,你会更加自信。
  9. 简化算法。代码如恶魔,在你完成编码后,应回头并且优化它。从长远来看,这里或那里一些的改进,会让后来的支持人员更加轻松。
  10. 编写文档。无论是Web服务的API,还是一个简单的类,你尽量编写相应文档。我曾经引以为豪的代码注释,因过度注释而有人指责。给三行代码加一行注释,只需要你几秒时间。如果那是一个比较难以理解的技术,千万别担心过多注释。如果你能很好做好自己的工作,大多数架构师、后备程序员、支持组都会感激你。
  11. 测试、测试再测试。我是一名黑盒测试粉丝。当你完成编码后,你“被认可”的时候就开始了。如果你们公司有QA部门,如果你的代码中有错误,那你得到的评论,会比项目经理还多。如果你不彻底测试自己的代码,那恐怕你开发的就不只是代码,可能还会声名狼藉。
  12. 庆祝每一次成功。我见过很多程序员在解决编程技术难题后,会和同伴握手、击掌或甚至手舞足蹈。每个人在生命中都会碰到“顿悟”。如果一个程序员高兴地跑来叫你去看他的非凡代码,也许你已经看过这样的代码100遍了,但你也应该为了这个家伙而庆祝第101次。(编者注:《庆祝成功的九种方式》。)
  13. 经常检查代码。 在公司,你的代码要经常检查(包括自查和其他同事检查)。不要把别人的检查,看成是对代码风格的苛求。应该把它们看作是有建设性的批评。对个人来说,经常检查你的代码并且自问,“我怎样才能写得更好呢?” 这会让你加速你的成长,让你成为一个更优秀的程序员。
  14. 回顾你的代码。在看到自己以前的代码时,通常会有两种方式:“难以至信,这代码是我写的”和“难以至信,这代码是我写的”。第一种往往是厌恶的语气,并在想如何改进它。你也许会惊叹,旧代码也能复活成为一种更好的程序,甚至是一个完整的产品。第二种通常带着惊奇和成就感。开发人员应该一到两个自己完成的项目成果,能让众人不禁而立并注目而观的项目。同样,基于你优越的编程能力,你可以把过去的程序或项目拿出来,把它们更新为更加优秀的产品或想法。
  15. 幽默是不可缺的。在我20年的开发生涯中,我还没有碰到哪位程序员是没有幽默感的。实际上,干我们这行,幽默是一项必备品。
  16. 谨防那些无所不知的程序员,不愿分享的程序员,还有经验不足的程序员。当你遇到这几种程序员时,你自己要谦虚。无所不知的程序员,更想当一个英雄而不是团队成员;保守的程序员则是在编写着他们独享的代码;而经验不足的程序员则会每十分钟就来问你一下,当代码完成后,代码已经是你的,而不是他们。
  17. 任何项目都不会那么简单。朋友、家人和同事曾请求我仓促做一些事情,仓促做一个程序或者网站。对于这样的事,应该从双方做计划,才能做出令两方都会满意的东西。如果某人起初只是需要一个使用Microsoft Access的、只有有3个页面的网站,但来就很可能变成一个有15个页面的网站,并使用SQL Server,有一个论坛,还有一个定制的CMS(内容管理系统)。
  18. 任何时候不要想当然。假如你承接一个简单的项目,你可能会认为某个部分可以轻松完成。千万别这样想!除非你有一个类、组件、或者一段已经写好的代码,并且在现有的项目已经测试通过。不要认为这将是很容易的。
  19. 没有已经完成的软件。曾经有一位程序员告诉我,没有软件是已经完成的,它只是“暂时完成了”。这是明智的忠告。如果客户还在使用你写的程序,并经受了时间的考验。如果有机会,你仍在更新它,这并不是什么坏事,这让你不断地前行。
  20. 耐心是一种美德。当客户、朋友或家庭成员用电脑的时候,他们也许会受挫,进而想砸电脑,或气冲冲地离开。我一直在告诉他们,“是你掌控电脑,不是电脑掌控你。”对于用作编程的电脑,你要有一定的耐心。一旦程序员知道问题所在后,他们就会站在电脑的角度看问题,并且说 “哦,这就是为什么它是这样做。”
来源:http://bbs.xidian.edu.cn/viewthread.php?tid=42070
今天配置一台server的php支持curl的时候, 出现如下报错

    checking for cURL in default path… not found
    configure: error: Please reinstall the libcurl distribution -
    easy.h should be in /include/curl/

其实就是curl的dev包没有安装, 解决方案:
终端下

    # yum -y install curl-devel

然后就可以继续了

suse enterprise 10 sp2: 注意依赖关系的先后:
root@172.25.39.117:~/webserver/software# rpm -ihv libidn-devel-0.6.0-14.2.i586.rpm
Preparing...                ########################################### [100%]
   1:libidn-devel           ########################################### [100%]
root@172.25.39.117:~/webserver/software# rpm -ihv curl-devel-7.15.1-19.7.i586.rpm
Preparing...                ########################################### [100%]
   1:curl-devel             ########################################### [100%]
来源:http://www.hao32.com/webserver/191.html
suse enterprise 10得找到当时的源码包才行,如下:
SUSE LINUX Enterprise Server 9 for x86

header files and libraries for curl development
Version:   7.11.0
Release:   39.1
Medium:   CD3
Path:   /suse/i586/curl-devel-7.11.0-39.1.i586.rpm
Group:   Development/Libraries/C
License:   MPL
Size:   334 KB
Homepage:   http://curl.haxx.se/
来源:http://www.novell.com/products/linuxpackages/enterpriseserver/i386/curl-devel.html

RPM Search:
http://rpm.pbone.net/index.php3/stat/4/idpl/3084452/dir/suse_10.x/com/curl-devel-7.15.5-1.guru.suse100.i686.rpm.html
http://rpm.pbone.net/
PHP在很多时候不适合做常驻的SHELL进程, 他没有专门的gc例程, 也没有有效的内存管理途径. 所以如果用PHP做常驻SHELL, 你会经常被内存耗尽导致abort而unhappy.
而且, 如果输入数据非法, 而脚本没有检测, 导致abort, 也会让你很不开心.
那? 怎么办呢?
多进程….
为什么呢?
优点:
1. 使用多进程, 子进程结束以后, 内核会负责回收资源
2. 使用多进程,子进程异常退出不会导致整个进程Thread退出. 父进程还有机会重建流程.
3. 一个常驻主进程, 只负责任务分发, 逻辑更清楚.
Then, 怎么做呢?
接下来, 我们使用PHP提供的POSIX和Pcntl系列函数, 来实现一个PHP命令解析器, 主进程负责接受用户输入, 然后fork子进程执行, 并负责回显子进程的结束状态.
代码如下, 我加了注释

#!/bin/env php
<?php
/** A example denoted muti-process application in php
* @filename fork.php
* @touch date Wed 10 Jun 2009 10:25:51 PM CST
* @author Laruence<laruence@baidu.com>
* @license http://www.zend.com/license/3_0.txt   PHP License 3.0
* @version 1.0.0
*/
/** 确保这个函数只能运行在SHELL中 */
if (substr(php_sapi_name(), 0, 3) !== 'cli') {
    die("This Programe can only be run in CLI mode");
}
/**  关闭最大执行时间限制, 在CLI模式下, 这个语句其实不必要 */
set_time_limit(0);
$pid  = posix_getpid(); //取得主进程ID
$user = posix_getlogin(); //取得用户名
echo <<<EOD
USAGE: [command | expression]
input php code to execute by fork a new process
input quit to exit
        Shell Executor version 1.0.0 by laruence
EOD;
while (true) {
        $prompt = "\n{$user}$ ";
        $input  = readline($prompt);
        readline_add_history($input);
        if ($input == 'quit') {
      break;
    }
        process_execute($input . ';');
}
exit(0);
function process_execute($input) {
        $pid = pcntl_fork(); //创建子进程
        if ($pid == 0) {//子进程
                $pid = posix_getpid();
                echo "* Process {$pid} was created, and Executed:\n\n";
                eval($input); //解析命令
                exit;
        } else {//主进程
                $pid = pcntl_wait($status, WUNTRACED); //取得子进程结束状态
                if (pcntl_wifexited($status)) {
                        echo "\n\n* Sub process: {$return['pid']} exited with {$status}";
                }
        }
}
  

来源:http://www.laruence.com/2009/06/11/930.html
以下这些tips,是我在实际工作中慢慢形成的,有些可能是不正确的,有些出于个人习惯,所以,千万不要把以下这些条当成什么标准,其中可能隐藏着天大的bug,代码可能正在病态的运行中,SO!请一定仔细的看过后想想,这么做的好处是什么?会产生怎样的负面影响?有问题特别欢迎你来和我讨论。这就是我写这篇文字的目的,希望能和大家多多交流,也希望不断完善自己,同时又能给大家一些帮助。


开发习惯和PHP代码:
1、准确的理解各种概念。现在的新东西层出不穷,望文生义和一知半解对开发工作有害无益;

2、代码美观,适当的空行、缩进,空格,这样能更容易理解代码段的意思;

3、一定要写注释,而且要恰当的注释,要不然后面的维护工作或者接手代码的人会痛哭不已;

4、静态方法、类访问权限、接口、抽象类应该综合起来使用,发挥各自特点;

5、不要复制粘贴,即使是要用到现成的代码,也要一行一行的审阅后,再加入到新项目,因为经验告诉我们,这太容易出错了,对于使用开源类这种大段代码更需要;

6、变量都要初始化;

7、不要只处理error,而忽略warning和notice,这可能会导致日后的莫名其妙的问题,项目在开发状态下应该是error_reporting( E_ALL  ^  E_NOTICE ),等到发布的外网生产环境时,应关闭所有错误报告display_errors=Off,error_reporting(0)网友 pAUL gAO分享了他们更合理的方案,error_reporting(E_ALL | E_STRICT),并且在生产环境中记录错误日志

8、记录一些必要的错误日志,比如写文件失败、写memcache失败,socket连接失败、读写数据库失败,日志能够帮助出现问题时的快速定位,外部生产环境我个人是强烈建议关闭所有错误报告的;

9、用try、catch捕获异常,对代码的健壮有帮助,常常在API接口中碰到,这样子显得友好多了;

10、双引号中出现的变量建议加上大括号,至于是”${nider}at gmail.com”还是”{$tom}at zendstudio.net”看个人习惯,我更喜欢后面一种;

11、尽量少的if else嵌套层数,也许你要表达一个非常复杂的逻辑算法,但这样做至少能让代码逻辑更清晰

12、多阅读网上开源项目的优秀代码(不是优秀项目的开源代码),吸取其中值得借鉴的地方

13、语言包用sprintf的格式化来做是多么惬意的一件事啊!

14、写缓存并不总是要先serialize一次的

15、AJAX传数据的时候,不要将数据库查出的数组直接json_encode后传给客户端,这样做不仅有一定的安全风险(字段名暴露),而且一些不需要的数据被传出浪费带宽,这条同样适用于API接口

16、要记得处理魔术变量,我的方法是直接关闭,当然也可以获取开关状态来避免传输数据被处理两次的问题

17、用$GLOBALS['var']代替global $var

18、不能轻易的die掉程序,尤其是在方法内部

19、require、require_once、include、include_once有着略微不同的应用场景

20、为了最大限度的使得写入缓存成功,可以结合重试次数+usleep,我一般重试3次,还不行那就记下一条log了

21、PHP的常量是个非常好的东西,很多开源项目中用一整个文件来定义要用到的常量

22、尽可能的使用绝对路径寻找文件

23、autoload是个很灵活的东西

24、最好用上set_error_handler和set_exception_handler,那显得你的项目更完美

25、PHP的引用类型是很高效的,在进行复杂运算时建议使用

26、@符号抑制错误是很耗性能的,因此尽可能的找到替代方案

MYSQL部分:
1、SQL语句用双引号,其中的值都用单引号,例如”INSERT INTO gril SET money=’{$iMaxMoney}’,age=’18′”

2、用mysqli扩展代替mysql扩展

2、用mysqli_real_escape_string和mysqli_escape_string处理传出sql语句中的变量

3、用mysqli_set_charset(mysqli->set_charset)代替 query “SET NAMES”

4、联合查询(JOIN)之前,考虑下各个表的数据量,不合适的话应该分开查,尤其是有缓存可用的时候

5、很多地方需要记录发生时间,但不是每一个表都需要,同样,不是每一个表都需要一个自增量作主键

6、很多时候为integer类型加上unsigned是很好的

7、INERT DELEYED、INSERT IGNORE、SELECT DISTINCT…这种语句通常有意想不到的好效果

8、varchar类型并不是不能超过255长度,而是超过了255,这个字段就不能建立索引了,所以,看你的实际需要了

暂时就想到这么多,等再想到的继续update吧。想到什么写什么,没有什么条理性,多多包涵了,如果这些对你有点滴帮助,那我就感到非常开心了。

最后一条终极建议就是——多和别人交流能够进步更快、更大!欢迎与我交流,留下你的宝贵意见。

来源:http://www.zendstudio.net/archives/some-php-development-tips-from-my-own/
服务器上共享了一部连载漫画,刚开始发现迅雷的盗链下载很厉害,就用 .htaccess 屏蔽了迅雷下载。而后来下载的人越来越多,其它多线程下载软件的威力也不容小视,Apache 平均每秒钟就要新开 3 个线程,遇到集群下载,还真有点吃不消。

平时,服务器上50来个进程在运行,耗内存480M左右;
下载集中的时候,服务器上300多个进程在运行(绝大多数是httpd),内存最高消耗1.5G,到达当前VPS允许使用的最大内存。
看来不对多线程下载进行限制是不行了,好在这个问题在 Apache 下解决起来并不是难事。不想重新编译 httpd,就用 DSO 模式安装非官方mod_limitipconn:

wget http://dominia.org/djao/limit/mod_limitipconn-0.23.tar.bz2
tar xjvf mod_limitipconn-0.23.tar.bz2
cd mod_limitipconn-0.23
make
make install

这里安装的版本是适合 Apache 2.2.X 的,理论上也可以用在 Apache 2.0.X 上,如果更老的 Apache 1.3,自己去看吧….mod_limitipconn.c。

安装好后需要编辑 httpd.conf :

vim /usr/local/apache/conf/httpd.conf

找到 ExtendedStatus On 这行,如果前面有 # 号注解,就删除 #。

再搜索 mod_limitipconn.so 找到这行:

LoadModule limitipconn_module modules/mod_limitipconn.so

上面这行应该是在安装的过程中自动添加到 httpd.conf 里面的,保留,把如下内容添加到它的下面:

<IfModule mod_limitipconn.c>
<Location /Velvet_Kiss>
MaxConnPerIP 2
</Location>
</IfModule>

保存 httpd.conf 退出,重启Apache,就可以去测试效果了。

<Location /Velvet_Kiss>的意思是,Apache 只会限制 Velvet_Kiss 目录下同 IP 的链接数。比如,如果还有一个目录叫 /download,那么用户只能开 2 个线程下载 /Velvet_Kiss 目录下的文件,却可以开多线程下载 /download 目录下的文件。Linux 下 Apache 的目录结构通常是这样的,/home/user1/public_html/xxxx,设置限制多线程下载目录的时候,我们只需要 /xxxx 就可以了,不需要绝对路径。<Location />是对全站进行限制。

MaxConnPerIP 2 的意思自然是同 IP 下最多只能开启两个线程下载,其余的线程将遭遇“Service Temporarily Unavailable”。

Apache限制多线程下载的一些扩展命令:

NoIPLimit img/*
#表示对 img 文件夹不进行限制
OnlyIPLimit audio/mpeg video
#仅对声音/视屏等多媒体文件进行限制下载

来源:http://www.onepx.com/apache-limit-downloads.html
话说某日有见54chen真人秀,在六体膜拜之后,鉴于之前也有看过REST的一些东东,于是便有了本文,正文如下:
REST(Representational State Transfer表述性状态转移)是一种体系架构,它为客户端和服务器之间的数据交互提供了指导。它将客户/服务器通信这种计算模型抽象到了Web层面。
REST最早是在Roy Thomas Fielding博士的博士论文中提出的,REST是一种针对网络应用的设计和开发方式,是一种风格,可以降低开发的复杂性,提高系统的可伸缩性。
REST强调如下的体系架构概念。
  1、网络上的所有事物都被抽象为资源(resource);
  2、每个资源对应一个唯一的资源标识(resource identifier),
  3、通过通用的连接器接口(generic connector interface)对资源进行操作;
  4、对资源的各种操作不会改变资源标识;
5、所有的操作都是无状态的(stateless)。

REST对于信息的核心抽象是资源,一个资源是一组实体的概念上的映射,而REST使用一个资源标识符来标识组件之间交互所涉及到的特定资源。REST连接器提供了访问和操作资源的值集合的一个通用接口。在这里所有的操作中,它们都是无状态的,这样就不必在多个请求之间保存状态,不必考虑上下文的约束,从而允许服务器组件迅速释放资源,并进一步简化其实现,从而提高系统的可伸缩性。

现在我们就一个简单的示例演示下REST。
在我们的示例中以Javascript为客户端,与HTTP服务器体系架构配合工作,使用URL作为资源标识,并将HTTP作为连接器接口。
客户端的代码:


function rest() {
                var XMLHttpFactories = [
                    function () {return new XMLHttpRequest()},
                    function () {return new ActiveXObject("Msxml2.XMLHTTP")},
                    function () {return new ActiveXObject("Msxml3.XMLHTTP")},
                    function () {return new ActiveXObject("Microsoft.XMLHTTP")}
                ];
                var xmlhttp = false;
                for (var i = 0; i < XMLHttpFactories.length; i++) {
                    try {
                        xmlhttp = XMLHttpFactories[i]();
                    } catch (e) {
                        continue;
                    }
                    break;
                }
                // 建立XMLHttpRequest对象
                this.xmlhttp = xmlhttp;
            }
            rest.prototype._get = function(url, data) {
                var xmlhttp = this.xmlhttp;
                xmlhttp.open ('GET', url + "&" + data, false);
                xmlhttp.send (null);
                return xmlhttp.responseText;
            };
            rest.prototype._post = function(url,  data) {
                var xmlhttp = this.xmlhttp;
                xmlhttp.open ('POST', url, false);
                xmlhttp.setRequestHeader ("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
                xmlhttp.setRequestHeader ("Content-Length", data.length);
                xmlhttp.send (data);
                return xmlhttp.responseText;
            };
            rest.prototype.get = function(url, data) {
                url = url += "?op=GET";
                return this._get(url, data);
            }
            rest.prototype.post = function(url,  data) {
                url = url += "?op=POST";
                return this._post(url, data);
            }
            rest.prototype.put = function(url, data) {
                url = url += "?op=PUT";
                return this._post(url, data);
            };
            rest.prototype.del = function(url, data) {
                url = url += "?op=DELETE";
                return this._get(url, data);
            };
            function t() {
                var restobj = new rest();
                document.write (restobj.get("http://localhost/test/service.php", "content=GET Content"));
                document.write (restobj.post("http://localhost/test/service.php", "content=POST Content"));
                document.write (restobj.put("http://localhost/test/service.php", "content=PUT Content"));
                document.write (restobj.del("http://localhost/test/service.php",  "content=DELETE Content"));
            }
            t();


如上所示,我们在客户端创建XMLHttpRequest对象,并且通过这个对象实现通过HTTP对服务器的操作GET、PUT、POST和DELETE以检索和修改资源。HTTP则把对每一个资源的操作都限制在了4个之内:GET、POST、PUT和DELETE。HTTP的这四个方法分别对应我们常见的CRUD操作,具体对应关系如下 :
C(Create) <==> POST
R(Read/Retrieve) <==> GET
U(Update) <==> PUT
D(Delete/Destroy) <==> DELETE
虽然HTTP提供了这4个方法,但是在某些情况下,PUT和DELETE方法是不可用的,于是我们在这里使用GET方法和POST方法进行替代。另外,在JS操作时,需要注意同源策略(Same Origin Policy,SOP),考虑跨域的问题。
服务端代码:


<?php
/**
* REST后台程序简单示例
*/
class Resource {
    public function get($request) {
        echo 'content=', $request['content'], "; get resource Successful<br />";
    }
    public function post($request) {
        echo 'content=', $request['content'], "; post resource Successful<br />";
    }
    public function put($request) {
        echo 'content=', $request['content'], "; update resource Successful<br />";
    }
    public function delete($request) {
        echo 'content=', $request['content'], "; delete resource Successful<br />";
    }
}
$request = $_REQUEST;
$op = $request['op'];
$op = strtolower($op);
$ops = array(
    'get' => 1,
    'post' => 1,
    'put' => 1,
    'delete' => 1,
        );
if (!isset($ops[$op])) {
    die('input error!');
}
$resource = new Resource();
$resource->$op($request);
?>


来源:http://www.phppan.com/2010/10/ajax-rest/
背景:原因很简单,需要交换两块网卡的原因是mysql是Lamp打包软件的一个配置好的多网卡,应对两个网卡已经配置好了,而我是虚拟机,只能装一块网卡,于是否,出现如下问题:

linux-Jack-Xiang:/usr/local/mysql/bin # ./mysqld_safe --user=mysql
eth1: error fetching interface information: Device not found
./mysqld_safe: line 24: [: !=: unary operator expected

我就需要换网卡了,或者修改eth0到eth1,呵呵。当然也可以修改mysql配置。阅读全文
Total Commander必知快捷键
复制文件——F5
同目录复制——Shift + F5
剪切——F6
重命名文件——Shift + F6
批量重命名——F1或Ctrl + M
排序
按名称——Ctrl + F3
按扩展名——Ctrl + F4
按日期——Ctrl + F6
按大小——Ctrl + F5
取消排序——Ctrl + F7
窗口显示方式设置
显示文件名和扩展名——Ctrl + F1
显示详细信息——Ctrl + F2
显示目录树——Ctrl + F8
预览窗口——Ctrl + Q
刷新窗口中的内容——Ctrl + R
显示文件或文件夹大小——空格
--------------------------------------------------------------------------------
F1——批量重命名
F2——选定文件名
F3——用TC内置的关联程序快速查看文件内容
F4——编辑文件内容——
F5——从一侧窗口复制选定文件到另一侧窗口中的当前文件夹
F6——从一侧窗口剪切选定文件到另一侧窗口中的当前文件夹;重命名时删除完整的路径只保留文件名即可
F7——新建文件夹,名称默认为当前选定文件/文件夹的名称
F8——删除文件
F9——张学思版,复制文件名
F10——张学思版,比较文件内容
F11——张学思版,选定当前目录下同类型所有文件
F12——张学思版,复制选定文件的完整路径
--------------------------------------------------------------------------------
Ctrl+F1——列表模式显示文件,仅显示文件名
Ctrl+F2——显示文件详细信息(默认正常模式)
Ctrl+F3——按照文件名排序
Ctrl+F4——按照文件扩展名排序
Ctrl+F5——按照文件日期排序
Ctrl+F6——按照文件大小排序
Ctrl+F7——不排序
Ctrl+F8——显示文件树。切换到该模式后需要通过Ctrl+F1 或Ctrl+F2换到正常模式
Ctrl+F9——打印文件
Ctrl+F10——显示所有文件
Ctrl+F11——显示可执行文件
Ctrl+F12——自定义显示文件类型
--------------------------------------------------------------------------------
Shlift + F1——设置自定义列显示模式
Shlift + F2——张学思版,选定所有文件
Shlift + F3——张学思版,以lister显示文件
Shlift + F4——新建文本文档
Shlift + F5——同一目录内复制文件
Shlift + F6——重命名文件
Shlift + F7——比较左右两个窗口中的文件
Shlift + F8——张学思版,彻底删除文件
Shlift + F9——暂无
Shlift + F10——显示关联试图,类似于鼠标右键的效果
SSI固然不能替代CGI或者其他动态页面技术,但它是在页面中插入众多小型的动态片段的优秀方法,而无须大量额外的操作。
粘贴部分,如下:
包含一个CGI程序的输出结果
这也是SSI很常见的一个用途:包含一个CGI程序的输出,比如人人喜欢的"点击计数器"。

<!--#include virtual="/cgi-bin/counter.pl" -->

包含一个标准页脚
当你管理一个拥有许多页面的站点,你会发现对所有页面同时做改动是很痛苦的,尤其是在试图对所有页面维持某种标准视觉效果的时候。

使用包含一个页眉/页脚的方法,可以减轻修改的负担。你只要制作一个页脚文件,并用include命令包含到每个页面即可。include元素能按file属性或virtual属性判断应该包含的文件。file属性是一个相对于当前目录的文件路径,即不能是一个绝对路径(以"/"开头)或包含"../"的路径。virtual属性可能更有用,它是一个相对于被提供的文档的URL ,可以以"/"开头,但必须与被提供的文档位于同一服务器上。

<!--#include virtual="/footer.html" -->


来源:http://www.phpchina.com/resource/manual/apache/howto/ssi.html
【创业邦讯】周鸿祎认为,在中国做天使投资人比美国难做。美国这么多年天使投资人标准还是10万美金,这是中国10年前的标准,而现在在中国投一个初创项目没有100万美金很难起步,特别是互联网公司。究其原因,一是小公司雇人很难,大公司给点股票就把小公司的团队收购了。第二,中国互联网用户都被人控制了,"连我这样都被打的头破血流,更不要谈这些创业者了。"

  周鸿祎是在12月1日由《创业邦》杂志主办的2010年创业邦年会上发表上述观点的,此次会议的主题是"2010:创新+成长",暨"创业邦100 "年度颁奖盛典。值得一提的是,周鸿祎是2009年创业邦评选的年度创业人物。

  在周鸿祎眼里,小公司靠抄袭没有出路的,一定会淹没在众多的克隆者中间,如果敢抄袭大公司的商业模式,一没有钱,二没有人,三没有商业资源,如果不能标新立异、与众不同,你抄袭大公司没有意义。所以作为新的创业公司,一定要把创新变成你的文化,要忍受住抄袭的诱惑,做微创新。

  何谓微创新?周鸿祎的定义是:一,大道至简。今天已经是消费者驱动的世界里,不是比拼有多少种功能,有多少奇妙的技术,只是看能为用户创造什么价值,能不能用。怎么让产品变得更加简单也是一种创新。二,聚焦。有很多成功的东西不是很均衡的,都是一点打动用户内心,但是其他的很粗糙,大家觉得这个东西很好,那赶快加大投入,再乘胜追击。三,不要做平台。做平台的人,往往是很有经验的人,有些创业者没有经验反而容易聚焦,有些有经验的人最容易犯这样的错误,经常从产业宏观的角度看问题,比如谈3G的未来趋势。而实际上用户不关心产业整合,用户只问拿来产品能有什么用。

  周鸿祎还强调,创业者迈出的第一步很重要,而第一步就从用户出发:解决用户的一个问题,要么让用户觉得很爽,要么觉得很开心,要么很便宜,总之是解决了一个巨大的问题。一个用户体验的提升可以翘动大市场,所有成功的公司都是从细微的点开始切入的。这个点也可以理解是微创新。

  所以,公司小、结构扁平的情况下,每个人都要把自己当成客服经理、产品经理去倾听用户的声音,形成自外而内、自下而上的方式。周鸿祎说,"我就是360最大的产品经理。"

  昨日,奇虎360对外发布了新的杀毒软件产品,仍坚持免费。这是奇虎360和腾讯QQ发生纠纷后首次推出的新产品。据介绍,这款新产品创造了杀毒软件四引擎模式。奇虎360董事长周鸿祎表示,不会因3Q大战放弃隐私保护的产品开发。奇虎近期还更改了标志,周鸿祎说,"原来的标志太过有棱角,新改后的标志会更加温和。而且以后不会只考虑用户利益,也会考虑别的公司的感受。"


来源:http://news.cyzone.cn/news/2010/12/02/176725.html
1, 插入排序算法
1.1 直接插入排序
/*
* Insert sort algorithm.
* O(n^2)
*
* 说明:该算法把要排序的元素分成,已排好的有序区和代排序区。
*       然后在代排序区中拿一个元素插入到有序区中,使得有序区
*       不断扩大,而代排序区不断减少。
*
*/

int insert_sort(int a[], int num)
{
    int i, j, key;
  
    for (i = 1; i < num; i++) {
        // 取一个代排序元素作为当前元素
        key = a[i];
        // 把i之前大于a[i]的元素向后移动一个位置,注意边界;
        for (j = i; j > 0 && a[j-1] > key; j--) {
            a[j] = a[j - 1];
        }  
        // 在合适的位置安放当前元素,此时j就是合适的位置,因为j以前的元素都比当前元素小
        a[j] = key;
    }  
      
    return OK;
}

1.2 希尔排序
/*
* Shell sort.
*/
int shell_sort(int a[], int len)
{
    int gap, i, j, temp;
      
    for (gap = len/2; gap > 0; gap /= 2) {  //gap 是增量
        for (i = gap; i < len; i++) {       //对增量值为gap的元素进行插入排序
            temp = a[i];
            for (j = i; j >= gap; j-=gap) {
                if (temp < a[j - gap])
                    a[j] = a[j - gap];
                else
                    break;
            }  
            a[j] = temp;
        }  
    }  
    return OK;
}

   分析: 先取一个小于n的整数d1作为第一个增量,把文件的全部记录分成d1个组。所有距离为dl的倍数的记录放在同一个组中。先在各组内进行直接插人排序;然后,取第二个增量d2<d1重复上述的分组和排序,直至所取的增量dt=1(dt<dt-l<…<d2<d1),即所有记录放在同一组中进行直接插入排序为止。
  该方法实质上是一种分组插入方法。


2, 交换排序
2.1 冒泡排序
/*
* 冒泡排序
* 每一趟把最大的元素沉到最后去.
*/
int bubble_sort(int a[], int len)
{
    int i, j, tmp;

    // 0...len是无序区
    for (i = 0; i < len; i++) {     //最多做len-1趟排序
        for (j = len - 1; j > i; j--) {  //对当前无序区a[i..len-1]自下向上扫描
            if (a[j] < a[j-1]) {    //把最小的元素交换到i位置,并把i加1
                tmp = a[j];
                a[j] = a[j-1];
                a[j-1] = tmp;
            }
        }
    }

    return OK;
}

分析:由于该算法每趟都要经过n步的比较,而一共要进行n次这样的比较;所以时间复杂度为: O(n^2)

2.2 快速排序
   快速排序是一种分治的递归算法.将数组S排序的基本算法由以下四步组成:
   1) 如果S中元素个数是0或1,返回
   2) 取S中任一元素v,称为枢纽元素
   3) 将S分为两个不相交的集合,一个S1={x>v} 一个全S2={x<v}
   4) 返回 quicksort(S1),继续v,继而quicksort(S2)
对于第3步枢纽元素的选择,选择好的枢纽元素将会大大提高程序的效率,所以如何选择好的枢纽元素,成为一个设计上的决策.
.如何选择枢纽元素?
  常用的想法是直接选择第一个元素作为枢纽元素,但是有时候第一个元素并不是最好的,会造成算法整体效率下降,这里<参考1>给出一种选择枢纽元素的策略:
三数中值分割法选择枢纽元素: 即使用数组最左端和最右端以及中心元素三个元素的中间值作为枢纽元素.

  



待续...

参考书籍:
1,<<数据结构与算法分析>>  Mark Allen Weiss
2,<<数据结构>> 严蔚明 <<数据结构 c语言描述>> 高一凡
http://student.zjzk.cn/course_ware/data_structure/web/PAIXU/paixu8.2.2.1.htm
这里收集了平时awk的一些问题:阅读全文
昨天配置好两块网卡可以同时上网.但安装完active directory 后,电脑在启动到正在准备网络连接很慢很慢.终于启动后,我查看了一下日志事件.就是在访问DNS的时候时间比较长.

   真是奇怪,我只有两快网卡,但日志上还有一快,真是莫名其妙.后来才知道,原来我安装了emule后产生了虚拟网卡.

想办法删掉.是在我的电脑右击属性--在设备管理器---查看-- 显示隐藏的设备-把那个虚拟的网卡卸载.

启动快多了.爽!

你可以通过这个链接引用该篇文章:http://janeluo520.bokee.com/viewdiary.11963901.html


aptitude install sysutils
行末:
DOS 格式 0d 0a
UNIX 格式 0a

可用功能相同的指令組合
dos2unix:
sed -i'' "s/\r//" file

cat file | col -b > newfile

cat file | tr -d "\r" > newfile

cat file | tr -d "\015" > newfile

unix2dos:
sed -i'' "s/$/\r/" file

sed -i'' "s/$/\x0d/" file

-i后面的是单引号组成

以上适用 GNU sed, FreeBSD 下的 sed 不适用!

sed -i'' "s/$/\r/" file  

Suse enterprises 10 sp2下面:Unix2dos没有找到,不知是没有???用上面这个sed命令就行了。

来源:http://www.5dlinux.com/article/11/2008/linux_22280.html
一、引言 Daemon程序是一直运行的服务端程序,又称为守护进程。
本文介绍了在Linux下编写Daemon程序的步骤,并给出了例子程序。
二、Daemon程序简介 Daemon是长时间运行的进程,通常在系统启动后就运行,在系统关闭时才结束。一般说Daemon程序在后台运行,是因为它没有控制终端,无法和前台的用户交互。Daemon程序一般都作为服务程序使用,等待客户端程序与它通信。我们也把运行的Daemon程序称作守护进程。
三、Daemon程序编写规则
编写Daemon程序有一些基本的规则,以避免不必要的麻烦。
1、首先是程序运行后调用fork,并让父进程退出。子进程获得一个新的进程ID,但继承了父进程的进程组ID。
2、调用setsid创建一个新的session,使自己成为新session和新进程组的leader,并使进程没有控制终端(tty)。
3、改变当前工作目录至根目录,以免影响可加载文件系统。或者也可以改变到某些特定的目录。
4、设置文件创建mask为0,避免创建文件时权限的影响。
5、关闭不需要的打开文件描述符。因为Daemon程序在后台执行,不需要于终端交互,通常就关闭STDIN、STDOUT和STDERR。其它根据实际情况处理。
另一个问题是Daemon程序不能和终端交互,也就无法使用printf方法输出信息了。我们可以使用syslog机制来实现信息的输出,方便程序的调试。在使用syslog前需要首先启动syslogd程序,关于syslogd程序的使用请参考它的man page,或相关文档,我们就不在这里讨论了。
四、一个Daemon程序的例子 编译运行环境为Redhat Linux 8.0。
我们新建一个daemontest.c程序,文件内容如下:

#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <stdio.h>
#include <syslog.h>
#include <signal.h>
int daemon_init(void)
{
    pid_t pid;
    if((pid = fork()) < 0) return(-1);
    else if(pid != 0) exit(0); /* parent exit */
    /* child continues */
    setsid(); /* become session leader */
    chdir("/"); /* change working directory */
    umask(0); /* clear file mode creation mask */
    close(0); /* close stdin */
    close(1); /* close stdout */
    close(2); /* close stderr */
    return(0);
}
void sig_term(int signo)
{
    if(signo == SIGTERM)
    /* catched signal sent by kill(1) command */
    {
        syslog(LOG_INFO, "program terminated.");
        closelog(); exit(0);
    }
}
int main(void)
{
    if(daemon_init() == -1)
    {
        printf("can't fork self\n"); exit(0);
    }
    openlog("daemontest", LOG_PID, LOG_USER);
    syslog(LOG_INFO, "program started.");
    signal(SIGTERM, sig_term); /* arrange to catch the signal */
    while(1) { sleep(1); /* put your main program here */ }
    return(0);
}

使用如下命令编译该程序: gcc -Wall -o daemontest daemontest.c编译完成后生成名为daemontest的程序,执行./daemontest来测试程序的运行。
使用ps axj命令可以显示系统中已运行的daemon程序的信息,包括进程ID、session ID、控制终端等内容。
部分显示内容:
PPID PID PGID SID TTY TPGID STAT UID TIME COMMAND
1098 1101 1101 1074 pts/1 1101 S 0 0:00 -bash 1 1581 777 777 ? -1 S 500 0:13 gedit 1 1650 1650 1650 ? -1 S 500 0:00 ./daemontest 794 1654 1654 794 pts/0 1654 R 500 0:00
ps axj 从中可以看到daemontest程序运行的进程号为1650。
我们再来看看/var/log/messages文件中的信息: Apr 7 22:00:32 localhost
daemontest[1650]: program started.
显示了我们在程序中希望输出的信息。
我们再使用kill 1650命令来杀死这个进程,/var/log/messages文件中就会有如下的信息:
Apr 7 22:11:10 localhost daemontest[1650]: program terminated.
使用ps axj命令检查,发现系统中daemontest进程已经没有了。
五、参考资料
Advanced Programming in the Unix Environment W.Richard Stevens
来源:http://www.q.cc/2007/04/27/10980.html
代码:


#!/bin/bash
#author Sky
PATH="/var/PROGRAM/MANAGEMENT/modules/xbash:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:"
LANG=zh_CN
export PATH LANG

RESINHOME="/data/resin-pro-3.1.8"
PLUGIN_HOME=$RESINHOME/pconline_plugin

JAVAHOME="/usr/java/jdk1.6.0_06"

PLUGIN_MC="java_memcached-release_2.0.1.jar"
PLUGIN_LOG4J="log4j-1.2.15.jar"
PLUGIN_NAME="mcheathychk.jar"

#############enviroment initialize###################
[[ ! -e $JAVAHOME/jre/lib/ext/$PLUGIN_MC ]] && cp $RESINHOME/pconline_plugin/$PLUGIN_MC $JAVAHOME/jre/lib/ext/
[[ ! -e $JAVAHOME/jre/lib/ext/$PLUGIN_LOG4J ]] && cp $RESINHOME/pconline_plugin/$PLUGIN_LOG4J $JAVAHOME/jre/lib/ext/
####################################################


############
# 主机信息 #
############
INTF=$(netstat -rn | tail -1 | awk '{print $NF}')
IP=$(ifconfig $INTF | awk '/inet addr/{ split($2,tmp,":") ; print tmp[2] }')
HOST_NAME=$(hostname --short)

##########
#邮件环境#
##########
#CHARTSET="zh_CN."
MAIL_CLIENT=""
MAIL_SENDER=""
MAIL_SERVER=""
case $IP in
        192.168.230.*|192.168.1[0-1].*|192.168.238.*|202.9.1.*)
        MAIL_SERVER="202.2"
        ;;
        *)
        MAIL_SERVER="192.168.8."
        ;;
esac
##########

for resin in `cat /etc/mods.conf | grep resind | grep -v "#" | awk -F":" '{print $2}' | xargs`
do
   ######get relate configuration#####################
   JAVAHOME=`cat $resin  | grep "JAVA_HOME=" | awk -F"=" '{print $2}'`
   RESINHOME=`cat $resin  | grep "RESIN_HOME=" | awk -F"=" '{print $2}'`
   CONF_NAME=`cat $resin  | grep "SEARCH_STR=" | awk -F"=" '{print $2}' | sed 's/\"//g'`
   APP_HOME=`cat $RESINHOME/conf/$CONF_NAME | grep "<web-app id=\"/\" root-directory=\"" | awk -F"=" '{print $3}' | sed "s#\"##g" | sed "s#/>##g"`
   CONF_MC=$APP_HOME/WEB-INF/classes/memcached.properties
   ###################################################
   if [[ -e $CONF_MC ]] ;  then
      servers=`cat $CONF_MC | grep "servers" | awk -F"=" '{print $2}'`
      for server in `echo $servers | awk -F"," '{for( i=0;i<$NF;i++) {print $((i+1))}}' | xargs`
         do
             #echo $server
             echo $server |  awk -F":" '{print $1,$2}' | \
                   while read dip port
                   do
                       if  /sbin/iptables -nL | grep -q "$dip"
                       then
                         ######解封###############
                         /sbin/iptables -D OUTPUT -p tcp -s $IP -d $dip --dport $port -j REJECT --reject-with tcp-reset 2> /dev/null
                      fi
                   done
             ##############Test Memcache################
             stats=`$JAVAHOME/bin/java -jar $RESINHOME/pconline_plugin/$PLUGIN_NAME $server 2> /dev/dull`
             #echo "stats="$stats
             if [[ $stats == "MCOK" ]] ; then
                   agentname=`echo $resin | awk -F"_" '{print $2}'`
                   echo "mcchk_$agentname=0"
             else
                   agentname=`echo $resin | awk -F"_" '{print $2}'`
                   echo $server |  awk -F":" '{print $1,$2}' | \
                   while read dip port
                   do
                      /sbin/iptables -A OUTPUT -p tcp -s $IP -d $dip --dport $port  -j REJECT --reject-with tcp-reset
                   done
                   echo "mcchk_$agentname=1"
                   echo $agentname"_"$server"  is bad" |  env MAILRC=/dev/null charset="$CHARTSET" from="$MAIL_SENDER" smtp="$MAIL_SERVER" \
                   nail -n -s "$HOST_NAME($IP)MC had bad information" $MAIL_CLIENT
             fi
         done
   else
     agentname=`echo $resin | awk -F"_" '{print $2}'`
     echo "mcchk_$agentname=0"
     break
   fi
done

来源:http://blog.chinaunix.net/u2/84280/showart_2311724.html
Mysql主从同步延迟受到多种因素影响, 比如大事务, 从库查询压力, 网路延迟等; 这些比较常见; 但还受到主从机器系统时钟差的影响,这一点可能容易被忽视。

总结一点导致主从库出现延迟的原因有可能是:大事务、从库查询压力大、网络本身有延迟。另外一点就是主从时钟的影响。即系统时间受到了影响!

查看的参数:Seconds_Behind_Master

这个参数有两种理解
一种理解是来源于Mysql手册上的描述,大体意思是这个时间是从库SQL线程处理的最近的日志事件的时间戳减去从库IO线程处理的最近一条日志记录的时间戳得到的, 可以简单理解为从库SQL线程与IO线程所处理的最近的日志事件的时间戳差;这个计算方式给人的感觉不是在计算主从延迟,而是在计算从库上两个线程的处理的日志的时差。

另一种理解来源于《High Performace Mysql》上的的描述,大体意思这个参数反映的结果是当前系统时间减去从库IO线程所处理的最近一条日志记录的时间戳;但这个说法有一个明显的不太让人信服的地方,就是如果机器的系统时间相差比较大怎么办? 显然, 如果系统时间相差比较大的话,以这样的方式计算主从延迟毫无意义。

通过查看源码发现这个值应该是这样理解的:
这个值是通过在主库上执行SELECT UNIX_TIMESTAMP()来取得主库的系统时间, 然后去减从库的当前系统时间。

原来系统时间差还真的对主从同步延迟参数Seconds_Behind_Master有影响。


那我就有一个疑问了。如果保证我的主从库的系统时间一致的话是不是就说我们主从复制延迟不存在呢?
那这种大事务、查询、那就不会影响到它了吗?

困惑。。。。

来源:http://blog.chinaunix.net/u2/84280/showart_2320627.html
ASP代码
'a=15
'b=20
'response.Write(a\b)                    '0       提取到整数部分
'response.Write(a/b)                    .75  提取到小数部分
'/浮点除法a/b       \整数除法a\b
a=35
b=20
'response.Write(a\b)                    '1       整数部分
response.Write(a/b)                     '1.75    带小数
PHP代码
$a=15;
$b=20;
echo floor($a/$b);          //0
echo $a/$b;                 //0.75
$a=35;
$b=20;
echo floor($a/$b);          //1
echo $a/$b;                 //1.75
实现的功能一样的

来源:http://blog.chinaunix.net/u2/84280/showart_2357507.html
php中的ssh2模块学习
阅读全文
参见手册 date()与strtotime()
date("Y-m-d H:i:s")
CURRENT_TIMES*****P()  or  NOW()
DATE_FORMAT(date,format)
now()  curtime() datetime()

mysql> select now();
+---------------------+
| now()               |
+---------------------+
| 2010-11-29 11:14:55 |
+---------------------+
1 row in set (0.00 sec)

mysql> select curtime();
+-----------+
| curtime() |
+-----------+
| 11:14:31  |
+-----------+
1 row in set (0.00 sec)

实例
下面的脚本使用 DATE_FORMAT() 函数来显示不同的格式。我们使用 NOW() 来获得当前的日期/时间:

DATE_FORMAT(NOW(),'%b %d %Y %h:%i %p')
DATE_FORMAT(NOW(),'%m-%d-%Y')
DATE_FORMAT(NOW(),'%d %b %y')
DATE_FORMAT(NOW(),'%d %b %Y %T:%f')
结果类似:

Dec 29 2008 11:45 PM
12-29-2008
29 Dec 08
29 Dec 2008 16:25:46.635


题目内容:


1、MySQL取得当前时间的函数是?,格式化日期的函数是
2、写出 SQL语句的格式 : 插入 ,更新 ,删除
表名User
Name Tel Content Date
张三 13333663366 大专毕业 2006-10-11
张三 13612312331 本科毕业 2006-10-15
张四 021-55665566 中专毕业 2006-10-15
(a) 有一新记录(小王 13254748547 高中毕业 2007-05-06)请用SQL语句新增至表中
(b) 请用sql语句把张三的时间更新成为当前系统时间
(c) 请写出删除名为张四的全部记录
3、请写出数据类型(int char varchar datetime text)的意思; 请问varchar和char有什么区别
4、MySQL自增类型(通常为表ID字段)必需将其设为(?)字段
5、以下请用PHPMYADMIN完成
(一)创建新闻发布系统,表名为message有如下字段

id 文章id
title 文章标题
content 文章内容
category_id 文章分类id
hits 点击量

(二)同样上述新闻发布系统:表comment记录用户回复内容,字段如下

comment_id 回复id
id 文章id,关联message表中的id
comment_content 回复内容
现通过查询数据库需要得到以下格式的文章标题列表,并按照回复数量排序,回复最高的排在最前面
文章id 文章标题 点击量 回复数量
用一个SQL语句完成上述查询,如果文章没有回复则回复数量显示为0

(三)上述内容管理系统,表category保存分类信息,字段如下

category_id int(4) not null auto_increment;
categroy_name varchar(40) not null;
用户输入文章时,通过选择下拉菜单选定文章分类
写出如何实现这个下拉菜单