百度空间 | 百度首页 
 
文章列表
 
您正在查看 "默认分类" 分类下的文章

2009-04-20 22:11

似乎人们都很“痛恨”长网址,于是出现了众多的网址缩短服务(short URL),这类服务通常可以免费使用,不需要注册等等麻烦,立刻可将你长长的网址缩短成通俗易记的网址,便于你自己和朋友牢牢记住,方便你的使用。

1、21xp.com剪网

国内一家短网址服务,压缩率非常高,在国内速度快。其口号也挺有意思,我剪,我剪,我剪剪剪。形式为:http://21xp.com/abc



2、TinyURL

TinyURL可能是大家最熟悉,也使用得最多的免费域名转向服务,速度很快,缩短后短小网址有六个字符组成,形式为:http://tinyurl.com/123456 ,但不能自己进行设置。

3、is.gd

is.gd 缩短后网址更短,本次测试结果http://is.gd/zjP,共9个字符,缩短比率达67%。还有一大特点就是带有网址自动复制功能,启动该功能,鼠标划过即自动复制网址,尤其是用于缩短下载文件的网址,划过即刻自动下载。


4、URL.ie

URL.ie 也是简单的缩短网址服务,长长的网址可缩短为个性的3个字符,并带有Firefox 浏览器插件工具。



  5、jmp2.net

jmp2.net 除了具有一般的缩短网址功能,一大特点是可以设置是否网址区域隐藏,可将你的网址掩蔽。另外也具有Firefox浏览器插件。


6、w3t.org

w3t.org 的特点是带有“tag”功能,可以自己定义缩短网址的tag,最多10个字符。我的理解是也就是可以自己定义缩短网址的个性化域名。


7、xaddr.com

xaddr.com 在线缩短网址服务并没有什么特色,但却是唯一具有客户端软件下载的服务,如果你有很多网址需要批量缩短,安装客户端软件后会非常方便。

8、doiop.com

doiop.com 的特点是在缩短网址是你可以自己设置域名,不仅仅可选用字符,也可设置成某一个词组,但是时常会有域名已被使用的烦恼。


9、Snurl / Snipr / SnipURL

总是喜欢把好的留到最后,Snurl / Snipr / SnipURL 无疑是此类服务中功能比较强的一个。不仅可以个性化缩短网址,设置密码保护,注册为用户后还可以随时管理你所有的缩短网址,甚至其他朋友可以通过RSS的方式订阅你缩短后的网址。

10、6yo:台湾的一个服务

类别:默认分类 | 评论(1) | 浏览()
 
2008-10-07 11:49
  从6月13日搬家到百度空间以来,在不到4个月的时间里今天访问量已经突破10000了,特此纪念!
类别:默认分类 | 评论(2) | 浏览()
 
2008-06-13 19:28
      从大学开始,一直在csdn上写博,直到工作后发现csdn的博客不是很好用,而且用户基数小,就偶尔写写了,一直想搬家,但也不知道去哪好。最近发现百度空间越来越不错了,于是就计划搬家。
       在网上找遍了搬家相关,没有与csdn博客相关的搬家工具或者网站,于是自己动手写了一个搬家程序。说干就干,花了二小时写完,于是又花了二小时才搬完,原因居然是太频繁的在百度空间发表博文或提示不允许过于频繁的写博,只好在程序中增加了延时功能,每发一篇休息2分钟,这下就成功了,呵呵。还好是机器在做苦力搬运工,哈哈,要是一个个复制粘贴,不知道要何时。
       要是有在csdn博客中的用户也想搬家的话,可以联系我哦,我可以帮你搬家(本来想把搬家程序放到网上去,但由于我没有独立的服务器,有些东西不大好弄),所以需要搬家的把你的csdn博客地址,百度空间的登陆用户名与密码发给我email:arcow###21xp.com,把三个#号换成@即可。我会在收到邮件后帮你搬家。
     如果想搬到新浪、网易、sohu等一些其它的博客的话,我不能直接帮你搬,博客网太多,我也没那么多时间去一个个分析,但你可以把百度空间做为跳板。我帮你搬到百度空间后,你可以再利用sohu,新浪等他们的搬家工具再从百度空间搬过来,我想这些大门户应该都有相互搬家的功能的。
    这篇博文之前的文章全部从我的blog.csdn.net/arcow搬家而来,以后csdn博停止更新,这些旧博记录了我技术成长的点点滴滴,现在看来有些很幼稚,很好笑,有些很简单能实现的功能,现在看起来当时写的太复杂,太弱智了,有原创,有翻译,也有转载的。这也说明我的经验、技术在一步步提高,和当时相比,现在也该是个高手级了吧(自恋中:)),不过对一些技术初学者来说应该还是有一定的借鉴意义的。

   此博将专注于LAMP技术的研究与分享,及web2.0中LAMP相关以及千万级用户的系统架构研究。欢迎一起探讨。
类别:默认分类 | 评论(5) | 浏览()
 
2008-06-13 18:48

Selenium 是 thoughtworks公司的一个集成测试的强大工具。最近参与了一个系统移植的项目,正好用到这个工具,

把一些使用心得分享给大家,希望大家能多多使用这样的强大的,免费的工具,来保证我们的质量。

Selenium 的文档现存的不少,不过都太简单了。使用Selenium的时候,我更多的是直接去看API文档,好在API不错,

一个一个看,就能找到所需要的 :-)   官方网站:http://www.openqa.org/selenium/

好,下面进入正题!

一、Selenium 的版本

Selenium 现在存在2个版本,一个叫 selenium-core, 一个叫selenium-rc 。

selenium-core 是使用HTML的方式来编写测试脚本,你也可以使用 Selenium-IDE来录制脚本,但是目前Selenium-IDE
只有 FireFox 版本。

Selenium-RC 是 selenium-remote control 缩写,是使用具体的语言来编写测试类。

selenium-rc 支持的语言非常多,这里我们着重关注java的方式。这里讲的也主要是 selenium-rc,因为个人还是喜欢这种
方式 :-)

二、一些准备工作

