忧郁奔向冷的天忧郁奔向冷的天
撞落每滴小雨点
张开口似救生圈
实现雨的酸与甜
搓起心爱的香烟
弄着脚底的软垫
酒醉与心醉沟起污染一片
无心睡眠
脑交战
踏着旧日怀念昨天的你
夜是渗着前事全挥不去
若是你在明日能得一见
就让我在怀内重得温暖
忧郁奔向冷的天
活在我的心里边
始终只有你方可
令逝去的心再甜
(音乐伴奏)
忧郁奔向冷的天
撞落每滴小雨点
张开口似救生圈
实现雨的酸与甜
搓起心爱的香烟
弄着脚底的软垫
酒醉与心醉沟起污染一片
无心睡眠
脑交战
踏着旧日怀念昨天的你
夜是渗着前事全挥不去
若是你在明日能得一见
就让我在怀内重得温暖
忧郁奔向冷的天
活在我的心里边
始终只有你方可
令逝去的心再甜
(音乐伴奏)
无心睡眠
脑交战
踏着旧日怀念昨天的你
夜是渗着前事全挥不去
若是你在明日能得一见
就让我在怀内重得温暖
忧郁奔向冷的天
活在我的心里边
始终只有你方可
令逝去的心再甜
忧郁奔向冷的天
活在我的心里边
始终只有你方可
令逝去的心再甜
忧郁奔向冷的天
http://www.phpe.net/articles/380.shtml
cookbook:http://www.kksou.com/php-gtk2/
http://www.youku.com/playlist_show/id_1167730.html
蜀山奇侠之仙侣奇缘
One way in, one way out. One thousand guards and one prisoner。
入口只有一个,出口,还是只有一个。守卫千百,只为一囚。

尽管是动画,但是觉得拍得好就是拿钱到电影院去看也值得,尽管看了个D版,分为两次看完,得到三条结论:
1.这个世界没有什么秘方,只有你相信它,你就会是,就会很成功./(主观了点)
2.人人都想得到什么秘籍,但是最终大家都是空悲叹,其实也就是没有什么直路可走,大家都一样。
3.对于同一件事情的发生会有不同的看法,比如:里面的太郎,一心想得到那个秘籍,最后得到了,却看到的是什么都没有,而很失落,而熊猫悟出了一个道理,那就是你就相信你能,你就能!
   Last:搞笑的是结束时候,我发现那个熊猫和它师傅好像长得一样,也从某种意义上说明了,并不是所有人都能达到一个很高的武功修为,除了你和那些高手是一个系统的,包括各种行为和长相,呵呵呵!
                                                                                        向东
                                                                                            2008-6-26
http://dl.360safe.com/setupbeta.exe
http://dl.pconline.com.cn/html_2/1/66/id=42941&pn=0&linkPage=1.html
/usr/bin/rsync -vzrtup ./video_user_20080625_004312.txt 10.69.2.48::usersource_video/

aoyuntongji.php

<?php
require_once ("/data0/vshare/app/rank/config.php");
define("USER_SEARCH_IASK_LOG_PATH", "/data0/vshare/logs/user_search/iasks/");//删除的用户及视频日志目录(爱问)
echo "程序于 " . date("Y-m-d H:i:s") . " 开始执行:\n";
$date_d=date("d")-1;
if($date_d<10)
{
  $date_d="0".$date_d;
}
$iask_filename = USER_SEARCH_IASK_LOG_PATH.date("Ym")."/".$date_d."/boke_ay_" . date("Ymd", strtotime("-1 day")) .".log";
$iask_filename_html = USER_SEARCH_IASK_LOG_PATH.date("Ym")."/".$date_d."/boke_ay_" . date("Ymd", strtotime("-1 day")) .".html";
$conn_db_3306_r = @mysql_connect(DBHOST_VIDEO_R_aoyun, DBUSER_VIDEO_R_aoyun, DBPASSWD_VIDEO_R_aoyun) or
    die(DBHOST_VIDEO_R_aoyun.DBUSER_VIDEO_R_aoyun.DBPASSWD_VIDEO_R_aoyun."Can't connect to 3306 port readonly database");//长连接
//统计昨天登录过的用户个人中心信息
echo "正在从MySQL数据库中取出所有的用户userid,请稍候....";
//exit(0);
//$select_dt_user_r = @mysql_select_db("dt_video", $conn_db_3306_r) or die("Can't select database");
$select_dt_user_r = @mysql_select_db("dt_manage", $conn_db_3306_r) or die("Can't select database");
//$sql_tb_usertotal_r = "SELECT videoid,up_userid FROM tb_video_total where activeid = 0 limit 10";/*上线后打开*/
$starttime = date("Y-m-d 00:00:00", strtotime("-3 day"));
$endtime = date("Y-m-d 00:00:00");
$sql_tb_usertotal_r = "select videoid,up_userid from tb_video_activity where (adddate>'".$starttime."' or appr_time>'".$starttime."') and adddate<'".$endtime."' and appr_status=1 and active_status in(1,0) and conv_status=1 and del_status=0 and activeid=128;";/*上线后打开*/
$query_tb_usertotal_r = mysql_query($sql_tb_usertotal_r, $conn_db_3306_r) or die("Query Error:" .
    mysql_error() . "\n");
echo  $sql_tb_usertotal_r."\n";
echo "\n[取出所有的用户userid:完成]\n";
$i=0;
echo $iask_filename."\n";

if(file_exists($iask_filename))
{
    unlink($iask_filename);
}

while ($row_tb_usertotal_r = mysql_fetch_assoc($query_tb_usertotal_r))
{
     if (!($i % 2000))
    {
      sleep(1);        
    }
  $vid = $row_tb_usertotal_r['videoid'];
  $uid = $row_tb_usertotal_r['up_userid'];
  $result['vid'] = $vid;
  $result['uid'] = $uid;
  /*  
  echo "VID:". $result['vid'] = $vid."\n";
  echo "UID:".$result['uid'] = $uid."\n";
  */
  $content = getContent($result,$i);
  us_writeFile($content, $iask_filename, USER_SEARCH_IASK_LOG_PATH .date("Ym")."/".$date_d);
  $i=$i+1;
  
    
}
if (file_exists($iask_filename) && is_readable($iask_filename))
{
  echo "正在向爱问推送数据,请稍候....\n";
  //pclose(popen("touch {$iask_filename} && chmod 0664 {$iask_filename} && /usr/bin/rsync -vzrtup {$iask_filename} 10.69.2.48::usersource_video/",
        //"r"));
  $command="/usr/bin/rsync -avgt --progress --password-file=/usr/local/etc/rsyncd.secrets " . USER_SEARCH_IASK_LOG_PATH ."*"." backupuser@219.142.118.48::boke_2008_sum_olympic_video";
  echo $command."\n";
  pclose(popen("touch {$iask_filename} && chmod 0664 {$iask_filename} && $command",
        "r"));
  
  $command="/usr/bin/rsync -avgt --progress --password-file=/usr/local/etc/rsyncd.secrets " . USER_SEARCH_IASK_LOG_PATH ."*"." backupuser@172.16.153.70::olympic_video/";
  pclose(popen("touch {$iask_filename} && chmod 0664 {$iask_filename} && $command",
        "r"));
    $command="/usr/bin/rsync -avu " . $iask_filename ." 172.16.6.198::vblog/";
    pclose(popen("touch {$iask_filename} && chmod 0664 {$iask_filename} && $command",
        "r"));
    $command="cp {$iask_filename} {$iask_filename_html}";
    pclose(popen($command, "r"));
    $command="/usr/bin/rsync -avu {$iask_filename_html} {$iask_filename} 10.68.1.30::v_blog_sina_com_cn/htdocs/ay_data/";
    pclose(popen($command, "r"));
    $command="/usr/bin/rsync -avu {$iask_filename_html} {$iask_filename} 10.68.1.71::v_blog_sina_com_cn/htdocs/ay_data/";
    pclose(popen($command, "r"));
  
  echo "[推送完成]\n";
}



echo "\n[完成]\n";


echo "程序于 " . date("Y-m-d H:i:s") . " 执行结束。\n\n";

function us_path_validate($path)
{
    $arraypath = split("\/+", $path);
    $tmppath = "";
    for ($i = 0; $i < count($arraypath); $i++)
    {
        if ("" == $arraypath[$i])
            continue;
        $tmppath .= (0 == $i ? "":"/") . $arraypath[$i];
        if (!is_dir($tmppath))
        {
            if (!mkdir($tmppath, 0777))
            {
                return false;
            }
        }
    }
    return true;
}

function us_writeFile($content, $filename, $dirpath)
{
    if (!us_path_validate($dirpath))
        exit();
    $fp = fopen($filename, "a+");
    if (!@fwrite($fp, $content . "\n"))
    {
        @fclose($fp);
        return false;
    }
    fclose($fp);
    return true;
}

function getContent($result,$i)
{
  /*
         if($i==0)
  {
    $str  = "VID\tUID\t日期\n";
          $str .= $result['vid'] . "\t";//视频总量
          $str .= $result['uid'] . "\t";//userid,用户UID
          $str .= date("Y-m-d",strtotime("-1 day")). "";
    return $str;
  }else{
  */
    $str  = $result['vid'] . "\t";//视频总量
          $str .= $result['uid'] . "\t";//userid,用户UID
          $str .= date("Y-m-d",strtotime("-1 day"))   . "";
    return $str;
   //    }
}
?>