1、当然是下载 selenium 了,到 http://www.openqa.org/selenium/ 下载就可以了,记得选择selenium-rc 的版本。

2、学习一下 xpath 的知识。有个教程:http://www.zvon.org/xxl/XPathTutorial/General_chi/examples.html
     一定要学习这个,不然你根本看不懂下面的内容!

3、安装 jdk1.5

三、selenium-rc 一些使用方法

selenium-remote-control-0.9.0\server 目录里,我们运行 java -jar selenium-server.jar
之后你就会看到一些启动信息。要使用 selenium-rc ,启动这个server 是必须的。

当然,启动的时候有许多参数,这些用法可以在网站里看看教程,不过不加参数也已经足够了。

selenium server 启动完毕了,那么我们就可以开始编写测试类了!

我们先有个概念,selenium 是模仿浏览器的行为的,当你运行测试类的时候,你就会发现selenium 会打开一个

浏览器,然后浏览器执行你的操作。

好吧,首先生成我们的测试类:

java 代码
  1. public class TestPage2 extends TestCase {   
  2.   private Selenium selenium;   
  3.   
  4.   protected void setUp() throws Exception {   
  5.       String url = “http://xxx.xxx.xxx.xxx/yyy”;   
  6.       selenium = new DefaultSelenium("localhost", SeleniumServer.getDefaultPort   
  7.                                  (), "*iexplore", url);   
  8.       selenium.start();   
  9.                
  10.      super.setUp();                        
  11.            
  12.    }   
  13.   
  14.   protected void tearDown() throws Exception {   
  15.            
  16.        selenium.stop();   
  17.       super.tearDown();   
  18.                
  19.   
  20.    }   
  21.   
  22. }  

代码十分简单,作用就是初始化一个 Selenium 对象。其中:
url : 就是你要测试的网站
localhost: 可以不是localhost,但是必须是 selenium server 启动的地址
*iexplore : 可以是其它浏览器类型,可以在网站上看都支持哪些。

下面我就要讲讲怎么使用selenium 这个对象来进行测试。

1、测试文本输入框

假设页面上有一个文本输入框,我们要测试的内容是 在其中输入一些内容,然后点击一个按钮,看看页面的是否跳转
到需要的页面。

  1. public void test1() {   
  2.            
  3.      selenium.open("http://xxx.xxx.xxx/yyy");   
  4.            
  5.      selenium.type("xpath=//input[@name='userID']", "test-user");   
  6.      selenium.click("xpath=//input[@type='button']");   
  7.      selenium.waitForPageToLoad("2000");   
  8.      assertEquals(selenium.getTitle(), "Welcome");   
  9. }  

上面的代码是这个意思:
1、调用 selenium.open 方法,浏览器会打开相应的页面
2、使用 type 方法来给输入框输入文字
3、等待页面载入
4、看看新的页面标题是不是我们想要的。

2、测试下拉框

java 代码
  1. public void test1() {       
  2.                
  3.      selenium.open("http://xxx.xxx.xxx/yyy");       
  4.                
  5.      selenium.select("xpath=//SELECT[@name='SBBUSYO']", "index=1");   
  6.      selenium.click("xpath=//input[@type='button']");       
  7.      selenium.waitForPageToLoad("2000");       
  8.      assertEquals(selenium.getTitle(), "Welcome");       
  9. }     

可以看到,我们可以使用 select 方法来确定选择下拉框中的哪个选项。
select 方法还有很多用法,具体去看看文档吧。

3、测试check box

java 代码

  1. public void test1() {           
  2.                    
  3.      selenium.open("http://xxx.xxx.xxx/yyy");           
  4.                    
  5.      selenium.check("xpath=//input[@name='MEICK_000']");     
  6.      selenium.click("xpath=//input[@type='button']");           
  7.      selenium.waitForPageToLoad("2000");           
  8.      assertEquals(selenium.getTitle(), "Welcome");           
  9. }      

我们可以使用 check 方法来确定选择哪个radio button

4、得到文本框里的文字

java 代码
  1. assertEquals(selenium.getValue("xpath=//input[@name='WNO']"), "1");  

getValue 方法就是得到文本框里的数值,可不是 getText 方法,用错了可就郁闷了。

5、判断页面是否存在一个元素

java 代码
  1. assertTrue(selenium.isElementPresent("xpath=//input[@name='MEICK_000']"));  

一般这个是用来测试当删除一些数据后,页面上有些东西就不会显示的情况。

6、判断下拉框里选择了哪个选项

java 代码
  1. assertEquals(selenium.getSelectedIndex("xpath=//SELECT[@name='HATIMING']"), "1");  

这个可以用来判断下拉框显示的选项是否是期望的选项。

7、如果有 alert 弹出对话框怎么办?

这个问题弄了挺长时间,可以这样来关闭弹出的对跨框:

java 代码
  1. if(selenium.isAlertPresent()) {   
  2.   
  3.     selenium.getAlert();   
  4.   
  5. }  

其实当调用 selenium.getAlert() 时,就会关闭 alert 弹出的对话框。
也可以使用 System.out.println(selenium.getAlert()) 来查看对跨框显示的信息。

在测试的时候,有的人会显示许多alert 来查看运行时的数据,那么我们可以用下面的方式来关闭那些 alert:

java 代码
  1. while(selenium.isAlertPresent()) {       
  2.       
  3.     selenium.getAlert();       
  4.       
  5. }   

8、如何测试一些错误消息的显示?

java 代码
  1. assertTrue(selenium.getBodyText().indexOf("错误消息")>=0);  

切记: getBodyText 返回的时浏览器页面上的文字,不回包含html 代码的,如果要显示html 代码,用下面这个:

java 代码
  1. System.out.println(selenium.getHtmlSource());  

以上就是最常用的几个方法了,例如 click, type, getValue 等等。
还有就是一定要学习 xpath, 其实xpath 也可以有“与、或、非”的操作:

java 代码
  1. selenium.check("xpath=//input[(@name='KNYKBN')and(@value='Y')]");  