实践时发现:
在做shell执行:ls /data/htdocs/pro/logs/*
出现多个文件时,最好是对返回串进行:rtrim($returnStr,"\n");
再:explode($returnStr,"\n"); 这样就不会有空数组了。

Example:

<?php
error_reporting(E_ALL);
while(1)
{
        $handle=popen("more video_user_20080626_190223.txt|grep @docid:|wc","r");
        $read = fread($handle, 2096);
        echo $read;
        pclose($handle);
        sleep(1);
}

?>





二、调用PHP或其它语言有while(1)的特别注意点:
特别是调用串口的一直监控代码,尽可能要用到,读取返回值,否则就会启动不起来那个while的程序:


C:

vi  startAutoAnserSer.php
我首先要教你最重要的东西,就是怎样解决这个问题。当然,解决之后,你要补我的专家号,呵呵。(我有个熟人有40年牙龈出血的经历,可是它近年突然好了。你想知道原因吗?是我给了他一个新招)

⑴ 连服维生素C7天,每天100-300mg。(这个量不算多,意义你明白。)
⑵ 这7天内保持好睡眠,目的是调节好人的生理状态,使不容易感冒什么的,避免因发烧造成的微血管通透性能趋增,使容易出血。
⑶ 本条最重要:去药房买“阿奇霉素分散片”,买大厂出的,我建议买天津药业悦来牌的。每盒6片×0.25g,请单次口服4片,并详细阅读一下说明书。记住:只吃一次即可。若有严重的不良反应(极少有!!),带着这个药的说明书去看门诊,医生会处置。如果没有不良反应,可在48小时后把另2片吃了,仅此而已。
该药是目前极有名的药,4年前从国外进来现已完全本土化,真的是国外科学家对人类的大贡献!也不算贵,约20-30元1盒6片。主要用途是对付非淋菌性性病。
它是广谱抗菌药,更是☆靶向制剂☆。你明白这个吗?我说个白话以便你能听懂:这个药可跟随人的巨嗜细胞走。而巨嗜细胞又跟着炎症走,所以疗效显著。
⑷ 一般的牙科医生,都会建议你用利君沙和灭滴灵,外加维生素C和K。但我想你是老牙龈出血,这种药用过多次,不会太奏效,阿奇霉素毒副作用比上述两种都小,更重要的是你没用过,致病菌没有抗药性。
⑸ 炎症消除、出血停止之后,建议你去做一次牙垢清除。多年的出血肯定会导致牙根周围有比较多的牙垢,这些牙垢年复一年刺激着周围的牙龈,不但是细菌的温床,也使牙龈面持续受到创伤,牙龈出血还会卷土重来。
⑹ 此次牙龈炎症消除之后,口腔气味也会比以前好转,但牙根的一部分将暴露的比以前利害(以前被肿胀的牙龈包裹),产生龋齿的可能性将增加。因此要注意好口腔清洁。

附:
牙出血有多种原因造成,有的是牙石引起,有的是因为刷牙时用的力度不均和牙刷毛的硬度太大引起的,还有个别原因是内火导致的出血。
刷牙出血的原因有许多,有的时候是因为有牙结石,而有的时候则是血液系统出现了问题,白血病的前发症状就是牙出血。因此,刷牙出血不可小视,一定要到医疗机构就诊,看看到底是什么因素导致的。
口腔局部因素引起的牙龈出血最常见。多是由于口腔不清洁,使食物残渣、牙垢、牙石经常堆积在牙体周围,口腔内的各种细菌在此大量繁殖,导致牙龈炎而发生牙龈出血,病人常常伴有口臭。此外,其他牙龈病如牙龈瘤,由于血管异常丰富,在嚼东西时,瘤体因摩擦而溃破,也可引起出血。其他如刷牙方法不正确、残根(烂牙根)、残冠、制作不良的牙套、不良充填物等锐利的边缘刺激牙龈肿胀发炎均可引起牙龈出血。
所以首先要明确是什么原因引起的,病因不同治疗方法也不同

但就在上周我自已买了瓶专用SU口水,一盒专治牙周炎的药,竟然好了
$tomorrow = date("Y-m-d", mktime(0,0,0,4,1+1,2005));
  
$tomorrow = date("Y-m-d", mktime(0,0,0,date("m") ,date("d")+1,date("Y"))); //明天
  
$yesterday = date("Y-m-d", mktime(0,0,0,date("m") ,date("d")-1,date("Y"))); //昨天
  
$lastmonth = date("Y-m-d", mktime(0,0,0,date("m")-1,date("d"), date("Y"))); //上一个月
  
$nextyear = date("Y-m-d", mktime(0,0,0,date("m"), date("d", date("Y")+1)); //下一年
  
$today = date("Ymd",strtotime ("+1 day"));
  
$date1="2006-08-09″;
echo date(’Y-m-d’,strtotime("$date1 +5 day")); //相应地,要增加月,年,将day改成month或year即可
对着歌词敲滴:
无双
词:方文山 曲:周杰伦

苔藓绿了木屋 路深处 翠落的孟宗竹 乱石堆上有雾 这种隐居叫做江湖 箭矢漫天飞舞 竟然在城墙上遮蔽了日出 是谁 在哭 冲 你懂 你懂 你匆匆 有多少的 蛮力就拉 多少的弓 听我说武功 无法高过寺院的钟 禅定的风 静如水的松 我命格无双 一统江山 狂胜之中 我却黯然语带悲伤 我一路安营扎下蓬 青铜刀锋 不轻易用 苍生为重 我命格无双 一统江山 破城之后 我却微笑决不恋战 我等待异族望天空 歃血为盟 我等效忠 浴火为龙 残缺的老茶壶 几里外 马蹄上的尘土 升狼烟的城池 这种世道叫做乱世 那历史已模糊 刀上的锈却出土的很清楚 是我 在哭 序 你去 你去 你继续 我敲木鱼 开始冥想这场战役 我攻城掠地 想冷血你需要勇气挥剑离去 我削铁如泥 你去 你再去 你继续不敌我 致命的一击 远方的横笛 吹奏你战败的消息 保持着杀气 想赢得情绪 让我君临天下的驾驭 我命格无双 一统江山 狂胜之中 我却黯然语带悲伤 我一路安营扎下蓬 青铜刀锋 不轻易用 苍生为重 我命格无双 一统江山 破城之后 我却微笑决不恋战 我等待异族望天空 歃血为盟 我等效忠 浴火为龙 命格无双 一统江山 狂胜之中 我却黯然语带悲伤 我命格无双 一统江山 破城之后 我却微笑决不恋战 我等待异族望天空 歃血为盟 我等效忠 浴火为龙
1.需要移植crond和crontab

crontab使用大概有两种,一种是修改全局配置文件/etc/crontab,另一种是直接运行命令crontab -e.

全局配置没有详细测试,似乎直接运行crontab -e方便一些.

1.先把要加入定时任务的脚本写好

比如可以写test:

#!/bin/shzEmLinux联盟
cd /home/azEmLinux联盟
echo "Hello World!" > hellozEmLinux联盟
ls -l > mm

2.执行命令 crontab -e,此时系统会打开一个vi编辑器.

3.输入

59 23 * * *   /home/a/test

表示每天23:59运行脚本bakuplog.sh.前面的时间格式为“M H D m d cmd”。其中,M代表分钟(0~59),H代表小时(0~23),D代表天(1~31),m代表月(1~12),d代表一星期内的天(0~6,0为星期天)。*表示任何.例如01 * * * * 表示每小时的01分执行.

4.重新启动这个进程

/etc/init.d/cron restart

近日,北京大学北大未名BBS的热门话题版面上,题为“现在京户到底有多重要?”的帖子赫然跻身前十名,从300余个跟帖中可以看出,在临近毕业签约阶段,户口的热度仍在不断升温。
上周,中国青年报社会调查中心与腾讯网教育频道联合实施的一项调查(有3518人参与,九成以上是青年)显示,77.1%的人认为,找工作最好能解决户口,但户口不是决定性因素。同时,有11.1%的人认为,户口是其择业的决定性因素,一定要签能够解决户口的单位。
调查显示,在面临户口和高薪的选择中,75.1%的人会选择高薪但却解决不了户口的工作。但是,这并不意味着高薪工作都能够打动每一位应届大学生求职的心,有12.6%的应届大学生仍然会选择低薪、解决户口的工作,他们仍然宁为户口而折腰。
中国人民大学的一位研究生小余告诉记者,“我本科4年,研究生3年都在北京度过,已经对这个城市产生了留恋和归属感,我想留在北京工作发展,我会选择户口而不是高薪”,她的理由是,薪水可以随着时间、经验、职位的提升而增加,但是户口一旦打回原籍,成为非应届生,再想调出来就相当困难了。
在文章开头提到的热门帖子上,有人跟帖说,“对于月薪两三千的人,户口的价值是他三四年的薪水,当然非常重要。对于月薪两三万的人,户口也就是他三四个月的薪水,这就不是很重要。”一位名为“手可摘星”的网友更是将户口与薪水之间的关系进行了量化处理,“本科起薪满12万,硕士满18万,博士、MBA满24万,不需要考虑户口,本科起薪低于4万,硕士低于6万,博士、MBA低于9万,一定要有户口”。然而,近两年的就业形势日趋严峻,如果以他的标准来衡量,那么,能找到类似高薪工作的毕业生应该只占少数。
调查发现,当被问及应届大学生毕业年薪是多少才能弥补户口所带来的影响时,67.8%的人认为,年薪超过10万元以上才能弥补户口所带来的损失和影响,甚至,有14.6%的人认为,这个数字应该超过20万元。
户口与爱情,这两个貌似毫无关联的词语,却在严峻的就业现实下被紧紧拴在了一起。调查显示,38.9%的人坚持选择户口是因为“户口会带给我安全感和归属感”。在大学生中普遍存在着这样一种观点,如果没有户口,个人的终身大事都会受到牵连。男的娶不到,女的嫁不了。
“我目前单身,如果找的工作解决不了户口,恐怕连找对象都成问题。”北京某高校大四毕业生小杨对记者说,“在北京、上海、深圳这样的大城市,如果毕业不能落户口,始终会有一种漂泊的感觉,就像二等公民,与农民工差不多”。一位北京的单身女大学生告诉记者,“我要找另一半,优先考虑有北京户口的,这样我才有安全感,从长远考虑,可以免除许多麻烦和后顾之忧”。
在解决户口这个问题上,“小两口”有一定优势。
今年的应届毕业生小马告诉记者,为了让男朋友能够找到一份高薪工作,她选择了一个低薪带户口的工作,为了爱情和家庭的长远利益,她做出了让步和牺牲。
调查发现,与小马有同样境遇的人并非少数,25.6%的人选择户口正是出于“为配偶缓解择业压力”的考虑,事实上,这种选择使“小两口”分工明确,可以达到资源的有效整合,是一个理性的选择。
如果实在无法落户,14%的调查参与者会买户口来解决这个问题,44.9%的人持观望态度。
户口为什么会有如此巨大的吸引力,让大家不惜为此花费重金呢?78.5%的调查参与者认为,户口承载了太多的社会功能,越是大城市,户口背后捆绑的各种福利和特殊资源就越多。
73.1%的人选择户口是因为它和住房公积金、医疗保障、养老保险等诸多社会保障制度挂钩。62.7%的人是为了解决未来子女的教育平等问题。
1953年,为减少城市人口和就业压力,保障城市经济发展,国家开始制止农民盲目流入城市,限制了公民的自由迁徙。1984年,国务院批转公安部《关于农民进入城镇落户问题的通知》,文件规定,有经营能力、有固定住所或在乡镇企业单位长期务工的农村居民,公安机关应准予落城镇常住户口。城乡户籍的坚冰首次出现裂缝。但是时至今日,户籍制度仍然没有完全放开,很多没有户口的人在城市生活仍然要受到户籍的诸多限制。因此,近年来,要求户籍改革的呼声越来越大,在不久前结束的今年两会上,户籍制度改革的讨论仍然备受关注。
调查中,66.4%的人认为,户籍制度将在未来的5~15年内被取消。“户籍制度改革势在必行,但这是一个理性而复杂的过程,改革绝不等于取消和完全放开。”这位调查参与者呼吁,“户籍制度改革在两会上年年开花,但不要年年不结果。”
我已经在 10.210.71.254上安装了.    你可以直接测试.



webbench最多可以模拟3万个并发连接去测试网站的负载能力,个人感觉要比Apache自带的ab压力测试工具好,安装使用也特别方便。

1、适用系统:Linux

2、编译安装:

引用

wget http://blog.s135.com/soft/linux/webbench/webbench-1.5.tar.gz
tar zxvf webbench-1.5.tar.gz
cd webbench-1.5
make && make install


3、使用:

引用

webbench -c 500 -t 30 http://127.0.0.1/test.jpg

  参数说明:-c表示并发数,-t表示时间(秒)

4、测试结果示例:

引用

Webbench - Simple Web Benchmark 1.5
Copyright (c) Radim Kolar 1997-2004, GPL Open Source Software.

Benchmarking: GET http://127.0.0.1/test.jpg
500 clients, running 30 sec.

Speed=3230 pages/min, 11614212 bytes/sec.
Requests: 1615 susceed, 0 failed.
主要是要这个:
5000并发,请求数100w
ab -c 5000 -n 1000000 'http://10.70.62.28/riddle.php?iid=56764&qid=56866&uid=1
&reply=56867,56868'

5000并发,请求数100w:
ab -c 5000 -n 1000000 'http://10.71.183.167/question.js'

rpm -qf /usr/bin/nload
nload-0.7.4-1.el6.x86_64



ab压测了一下10.70.62.28(就是白天压测掉的厉害的那台),测试结果我觉得挺好的。

并发4000,完成100w请求
cpu负载5左右浮动

Complete requests:      1000000
Failed requests:        21659
请求失败数是21659,计算了一下,100个人里有2个人失败

Requests per second:    5986.29 [#/sec] (mean) 相当于LR中的tps,几乎就是6000了

Time per request:       668.193 [ms] (mean) 用户等待每个请求时间,668毫秒
Time per request:       0.167 [ms] 服务器处理每个请求时间 0.167毫秒

网卡流量-取最大值
进-112Mbps
出-86Mbps

单独统计了一下nginx日志中http状态
"200" 978350
"500" 21664
状态码是500有21664,符合ab的测试结果中的 Failed requests:        21659

单独以ip地址建的web虚机,压测的产生的ngxin访问日志、错误日志也是单独的,就是为了统计一下http状态码的数量,然后和ab结果进行对比。
__________________________________________


apache压力测试ab

ab是Apache超文本传输协议(HTTP)的性能测试工具。其设计意图是描绘当前所安装的Apache的执行性能,主要是显示你安装的Apache每秒可以处理多少个请求


ab是Apache超文本传输协议(HTTP)的性能测试工具。其设计意图是描绘当前所安装的Apache的执行性能,主要是显示你安装的Apache每秒可以处理多少个请求。

概要

ab [ -A auth-username ] [ -c concurrency ] [ -C cookie-name=value ] [ -d ] [ -e csv-file ] [ -g gnuplot-file ] [ -h ] [ -H custom-header ] [ -i ] [ -k ] [ -n requests ] [ -p POST-file ] [ -P proxy-auth-username ] [ -q ] [ -s ] [ -S ] [ -t timelimit ] [ -T content-type ] [ -v verbosity] [ -V ] [ -w ] [ -x <table>-attributes ] [ -X proxy[] ] [ -y <tr>-attributes ] [ -z <td>-attributes ] [http://]hostname[:port]/path


选项

-A auth-username:password
对服务器提供BASIC认证信任。用户名和密码由一个:隔开,并以base64编码形式发送。无论服务器是否需要(即, 是否发送了401认证需求代码),此字符串都会被发送。


-c concurrency
一次产生的请求个数。默认是一次一个。


-C cookie-name=value
对请求附加一个Cookie:行。 其典型形式是name=value的一个参数对。此参数可以重复。


-d
不显示"percentage served within XX [ms] table"的消息(为以前的版本提供支持)。


-e csv-file
产生一个以逗号分隔的(CSV)文件,其中包含了处理每个相应百分比的请求所需要(从1%到100%)的相应百分比的(以微妙为单位)时间。由于这种格式已经“二进制化”,所以比'gnuplot'格式更有用。


-g gnuplot-file
把所有测试结果写入一个'gnuplot'或者TSV (以Tab分隔的)文件。此文件可以方便地导入到Gnuplot, IDL, Mathematica, Igor甚至Excel中。其中的第一行为标题。


-h
显示使用方法。


-H custom-header
对请求附加额外的头信息。此参数的典型形式是一个有效的头信息行,其中包含了以冒号分隔的字段和值的对 (如, "Accept-Encoding: zip/zop;8bit").


-i
执行HEAD请求,而不是GET。


-k
启用HTTP KeepAlive功能,即, 在一个HTTP会话中执行多个请求。默认时,不启用KeepAlive功能.


-n requests
在测试会话中所执行的请求个数。默认时,仅执行一个请求,但通常其结果不具有代表意义。


-p POST-file
包含了需要POST的数据的文件.


-P proxy-auth-username:password
对一个中转代理提供BASIC认证信任。用户名和密码由一个:隔开,并以base64编码形式发送。无论服务器是否需要(即, 是否发送了401认证需求代码),此字符串都会被发送。


-q
如果处理的请求数大于150, ab每处理大约10%或者100个请求时,会在stderr输出一个进度计数。此-q标记可以抑制这些信息。


-s
用于编译中(ab -h会显示相关信息)使用了SSL的受保护的https,而不是http协议的时候。此功能是实验性的,也是很简陋的。最好不要用。


-S
不显示中值和标准背离值,而且在均值和中值为标准背离值的1到2倍时,也不显示警告或出错信息。默认时,会显示最小值/均值/最大值等数值。(为以前的版本提供支持).


-t timelimit
测试所进行的最大秒数。其内部隐含值是-n 50000。它可以使对服务器的测试限制在一个固定的总时间以内。默认时,没有时间限制。


-T content-type
POST数据所使用的Content-type头信息。


-v verbosity
设置显示信息的详细程度 - 4或更大值会显示头信息, 3或更大值可以显示响应代码(404, 200等), 2或更大值可以显示警告和其他信息。


-V
显示版本号并退出。


-w
以HTML表的格式输出结果。默认时,它是白色背景的两列宽度的一张表。


-x <table>-attributes
设置<table>属性的字符串。 此属性被填入<table 这里 >.


-X proxy[:port]
对请求使用代理服务器。


-y <tr>-attributes
设置<tr>属性的字符串.


-z <td>-attributes
设置<td>属性的字符串.

缺陷
程序中有各种静态声明的固定长度的缓冲区。另外,对命令行参数、服务器的响应头和其他外部输入的解析也很简单,这可能会有不良后果。

它没有完整地实现HTTP/1.x; 仅接受某些'预想'的响应格式。 strstr(3)的频繁使用可能会带来性能问题,即, 你可能是在测试ab而不是服务器的性能。


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

ex: 要執行 1000 次的 connection, 20 次的 concurrent (並行, 同時).
語法: ab -n 1000 -c 20 http://localhost/abc.php
產生出來的結果. 主要要注意的是以下幾個.
Time taken for tests: 總共執行花了多久的時間.(以上 1000 次共多久)


Requests per second: 每秒平均可以處理多少個 connection.

假设我们要对 echo.fcg 做测试,仿真 1000 次的联机请求,而且同一时间有 20 个并行的 (concurrent) 联机请求的情况,只要在命令列模式下执行 $ ab -n 1000 -c 20 http://localhost/fcgi-bin/echo.fcg 稍等一会,ApacheBench 会把结果秀出来,

This is ApacheBench, Version 1.3 Copyright c 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/ Copyright c 1998-1999 The Apache Group, http://www.apache.org/ Benchmarking localhost (be patient)...

Server Software: Apache/1.3.6

Server Hostname: localhost

Server Port: 80

Document Path: /fcgi-bin/echo.fcg

Document Length: 995 bytes

Concurrency Level: 20

Time taken for tests: 6.859 seconds

Complete requests: 1000

Failed requests: 0

Total transferred: 1142000 bytes HTML transferred: 995000 bytes

Requests per second: 145.79

Transfer rate: 166.50 kb/s received Connnection Times (ms) min avg

max Connect: 0 4 61

Processing: 62 128 771

Total: 62 132 832

以上结果指出,在同时间 20 个联机请求 (Concurrency Level) 的情况下,完成 1000 次的联机请求,共花了 6.859 秒 (Time taken for tests),因此这个程序每秒平均可以处理 (Requests per second) 145.79 个联机请求。 在接下来的评比测试中,我们就以每秒可以处理的联机请求数目来做为效能评比的依据。
正则表达式用于字符串处理、表单验证等场合,实用高效。现将一些常用的表达式收集于此,以备不时之需。

匹配中文字符的正则表达式: [\u4e00-\u9fa5]
评注:匹配中文还真是个头疼的事,有了这个表达式就好办了

匹配双字节字符(包括汉字在内):[^\x00-\xff]
评注:可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1)

匹配空白行的正则表达式:\n\s*\r
评注:可以用来删除空白行

匹配HTML标记的正则表达式:<(\S*?)[^>]*>.*?|<.*? />
评注:网上流传的版本太糟糕,上面这个也仅仅能匹配部分,对于复杂的嵌套标记依旧无能为力

匹配首尾空白字符的正则表达式:^\s*|\s*$
评注:可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式

匹配Email地址的正则表达式:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*
评注:表单验证时很实用

匹配网址URL的正则表达式:[a-zA-z]+://[^\s]*
评注:网上流传的版本功能很有限,上面这个基本可以满足需求

匹配帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$
评注:表单验证时很实用

匹配国内电话号码:\d{3}-\d{8}|\d{4}-\d{7}
评注:匹配形式如 0511-4405222 或 021-87888822

匹配腾讯QQ号:[1-9][0-9]{4,}
评注:腾讯QQ号从10000开始

匹配中国邮政编码:[1-9]\d{5}(?!\d)
评注:中国邮政编码为6位数字

匹配身份证:\d{15}|\d{18}
评注:中国的身份证为15位或18位

匹配ip地址:\d+\.\d+\.\d+\.\d+
评注:提取ip地址时有用

匹配特定数字:
^[1-9]\d*$    //匹配正整数
^-[1-9]\d*$   //匹配负整数
^-?[1-9]\d*$   //匹配整数
^[1-9]\d*|0$  //匹配非负整数(正整数 + 0)
^-[1-9]\d*|0$   //匹配非正整数(负整数 + 0)
^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$   //匹配正浮点数
^-([1-9]\d*\.\d*|0\.\d*[1-9]\d*)$  //匹配负浮点数
^-?([1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0)$  //匹配浮点数
^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0$   //匹配非负浮点数(正浮点数 + 0)
^(-([1-9]\d*\.\d*|0\.\d*[1-9]\d*))|0?\.0+|0$  //匹配非正浮点数(负浮点数 + 0)
评注:处理大量数据时有用,具体应用时注意修正

匹配特定字符串:
^[A-Za-z]+$  //匹配由26个英文字母组成的字符串
^[A-Z]+$  //匹配由26个英文字母的大写组成的字符串
^[a-z]+$  //匹配由26个英文字母的小写组成的字符串
^[A-Za-z0-9]+$  //匹配由数字和26个英文字母组成的字符串
^\w+$  //匹配由数字、26个英文字母或者下划线组成的字符串
评注:最基本也是最常用的一些表达式

许多元字符要求在试图匹配它们时特别对待。若要匹配这些特殊字符,必须首先使字符“转义”,即,将反斜杠字符 (\) 放在它们前面。下表列出了特殊字符以及它们的含义:

$ 匹配输入字符串结尾的位置。
如果设置了 RegExp 对象的 Multiline 属性,那么 $ 还匹配 \n 或 \r 前面的位置。若要匹配 $ 字符本身,请使用 \$。

( ) 标记子表达式的开始和结束。可以捕获子表达式以供以后使用。
若要匹配这两个字符,请使用 \( 和 \)。

* 零次或多次匹配前面的字符或子表达式。
若要匹配 * 字符,请使用 \*。

+ 一次或多次匹配前面的字符或子表达式。
若要匹配 + 字符,请使用 \+。

. 匹配除换行符 \n 之外的任何单个字符。
若要匹配 .,请使用 \。

[ ] 标记中括号表达式的开始。
若要匹配这些字符,请使用 \[ 和 \]。

? 零次或一次匹配前面的字符或子表达式,或指示“非贪心”限定符。
若要匹配 ? 字符,请使用 \?。

\ 将下一字符标记为特殊字符、文本、反向引用或八进制转义符。
例如,字符 n 匹配字符 n。\n 匹配换行符。序列 \\ 匹配 \,序列 \( 匹配 (。

/ 表示文本正则表达式的开始或结束。
若要匹配 / 字符,请使用 \/。

^ 匹配输入字符串开始处的位置,但在中括号表达式中使用的情况除外,在那种情况下它对字符集求反。
若要匹配 ^ 字符本身,请使用 \^。

{ } 标记限定符表达式的开始。
若要匹配这些字符,请使用 \{ 和 \}。

| 指出在两个项之间进行选择。
若要匹配 | ,请使用 \|

preg_match() 返回 pattern 所匹配的次数。要么是 0 次(没有匹配)或 1 次,因为 preg_match() 在第一次匹配之后将停止搜索。preg_match_all() 则相反,会一直搜索到 subject 的结尾处。如果出错 preg_match() 返回 FALSE。

提示:
如果只想查看一个字符串是否包含在另一个字符串中,不要用 preg_match()。可以用 strpos() 或 strstr() 替代,要快得多。

例1609.在文本中搜索“php”
copy to clipboard
<?php
// 模式定界符后面的 "i" 表示不区分大小写字母的搜索
if (preg_match ("/php/i", "PHP is the web scripting language of choice.")) {
   print "A match was found.";
} else {
   print "A match was not found.";
}
?>
例1610.搜索单词“web”
copy to clipboard
<?php
/* 模式中的 \b 表示单词的边界,因此只有独立的 "web" 单词会被匹配,
* 而不会匹配例如 "webbing" 或 "cobweb" 中的一部分 */
if (preg_match ("/\bweb\b/i", "PHP is the web scripting language of choice.")) {
   print "A match was found.";
} else {
   print "A match was not found.";
}