四、其他

selenium 还有更多的用法,例如弹出页面等等。当面对没见过的测试要求时,我最笨的方法就是按照api文档一个一个找,
好在不多,肯定能找到。


原文地址:http://www.javaeye.com/topic/107276


最早发于:2008-03-21 22:46:00
类别:默认分类 | 评论(1) | 浏览()
 
2008-06-13 18:46
我们通常用笔记本在单位办公,回家在家上网
由于公司和家里的ip设置不一样,这样每次来回设置都很麻烦
于是很多切换ip的软件诞生了,不过通常我们只需在二个ip自由切换,所以写个批处理文件就可以了,不必杀鸡用宰牛刀。
我在家用路由上网通常都是自动获取ip模式
于是把下面存为:家用.bat
cmd /c netsh -c interface ip set address name="本地连接" source=dhcp
cmd /c netsh -c interface ip set dns name="本地连接" source=dhcp
在公司通常需要指定ip及路由,把下面代码存为:办公.bat
cmd /c netsh -c interface ip set address name="本地连接" source=static addr=172.16.102.98 mask=255.255.255.0 gateway=172.16.102.254 gwmetric=1
cmd /c netsh -c interface ip set dns name="本地连接" source=static addr=172.16.102.254 register=PRIMARY
cmd /c netsh -c interface ip add dns name="本地连接" addr=61.136.0.1 (此行是设置备用dns的)
大家相应改一下即可ip,网关等然后分别存入二个.bat文件,要用哪个就双击哪个即可。

用鼠标右键另存为……下载此文件,然后把扩展名.jpg去掉后,为switch-ip.rar,解压即可
最早发于:2007-07-10 13:38:00
类别:默认分类 | 评论(0) | 浏览()
 
2008-06-13 18:44
Linux下常用压缩格式的压缩与解压方法(2005-2-20)

     大致总结了一下linux下各种格式的压缩包的压缩、解压方法。但是部分方法我没有用到,也就不全,希望大家帮我补充,我将随时修改完善,谢谢!
整理:会游泳的鱼
来自:www.LinuxByte.net
最后更新时间:2005-2-20

.tar
解包:tar xvf FileName.tar
打包:tar cvf FileName.tar DirName
(注:tar是打包,不是压缩!)
---------------------------------------------
.gz
解压1:gunzip FileName.gz
解压2:gzip -d FileName.gz
压缩:gzip FileName
.tar.gz 和 .tgz
解压:tar zxvf FileName.tar.gz
压缩:tar zcvf FileName.tar.gz DirName
---------------------------------------------
.bz2
解压1:bzip2 -d FileName.bz2
解压2:bunzip2 FileName.bz2
压缩: bzip2 -z FileName
.tar.bz2
解压:tar jxvf FileName.tar.bz2
压缩:tar jcvf FileName.tar.bz2 DirName
---------------------------------------------
.bz
解压1:bzip2 -d FileName.bz
解压2:bunzip2 FileName.bz
压缩:未知
.tar.bz
解压:tar jxvf FileName.tar.bz
压缩:未知
---------------------------------------------
.Z
解压:uncompress FileName.Z
压缩:compress FileName
.tar.Z
解压:tar Zxvf FileName.tar.Z
压缩:tar Zcvf FileName.tar.Z DirName
---------------------------------------------
.zip
解压:unzip FileName.zip
压缩:zip FileName.zip DirName
---------------------------------------------
.rar
解压:rar x FileName.rar
压缩:rar a FileName.rar DirName

rar请到:http://www.rarsoft.com/download.htm 下载!
解压后请将rar_static拷贝到/usr/bin目录(其他由$PATH环境变量指定的目录也可以):
[root@www2 tmp]# cp rar_static /usr/bin/rar

---------------------------------------------
.lha
解压:lha -e FileName.lha
压缩:lha -a FileName.lha FileName

lha请到:http://www.infor.kanazawa-it.ac.jp/~ishii/lhaunix/下载!
>解压后请将lha拷贝到/usr/bin目录(其他由$PATH环境变量指定的目录也可以):
[root@www2 tmp]# cp lha /usr/bin/

---------------------------------------------
.rpm
解包:rpm2cpio FileName.rpm | cpio -div
---------------------------------------------
.deb
解包:ar p FileName.deb data.tar.gz | tar zxf -
---------------------------------------------
.tar .tgz .tar.gz .tar.Z .tar.bz .tar.bz2 .zip .cpio .rpm .deb .slp .arj .rar .ace .lha .lzh .lzx .lzs .arc .sda .sfx .lnx .zoo .cab .kar .cpt .pit .sit .sea
解压:sEx x FileName.*
压缩:sEx a FileName.* FileName

sEx只是调用相关程序,本身并无压缩、解压功能,请注意!
sEx请到: http://sourceforge.net/projects/sex下载!
解压后请将sEx拷贝到/usr/bin目录(其他由$PATH环境变量指定的目录也可以):
[root@www2 tmp]# cp sEx /usr/bin/



参考文献:Linux 文件压缩工具指南
(其实看帮助是最好的方法,一般各个命令都可以用“--help”参数得到常用使用方法!)

最早发于:2007-07-09 11:28:00
类别:默认分类 | 评论(0) | 浏览()
 
2008-06-13 18:44
什么是CSS hack
来源:http://www.div-css.com

什么是CSS hack

由于不同的浏览器,比如Internet Explorer 6,Internet Explorer 7,Mozilla Firefox等,对CSS的解析认识不一样,因此会导致生成的页面效果不一样,得不到我们所需要的页面效果。

这个时候我们就需要针对不同的浏览器去写不同的CSS,让它能够同时兼容不同的浏览器,能在不同的浏览器中也能得到我们想要的页面效果。

这个针对不同的浏览器写不同的CSS code的过程,就叫CSS hack,也叫写CSS hack

CSS Hack的原理是什么

由于不同的浏览器对CSS的支持及解析结果不一样,还由于CSS中的优先级的关系。我们就可以根据这个来针对不同的浏览器来写不同的CSS。

比如 IE6能识别下划线_星号*,IE7能识别星号*,当不能识别下划线_,而firefox两个都不能认识。等等

书写顺序,一般是将识别能力强的浏览器的CSS写在后面。下面如何写里面说得更详细些。

如何写CSS Hack

比如要分辨IE6和firefox两种浏览器,可以这样写:

  1. <style>  
  2. div{  
  3.      background:green; /* for firefox */  
  4.      *background:red;   /* for IE6 */  
  5. }  
  6. </style>  
  7. <div>我在IE6中看到是红色的,在firefox中看到是绿色的。</div>  
<style> div{ background:green; /* for firefox */ *background:red; /* for IE6 */ } </style> <div>我在IE6中看到是红色的,在firefox中看到是绿色的。</div>

解释一下:
上面的css在firefox中,它是认识不了后面的那个带星号*的东东是什么的,于是将它过滤掉,不予理睬,解析得到的结果是:div{background:green},于是理所当然这个div的背景是绿色的。
在IE6中呢,它两个background都能识别出来,它解析得到的结果是:div{background:green;background:red;},于是根据优先级别,处在后面的red的优先级高,于是当然这个div的背景颜色就是红色的了。


CSS hack:区分IE6,IE7,firefox

区别不同浏览器,CSS hack写法:


区别IE6FF
background:orange;*background:blue;

区别IE6IE7
background:green !important;background:blue;

区别IE7FF
background:orange; *background:green;

区别FFIE7IE6
background:orange;*background:green !important;*background:blue;

注:IE都能识别*;标准浏览器(如FF)不能识别*;
IE6能识别*,但不能识别 !important,
IE7能识别*,也能识别!important;
FF不能识别*,但能识别!important;


IE6 IE7 FF
* ×
!important ×



另外再补充一个,下划线"_",
IE6支持下划线,IE7和firefox均不支持下划线。

于是大家还可以这样来区分IE6IE7firefox
: background:orange;*background:green;_background:blue;

注:不管是什么方法,书写的顺序都是firefox的写在前面,IE7的写在中间,IE6的写在最后面。

附:CSS的各种浏览器兼容一栏表


最早发于:2007-07-06 15:21:00
类别:默认分类 | 评论(0) | 浏览()
 
2008-06-13 18:44
作者:Haohappy     
MSN: haohappy at msn.com
2006-07-04
为什么需要Debugger?
很 多PHP程序员调试使用echo、print_r()、var_dump()、printf()等,其实对于有较丰富开发经验的程序员来说这些也已经足够 了,他们往往可以在程序执行的过程中,通过输出特定变量的值可以判断程序执行是否正确,甚至效率高低也可以看出来(当然可能还需要使用一些时间函数)。那 么我们为什么还需要一个专门的调试程序来监控我们的程序运行呢? 这个问题的答案不妨留到后面来揭晓。
什么是Xdebug?
Xdebug是一个开放源代码的PHP程序调试器(即一个Debug工具),可以用来跟踪,调试和分析PHP程序的运行状况。Xdebug现在的最新版本是xdebug 2.0.0beta6,支持PHP4/PHP5
官方站点:www.Xdebug.org
如何安装Xdebug
以PHP5.1.4,Windows平台为例(其它PHP版本,其它平台请参看官网文档):
1. 登录www.xdebug.org,在首页右侧有一个Windows modules,选择其中的PHP5.1.2+,下载php_xdebug-5.1.2-2.0.0beta6.dll文件;
2. 将下载的php_xdebug-5.1.2-2.0.0beta6.dll放到C:\php5\ext目录,重命名为php_xdebug.dll
3. 编辑php.ini,加入下面几行:
extension=php_xdebug.dll
[Xdebug]
xdebug.profiler_enable=on
xdebug.trace_output_dir="I:\Projects\xdebug"
xdebug.profiler_output_dir="I:\Projects\xdebug"
后面的目录“I:\Projects\xdebug”为你想要放置Xdebug输出的数据文件的目录,可自由设置。
4. 重启Apache
5. 写一个test.php,内容为<?php phpinfo(); ?>,如果输出的内容中有看到xdebug,说明安装配置成功。

现在我们就可以开始使用Xdebug强大的功能了!


Go on..现在我们来从最简单的程序调试开始一步步介绍Xdebug。

调试:

我们先写一个可以导致执行出错的程序,例如尝试包含一个不存在的文件。

testXdebug.php

<?php

require_once(‘abc.php’);

?>

然后通过浏览器访问,我们惊奇地发现,出错信息变成了彩色的了:

不过除了样式改变,和我们平时打印的出错信息内容没什么不同,意义不大。好,我们继续改写程序:

testXdebug2.php

<?php

testXdebug();

function testXdebug() {

       require_once('abc.php');

}

?>

输出信息:

发现了什么? Xdebug跟踪代码的执行,找到了出错的函数testXdebug()

我们把代码再写得复杂一些: 

testXdebug3.php

<?php

testXdebug();

function testXdebug() {

       requireFile();    

}

function requireFile() {

       require_once('abc.php');

}

?>

输出信息:

呵呵,也就是说Xdebug具有类似于JavaException的“跟踪回溯”的功能,可以根据程序的执行一步步跟踪到出错的具体位置,哪怕程序中的调用很复杂,我们也可以通过这个功能来理清代码关系,迅速定位,快速排错。

其实PHP函数debug_backtrace()也有类似的功能,但是要注意debug_backtrace()函数只在PHP4.3.0之后版本及
PHP5中才生效。这个函数是PHP开发团队在PHP5中新增的函数,然后又反向移植到PHP4.3中。
如何利用Xdebug使调试信息更加美观?
Xdebug 扩展加载后,Xdebug会对原有的某些PHP函数进行覆写,以便好更好地进行Debug。比如var_dump()函数,我们知道通常我们需要在函数前 后加上”<pre>…</pre>”才能够让输出的变量信息比较美观、可读性好。但是加载了Xdebug后,我们不再需要这样做 了,Xdebug不但自动给我们加上了<pre>标签,还给变量加上颜色。
例:
<?php
$arrTest=array(
       "test"=>"abc",
       "test2"=>"abc2"
);
var_dump($arrTest);
?>
输出:
看到了吗? 数组元素的值自动显示颜色。
如何利用Xdebug测试脚本执行时间
测试某段脚本的执行时间,通常我们都需要用到microtime()函数来确定当前时间。例如PHP手册上的例子:
<?php
/**
* Simple function to replicate PHP 5 behaviour
*/
function microtime_float()
{
     list(
$usec, $sec) = explode(" ", microtime());
return ((float)$usec + (float)$sec);
}