if (preg_match ("/\bweb\b/i", "PHP is the website scripting language of choice.")) {
   print "A match was found.";
} else {
   print "A match was not found.";
}
?>
例1611.从 URL 中取出域名
copy to clipboard
<?php
// 从 URL 中取得主机名
preg_match("/^(http:\/\/)?([^\/]+)/i",
   "http://www.php.net/index.html", $matches);
$host = $matches[2];

// 从主机名中取得后面两段
preg_match("/[^\.\/]+\.[^\.\/]+$/", $host, $matches);
echo "domain name is: {$matches[0]}\n";
?>

在对正则表达式有了较为全面的了解之后,就可以在Perl,PHP,以及ASP等程式中使用正则表达式了。

  下面以PHP语言为例,使用验证用户在线输入的邮件地址以及网址的格式是否正确。PHP 提供了eregi()或ereg()资料处理函数实现字串比对剖析的模式匹配操作ereg()函数的使用格式如下:

      ereg (pattern, string)

  其中,pattern代表正则表达式的模式;而string则是执行查找替换操作的目标对象,如Email地址值。本函式以 pattern 的规则来剖析比对字串 string,找到则传回值为 true。函式ereg()与eregi()的区别就是前者区分大小写,后者与大小写无关。使用PHP编写的程序代码如下:

     <?php
   if (ereg("^([a-z0-9_-])+@([a-zZ0-9_-])+(\.[a-z0-9_-])+[a-z]{2,3}$",$email))
   { echo "您的 E-Mail 通过初步检查!";}
   else
   { echo "不是合法的E-Mail 地址,请重新输入!";}
   ?>


  这个例子是可对使用者输入的 E-Mail 作简单的检查,检查使用者的 E-Mail 字串是否有 @ 字元,在 @ 字元前有小写英文字母、数字或下"_",在 @ 之后有数节字串,最后的小数点后只能有二个或三个小写英文字母。如webmaster@mail.sever.net, hello_2001@88new.cn就可以通过检查,而New99@253.com(出现大写字母)和new99@253.comn(最后的小数点后只能超过3个英文字母)就不能通过检查。

  我们通过调用自定义正规则判别函式也可以进行检查操作,如下面的网址检验函式:

function VerifyWebSiteAddr ($strWebSiteAddr){
return (eregi ("^([_0-9a-z-]+.)+([0-9a-z-]+.)+[a-z]{2,3}$", $strWebSiteAddr));
}

  我们知道,PHP程式的运行必须有服务器支持,如果您在自己的主页上想实现以上功能, 嵌入式脚本语言Javascript或许是好的选择。Javascript中带有一个功能强大的RegExp()对象,可以用来进行正则表达式的匹配操作。其中的test()方法可以检验目标对象中是否包含匹配模式,并相应的返回true或false。只须在HTML文档的<head>区域添加一段Javascript代码。

< language="Javascript1.2">
  function verifyAddress(obj){
   var email = obj.email.value;
   var pattern = /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(\.[a-zA-Z0-9_-])+/;
   flag = pattern.test(email);
   if(flag){
    alert("您的 E-Mail 通过初步检查!");
    return true;}
   else{
    alert("不是合法的E-Mail 地址,请重新输入!");
    return false;}
  }
 </script>


  然后在网页中输入信息的表单域<form>标签区域内中加入一行如下代码:

   <onSubmit="return verifyAddress(this);">

  当按下提交按钮后,首先运行verifyAddress()函式,进行匹配识别,如果满足条件则发送表单信息到目标页面,否则返回错误信息。

  事实上,正则表达式的功能远非本文提到的这一点,下次,给大家介绍一种使用正则表达式从任意指定网页中析取任意种类文本信息(如网页中所有的图片文件名)的技巧。 


  Html源文件中image标签的析取

  上篇,我们介绍了正则表达式的概念及其在网络编程中使用正则表达式验证用户在线输入的邮件地址以及网址的格式是否正确的应用实例,今天介绍一种从指定网页源文件中析取image标签的的编程技巧,即从网页源文件中,解析出所有的插图文件名(包括图片路径),也就是标签<img src=http://www.host01.com/Get/asp/regex/".../.../abc.jpg"> 中的文件名http://www.host01.com/Get/asp/regex/".../.../abc.jpg"(有的可能是gif格式)。编程环境:PHP+Apache for Win98。

  首先, 用文本编辑器新建一个PHP类型的文件:abstractSRCfrompage.php3。为了方便讲解,我们打算是在浏览器表单域中输入需要析取image标签的网页的URL(或本机文档),提交后执行析取操作,所以在该文件中,我们要建立一个用于输入网址的表单,举例如下:


<form action=" abstractSRCfrompage.php3" method="post">
  输入网址<input type=text name=filename><br>
  <input type=submit name=submit value="提交">
</form>


  输入正确的网址,提交后表单信息被送到abstractSRCfrompage.php3页面,由于表单本身就在该页面,所以相当于被送到自身页面,下面我们需要编写析取处理的PHP代码,紧接着表单代码段后写入如下代码:


<?php
if ($filename!=""){
$fp = fopen($filename, "r"); file://若输入不为空,开启本地或者远程档案;
while ($buffer = fgets($fp, 1024)) {
$source .=$buffer; }
fclose($fp);
file://查找$source中是否有<img ...src=http://www.host01.com/Get/asp/regex/".../...gif | jpg"> 这样的标记
if(eregi("(<img)+[^<>]+(src=\")+[^\*\"<>|]+(\.)+((gif)|(jpg))+(\")",$source)) {
echo "找到图片标签:)<br>";}
else{
echo "未发现图片标签:(<br>";}
file://拆分,第一次用标签,<img ...src=拆分,得到了以图形文件名开头的数组,
$splitres=split("((\">)|())+(<img)+[^<>]+(src=\")",$source);
echo "找到: $imagenums-1个图片<br>分别为:<br>";
for($i=1;$i<sizeof($splitres);$i++){
file://二次拆分,用"拆分。因为文件名能含有",得到的拆分数组的第一个元素就是路径+文件名了;
unset($imgname); // 再次使用前删除imgname变量;
$imgname=spliti("\"",$splitres[$i]);//将析取的图片信息依次赋给imgname变量
echo "$i=>".$imgname[0]."<br>"; file://输出析取的图片信息
}
}
?>


  该段程序的设计思路是:PHP程式判断是否输入了档案名称(网址URL或本机档案名),若不为空则以只读方式打开该档案;接着使用函式fgets(fp,length)取得档案指标fp所指的行并传回该行内长度为length-1 的字串,上例中就是1024-1=1023;然后利用字串比对剖析函式ereg()查找$source中是否含有<img ...src=http://www.host01.com/Get/asp/regex/".../...gif | jpg"> 这样的标记(关于该函式在上篇中有详细的介绍);假如找到的话,则利用split()函式按一定的规则执行两次拆分,去掉标记中的<img…src=字符和"字符,结果得到数组splitres,其中的每一个元素都是以图形路径+文件名开头的数组;用for循环在屏幕上输出每个数组的第一个元素值,即我们所需要的所有图形路径+文件名。

  其中函式sizeof($splitres)返回个数;在for循环中,依次将数组splitres的每个元素(也是数组)赋给数组变量imgname,并输出imgname的第一个元素值(为找到的一个图形路径+文件名),当执行下次循环时,删除变量imgname,达到重复使用的目的。大家可以仔细研究其中的奥妙。

  好了,写好后,将abstractSRCfrompage.php3存到你的服务器指定目录下,启动Apache服务器,在浏览器中打开它,随便输入一个存在的网页名称或是远程URL,看看效果如何。

  如果有兴趣,你可以尝试析取HTML文档中的任意感兴趣的信息,如果稍加改装,做一个网站文本搜索引擎岂不更妙?