$time_start = microtime_float();
// Sleep for a while
usleep(100);
$time_end = microtime_float();
$time = $time_end - $time_start;
echo
"Did nothing in $time seconds\n";
?>
但是microtime()返回的值是微秒数及绝对时间戳(例如“0.03520000 1153122275),没有可读性。所以如上程序,我们需要另外写一个函数microtime_float(),来将两者相加。
Xdebug自带了一个函数xdebug_time_index()来显示时间。
如何测定脚本占用的内存?
有时候我们想知道程序执行到某个特定阶段时到底占用了多大内存,为此PHP提供了函数memory_get_usage()。这个函数只有当PHP编译时使用了--enable-memory-limit参数时才有效。 
Xdebug同样提供了一个函数xdebug_memory_usage()来实现这样的功能,另外xdebug还提供了一个xdebug_peak_memory_usage()函数来查看内存占用的峰值。
如何检测代码中的不足?
有时候代码没有明显的编写错误,没有显示任何错误信息(如errorwarningnotice等), 但是这不表明代码就是正确无误的。有时候可能某段代码执行时间过长,占用内存过多以致于影响整个系统的效率,我们没有办法直接看出来是哪部份代码出了问 题。这时候我们希望把代码的每个阶段的运行情况都监控起来,写到日志文件中去,运行一段时间后再进行分析,找到问题所在。
回忆一下,之前我们编辑php.ini文件
加入
[Xdebug]
xdebug.profiler_enable=on
xdebug.trace_output_dir="I:\Projects\xdebug"
xdebug.profiler_output_dir="I:\Projects\xdebug"
这几行,目的就在于把执行情况的分析文件写入到I:\Projects\xdebug”目录中去(你可以替换成任何你想设定的目录)。如果你执行某段程序后,再打开相应的目录,可以发现生成了一堆文件,例如cachegrind.out.1169585776这种格式命名的文件。这些就是Xdebug生成的分析文件。用编辑器打开你可以看到很多程序运行的相关细节信息,不过很显然这样看太累了,我们需要用图形化的软件来查看。

Windows平台下,可以用WinCacheGrind(wincachegrind.souceforge.net)这个软件来打开这些文件。可以直观漂亮地显示其中内容:

哇,非常漂亮,我们很直观地看到index.php中我们调用了一个函数testXdebug()testXdebug()中又调用了requireFile()函数。这样我们就可以非常方便地查看整个脚本的程序结构。

另外,我们还可以看到每个函数被调用的次数及执行所花费的时间!这对于测试程序性能非常有用。

好了,这么一个简单的程序不太能显示出Xdebug+WinCacheGrind的强大,我给出一个稍大点的例子(一个基于Zend FrameworkCMSindex.php):

从上图可以看到:整个程序的结构,每个函数被调用的次数,执行时间都一目了然。
小结:
Xdebug提供了各种自带的函数,并对已有的某些PHP函数进行覆写,可以方便地用于调试排错;Xdebug还可以跟踪程序的运行,通过对日志文件的分析,我们可以迅速找到程序运行的瓶颈所在,提高程序效率,从而提高整个系统的性能。

最早发于:2007-06-23 11:44:00
类别:默认分类 | 评论(0) | 浏览()
 
2008-06-13 18:42
转自 http://blog.csdn.net/guoguo1980/archive/2006/08/13/1059065.aspx

一、memcached 简介


在很多场合,我们都会听到 memcached 这个名字,但很多同学只是听过,并没有用过或实际了解过,只知道它是一个很不错的东东。这里简单介绍一下,memcached 是高效、快速的分布式内存对象缓存系统,主要用于加速 WEB 动态应用程序。


二、memcached 安装


首先是下载 memcached 了,目前最新版本是 1.1.12,直接从官方网站即可下载到 memcached-1.1.12.tar.gz。除此之外,memcached 用到了 libevent,我下载的是 libevent-1.1a.tar.gz


接下来是分别将 libevent-1.1a.tar.gz 和 memcached-1.1.12.tar.gz 解开包、编译、安装:

# tar -xzf libevent-1.1a.tar.gz
# cd libevent-1.1a
# ./configure --prefix=/usr
# make
# make install
# cd ..
# tar -xzf memcached-1.1.12.tar.gz
# cd memcached-1.1.12
# ./configure --prefix=/usr
# make
# make install

安装完成之后,memcached 应该在 /usr/bin/memcached。


三、运行 memcached 守护程序


运行 memcached 守护程序很简单,只需一个命令行即可,不需要修改任何配置文件(也没有配置文件给你修改 :) ):

/usr/bin/memcached -d -m 128 -l 192.168.1.1 -p 11211 -u httpd

参数解释:

-d 以守护程序(daemon)方式运行 memcached;
-m 设置 memcached 可以使用的内存大小,单位为 M;
-l 设置监听的 IP 地址,如果是本机的话,通常可以不设置此参数;
-p 设置监听的端口,默认为 11211,所以也可以不设置此参数;
-u 指定用户,如果当前为 root 的话,需要使用此参数指定用户。

当然,还有其它参数可以用,man memcached 一下就可以看到了。


四、memcached 的工作原理


首 先 memcached 是以守护程序方式运行于一个或多个服务器中,随时接受客户端的连接操作,客户端可以由各种语言编写,目前已知的客户端 API 包括 Perl/PHP/Python/Ruby/Java/C#/C 等等。PHP 等客户端在与 memcached 服务建立连接之后,接下来的事情就是存取对象了,每个被存取的对象都有一个唯一的标识符 key,存取操作均通过这个 key 进行,保存到 memcached 中的对象实际上是放置内存中的,并不是保存在 cache 文件中的,这也是为什么 memcached 能够如此高效快速的原因。注意,这些对象并不是持久的,服务停止之后,里边的数据就会丢失。


三、PHP 如何作为 memcached 客户端


有两种方法可以使 PHP 作为 memcached 客户端,调用 memcached 的服务进行对象存取操作。


第一种,PHP 有一个叫做 memcache 的扩展,Linux 下编译时需要带上 –enable-memcache[=DIR] 选项,Window 下则在 php.ini 中去掉 php_memcache.dll 前边的注释符,使其可用。


除此之外,还有一种方法,可以避开扩展、重新编译所带来的麻烦,那就是直接使用 php-memcached-client


本文选用第二种方式,虽然效率会比扩展库稍差一些,但问题不大。


四、PHP memcached 应用示例


首先 下载 memcached-client.php, 在下载了 memcached-client.php 之后,就可以通过这个文件中的类“memcached”对 memcached 服务进行操作了。其实代码调用非常简单,主要会用到的方法有 add()、get()、replace() 和 delete(),方法说明如下:


add ($key, $val, $exp = 0)
往 memcached 中写入对象,$key 是对象的唯一标识符,$val 是写入的对象数据,$exp 为过期时间,单位为秒,默认为不限时间;


get ($key)
从 memcached 中获取对象数据,通过对象的唯一标识符 $key 获取;


replace ($key, $value, $exp=0)
使用 $value 替换 memcached 中标识符为 $key 的对象内容,参数与 add() 方法一样,只有 $key 对象存在的情况下才会起作用;


delete ($key, $time = 0)
删除 memcached 中标识符为 $key 的对象,$time 为可选参数,表示删除之前需要等待多长时间。


下面是一段简单的测试代码,代码中对标识符为 ‘mykey’ 的对象数据进行存取操作:


<pre>
<?php
//   包含 memcached 类文件
require_once(‘memcached-client.php’);
//   选项设置
$options = array(
    
’servers’ => array(‘192.168.1.1:11211′), //memcached 服务的地址、端口,可用多个数组元素表示多个 memcached 服务
    
‘debug’ => true,  //是否打开 debug
    
‘compress_threshold’ => 10240,  //超过多少字节的数据时进行压缩
    
‘persistant’ => false  //是否使用持久连接
    
);
//   创建 memcached 对象实例
$mc = new memcached($options);
//   设置此脚本使用的唯一标识符
$key = ‘mykey’;
//   往 memcached 中写入对象
$mc->add($key, ’some random strings’);
$val = $mc->get($key);
echo
“n”.str_pad(‘$mc->add() ’, 60, ‘_’).“n”;
var_dump($val);
//   替换已写入的对象数据值
$mc->replace($key, array(’some’=>‘haha’, ‘array’=>‘xxx’));
$val = $mc->get($key);
echo
“n”.str_pad(‘$mc->replace() ’, 60, ‘_’).“n”;
var_dump($val);
//   删除 memcached 中的对象
$mc->delete($key);
$val = $mc->get($key);
echo
“n”.str_pad(‘$mc->delete() ’, 60, ‘_’).“n”;
var_dump($val);
?>
</pre>

是 不是很简单,在实际应用中,通常会把数据库查询的结果集保存到 memcached 中,下次访问时直接从 memcached 中获取,而不再做数据库查询操作,这样可以在很大程度上减轻数据库的负担。通常会将 SQL 语句 md5() 之后的值作为唯一标识符 key。下边是一个利用 memcached 来缓存数据库查询结果集的示例(此代码片段紧接上边的示例代码):


<?php
$sql
= ‘SELECT * FROM users’;
$key = md5($sql);   //memcached 对象标识符
if ( !($datas = $mc->get($key)) ) {
    
//   在 memcached 中未获取到缓存数据,则使用数据库查询获取记录集。
    
echo “n”.str_pad(‘Read datas from MySQL.’, 60, ‘_’).“n”;
    
$conn = mysql_connect(‘localhost’, ‘test’, ‘test’);
    
mysql_select_db(‘test’);
    
$result = mysql_query($sql);
     while (
$row = mysql_fetch_object($result))
        
$datas[] = $row;
    
//   将数据库中获取到的结果集数据保存到 memcached 中,以供下次访问时使用。
    
$mc->add($key, $datas);
} else {
     echo
“n”.str_pad(‘Read datas from memcached.’, 60, ‘_’).“n”;
}
var_dump($datas);
?>

可以看出,使用 memcached 之后,可以减少数据库连接、查询操作,数据库负载下来了,脚本的运行速度也提高了。


之前我曾经写过一篇名为《PHP 实现多服务器共享 SESSION 数据》文章,文中的 SESSION 是使用数据库保存的,在并发访问量大的时候,服务器的负载会很大,经常会超出 MySQL 最大连接数,利用 memcached,我们可以很好地解决这个问题,工作原理如下:



  • 用 户访问网页时,查看 memcached 中是否有当前用户的 SESSION 数据,使用 session_id() 作为唯一标识符;如果数据存在,则直接返回,如果不存在,再进行数据库连接,获取 SESSION 数据,并将此数据保存到 memcached 中,供下次使用;
  • 当前的 PHP 运行结束(或使用了 session_write_close()) 时,会调用 My_Sess::write() 方法,将数据写入数据库,这样的话,每次仍然会有数据库操作,对于这个方法,也需要进行优化。使用一个全局变量,记录用户进入页面时的 SESSION 数据,然后在 write() 方法内比较此数据与想要写入的 SESSION 数据是否相同,不同才进行数据库连接、写入数据库,同时将 memcached 中对应的对象删除,如果相同的话,则表示 SESSION 数据未改变,那么就可以不做任何操作,直接返回了;
  • 那 么用户 SESSION 过期时间怎么解决呢?记得 memcached 的 add() 方法有个过期时间参数 $exp 吗?把这个参数值设置成小于 SESSION 最大存活时间即可。另外别忘了给那些一直在线的用户延续 SESSION 时长,这个可以在 write() 方法中解决,通过判断时间,符合条件则更新数据库数据。