在这里我想总结一下取得地址栏内URL及文件所属的我更路径的一些信息:

运用$_SERVER[ ]我们可以来完成许多事情:它是一个包含头部(headers),路径信息及脚本位置的数组,数组的实体由web服务器创建。

这是一个“superglobal”,或者可以描述为自动全局变量。这只不过意味这它在所有的脚本中都有效。在函数或方法中您不需要使用global $_SERVER; 访问它,就如同使用 $HTTP_SERVER_VARS 一样。 $HTTP_SERVER_VARS 包含着同样的信息,但是不是一个自动全局变量。(注意: $HTTP_SERVER_VARS 和 $_SERVER 是不同的变量,PHP 处理它们的方式不同。)如果设置了 register_globals 指令,这些变量也在所有脚本中可用;也就是,分离了 $_SERVER 和 $HTTP_SERVER_VARS 数组。

$_SERVER['HTTP_HOST'] 取得当前请求的Host:头部内容
$_SERVER['PHP_SELF']这可能是我们最为经常用到的了,它返回当前调用 的页的文件名,如果是http://localhost/test/2005/test.php, 那么将会返回/test/2005/test.php

$_SERVER['SCRIPT_NAME']它将返回包含当前脚本的路径。这在页面需要指向自己时非常有用

$_SERVER['SCRIPT_FILENAME']它将返回当前文件所在的绝对路径信息

$_SERVER['REQUEST_URI']返回访问此页面所需的URI,包括"/"


当然还有许多路径函数:

dirname(),返回路径信息中的目录部分,前面是带有"/"的


basename()返回路径中的基本的文件名部分,当然也可以设置后缀来控制输出。

realpath(),返回路径信息的绝对规范化的路径

分页: 282/339 第一页 上页 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 下页 最后页 [ 显示模式: 摘要 | 列表 ]