五、相关资源


补充:::::

通常的网页缓存方式有动态缓存和静态缓存等几种,在ASP.NET中已经可以实现对页面局部进行缓存,而使用memcached的缓存比
ASP.NET的局部缓存更加灵活,可以缓存任意的对象,不管是否在页面上输出。而memcached最大的优点是可以分布式的部署,这对于大规模应用来说也是必不可少的要求。
LiveJournal.com使用了memcached在前端进行缓存,取得了良好的效果,而像wikipedia,sourceforge等也采用了或即将采用memcached作为缓存工具。memcached可以大规模网站应用发挥巨大的作用。

Memcached是什么?
Memcached是高性能的,分布式的内存对象缓存系统,用于在动态应用中减少数据库负载,提升访问速度。
Memcached由Danga
Interactive开发,用于提升LiveJournal.com访问速度的。LJ每秒动态页面访问量几千次,用户700万。Memcached将数据库负载大幅度降低,更好的分配资源,更快速访问。

如何使用memcached-Server端?
在服务端运行:
# ./memcached -d -m 2048 -l 10.0.0.40 -p 11211
这将会启动一个占用2G内存的进程,并打开11211端口用于接收请求。由于32位系统只能处理4G内存的寻址,所以在大于4G内存使用PAE的32位服务器上可以运行2-3个进程,并在不同端口进行监听。

如何使用memcached-Client端?
在应用端包含一个用于描述Client的Class后,就可以直接使用,非常简单。
PHP Example:
$options["servers"] = array("192.168.1.41:11211",
"192.168.1.42:11212");
$options["debug"] = false;
$memc = new MemCachedClient($options);
$myarr = array("one","two", 3);
$memc->set("key_one", $myarr);
$val = $memc->get("key_one");
print $val[0]."\n"; // prints 'one‘
print $val[1]."\n"; // prints 'two‘
print $val[2]."\n"; // prints 3

为什么不使用数据库做这些?

暂且不考虑使用什么样的数据库(MS-SQL, Oracle, Postgres,
MysQL-InnoDB, etc..), 实现事务(ACID,Atomicity, Consistency,
Isolation, and Durability
)需要大量开销,特别当使用到硬盘的时候,这就意味着查询可能会阻塞。当使用不包含事务的数据库(例如Mysql-MyISAM),上面的开销不存在,但读线程又可能会被写线程阻塞。
Memcached从不阻塞,速度非常快。

为什么不使用共享内存?
最初的缓存做法是在线程内对对象进行缓存,但这样进程间就无法共享缓存,命中率非常低,导致缓存效率极低。后来出现了共享内存的缓存,多个进程或者线程共享同一块缓存,但毕竟还是只能局限在一台机器上,多台机器做相同的缓存同样是一种资源的浪费,而且命中率也比较低。
Memcached
Server和Clients共同工作,实现跨服务器分布式的全局的缓存。并且可以与Web
Server共同工作,Web
Server对CPU要求高,对内存要求低,Memcached
Server对CPU要求低,对内存要求高,所以可以搭配使用。

Mysql 4.x的缓存怎么样?
Mysql查询缓存不是很理想,因为以下几点:
当指定的表发生更新后,查询缓存会被清空。在一个大负载的系统上这样的事情发生的非常频繁,导致查询缓存效率非常低,有的情况下甚至还不如不开,因为它对cache的管理还是会有开销。
在32位机器上,Mysql对内存的操作还是被限制在4G以内,但memcached可以分布开,内存规模理论上不受限制。
Mysql上的是查询缓存,而不是对象缓存,如果在查询后还需要大量其它操作,查询缓存就帮不上忙了。
如果要缓存的数据不大,并且查询的不是非常频繁,这样的情况下可以用Mysql
查询缓存,不然的话memcached更好。

数据库同步怎么样?
这里的数据库同步是指的类似Mysql
Master-Slave模式的靠日志同步实现数据库同步的机制。
你可以分布读操作,但无法分布写操作,但写操作的同步需要消耗大量的资源,而且这个开销是随着slave服务器的增长而不断增长的。
下一步是要对数据库进行水平切分,从而让不同的数据分布到不同的数据库服务器组上,从而实现分布的读写,这需要在应用中实现根据不同的数据连接不同的数据库。
当这一模式工作后(我们也推荐这样做),更多的数据库导致更多的让人头疼的硬件错误。
Memcached可以有效的降低对数据库的访问,让数据库用主要的精力来做不频繁的写操作,而这是数据库自己控制的,很少会自己阻塞
自己。

Memcached快吗?

非常快,它使用libevent,可以应付任意数量打开的连接(使用epoll,而非poll),使用非阻塞网络IO,分布式散列对象到不同的服务器,查询复杂度是O(1)。


最早发于:2007-06-23 11:35:00
类别:默认分类 | 评论(0) | 浏览()
 
2008-06-13 18:42
从新浪挖来的
<script>
function getLocTime(nS) {
    return new Date(parseInt(nS) * 1000).toLocaleString().replace(/年|月/g, " - ").replace(/日/g, " ");
}
alert(getLocTime(1177824835));
</script>
最早发于:2007-05-17 17:15:00
类别:默认分类 | 评论(0) | 浏览()
 
2008-06-13 18:42
看到很多国外网站上开始有了语音验证码功能,觉得挺好玩,而且也方便一些视力不好的人士,所以自己也尝试做了一个玩玩,是用的PHP+FLASH完成的,主要代码如下:

PHP文件
<?PHP
/* vim: set expandtab tabstop=4 shiftwidth=4 foldmethod=marker: */
/**
* @Name        voice_code.php
* @Note        语音验证码
* @Author      arcow@21xp.com
* @Created     2007/4/26
* @Version     1.0
*
*/

header('Content-type: audio/mpeg');

//随机种子
list($usec, $sec) = explode(' ', microtime());
$randtime =   (float) $sec + ((float) $usec * 100000);
srand($randtime);
//随机验证码
$authnum = '';
//$str = 'abcdefghijkmnpqrstuvwxyz1234567890';
$str = '1234567890';
$l = strlen($str);
for($i=1;$i<=4;$i++)
{
    
$num=rand(0,$l);
    
$authnum.= $str[$num];
}
//把随机验证码记录到session
$_SESSION['auth_code'] = $authnum;
//转成字符串,方便用数组调用
$code = strval($authnum);

readfile("sound/begin.mp3");
for($i=0;$i<strlen($code);$i++)
{
    
$soundNum = $code[$i];
    
readfile("sound/$soundNum.mp3");
}
readfile("sound/end.mp3");
?>

Html文件
<html>
<head>
<title>语音验证码示例文件(voice verification code Sample) by arcow@21xp.com</title>
<script language="javascript">...
var myimages=new Array();
function preloadimages()
...{
    
for (i=0;i<preloadimages.arguments.length;i++)
    
...{
         myimages[i]
=new Image();
         myimages[i].src
=preloadimages.arguments[i]
     }

}

preloadimages(
"sound/audio.jpg");
</script>
</head>
<body>
<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0" width="0" height="0" id="code_play" align="middle">
<param name="allowScriptAccess" value="always" />
<param name="FlashVars" value="url=voice_code.php" />
<param name="movie" value="code_play.swf"/>
<param name="quality" value="high" />
<param name="bgcolor" value="#ffffff" />
<embed id="code_play" name="code_play" src="code_play.swf"   FlashVars="url=voice_code.php" quality="high" bgcolor="#ffffff" width="0" height="0" align="middle" allowScriptAccess="always" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" />
</object>
<script language="javascript">...
function readVoiceCode()
...{
     document.getElementById(
'code_img').src = "sound/audio.jpg";
     document.getElementById(
'againListen').style.display='';
     document.getElementById(
'readVoiceBtn').style.display='none';
     window.document.code_play.SetVariable(
"isPlay", "1");
}

</script>
<a href="javascript:void(0);" onclick="javascript:readVoiceCode();" id="readVoiceBtn">读语音验证码</a>
<a href="javascript:void(0);" onclick="javascript:readVoiceCode();" id="againListen" style="display:none;">没听清?再听一次</a>
<img src='sound/default.jpg' id="code_img">
</body>
</html>

全部源码包(PHP,FLASH,声音文件等源文件)下载地址为:http://bbs.chinaunix.net/viewthread.php?tid=928953&extra=page%3D1
最早发于:2007-04-26 15:07:00
类别:默认分类 | 评论(0) | 浏览()
 
2008-06-13 18:40



提示:getEmementsByName方法的作用是根据 NAME 标签属性的值获取对象的集合。
样例一
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>判断单选框或复选框是否选中</title>
</head>

<body>
<input name="radio1" type="radio" value="test">
<button  onClick="alert('单选项'+(document.getElementsByName('radio1')[0].checked? '':'没有')+'选中')">测试</button><br>
<input name="radio1" type="radio" value="test">
<button onClick="alert('单选项'+(document.getElementsByName('radio1')[1].checked?'':'没有')+'选中')">测试</button><br>

<input name="checkbox1" type="checkbox" value="test">
<button onClick="alert('多选项'+(document.getElementsByName('checkbox1')[0]. checked?'':'没有')+'选中')">测试</button><br>
<input name="checkbox1" type="checkbox" value="test">
<button onClick="alert('多选项'+(document.getElementsByName('checkbox1')[1].checked?'':'没有')+'选中')">测试</button>

提示:getEmementsByName方法的作用是根据 NAME 标签属性的值获取对象的集合。
</body>
</html>

样例二:
<form name="myform" action="" method="" onsubmit="return check()">
<input type="radio" name="picno" value="1">
<input type="radio" name="picno" value="2">
<input type="radio" name="picno" value="3">
<input type="submit" value="Submit">
</form>
<script language="JavaScript">...
function check()...{
    
var flag=0
    
for(i=0;i<myform.picno.length;i++)
    
if(myform.picno[i].checked==true)...{
         flag
=1
        
break
     }

    
if(!flag)...{
         alert(
"请先选择更换图片的位置")
        
return false
     }

}

</script>

最早发于:2007-04-03 14:36:00
类别:默认分类 | 评论(0) | 浏览()
 
2008-06-13 18:38
<script language="javascript">
//去左空格;
function ltrim(s){
    return s.replace( /^\s*/, "");
}
//去右空格;
function rtrim(s){
    return s.replace( /\s*$/, "");
}
//去左右空格;
function trim(s){
    return rtrim(ltrim(s));
}
</script>
最早发于:2007-03-30 17:59:00
类别:默认分类 | 评论(0) | 浏览()
 
2008-06-13 18:38
在IE和FireFox下都支持的窗口退出提示
By 男生贞子 发表于 2006-10-14 14:43:00

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<script language="javascript">
    zringCheckUnload = true;
    window.onbeforeunload = function() { if(zringCheckUnload)return("您确定退出该页面么?");}
</script>
<body>
</body>
</html>
最早发于:2007-03-26 14:27:00
类别:默认分类 | 评论(0) | 浏览()
 
2008-06-13 18:38
{* do this somewhere at the top of your template *}
{assign var="title" value=$title|default:"no title"}

{* if $title was empty, it now contains the value "no title" when you print it *}
{$title}
详情搜索smarty手册中
Default Variable Handling
最早发于:2007-03-14 10:31:00
类别:默认分类 | 评论(0) | 浏览()
 
     
 
 
文章分类
 
 
 
 
 
 
Php(4)
 
 
 
Seo(1)
 
 
     
 
文章存档
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
     
 
最新文章评论
   

imfantasy@qq.com 谢谢
 

ilsanbao@163.com
 

h365@qq.com
 

晚上好
 

不懂...
 
     


©2009 Baidu