2013年2月21日星期四

Linux Find 命令使用详解


 通过文件名查找法:

这个方法说起来就和在WINDOWS下查找文件一样容易理解了。如果你把这个文件放在单个的文件夹里面,只要使用常见的“ls"命令就能方便的查找出来,那么使用“find”命令来查找它就不能给你留下深刻的印象,毕竟“find”命令的强大功能不止这个。如果知道了某个文件的文件名,而不知道这个文件放到哪个文件夹,甚至是层层套嵌的文件夹里。举例说明,假设你忘记了httpd.conf这个文件在系统的哪个目录下,甚至在系统的某个地方也不知道,则这是可以使用如下命令:

  find / -name httpd.conf

  这个命令语法看起来很容易就明白了,就是直接在find后面写上 -name,表明要求系统按照文件名查找,最后写上httpd.conf这个目标文件名即可。稍等一会系统会在计算机屏幕上显示出查找结果列表:

  etc/httpd/conf/httpd.conf

  这就是httpd.conf这个文件在Linux系统中的完整路径。查找成功。

  如果输入以上查找命令后系统并没有显示出结果,那么不要以为系统没有执行find/ -name httpd.conf命令,而可能是你的系统中没有安装Apache服务器,这时只要你安装了Apache Web服务器,然后再使用find / -name httpd.conf就能找到这个配置文件了。

  无错误查找技巧:

在Linux系统中“find”命令是大多数系统用户都可以使用的命令,并不是ROOT系统管理员的专利。但是普通用户使用“find”命令时也有可能遇到这样的问题,那就是Linux系统中系统管理员ROOT可以把某些文件目录设置成禁止访问模式。这样普通用户就没有权限用“find”命令来查询这些目录或者文件。当普通用户使用“find”命令来查询这些文件目录是,往往会出现"Permissiondenied."(禁止访问)字样。系统将无法查询到你想要的文件。为了避免这样的错误,我们可是使用转移错误提示的方法尝试着查找文件,输入

  find / -name access_log 2>/dev/null

  这个方法是把查找错误提示转移到特定的目录中去。系统执行这个命令后,遇到错误的信息就直接输送到stderrstream 2 中,access_log 2就是表明系统将把错误信息输送到stderrstream 2中,/dev/null是一个特殊的文件,表明空的或者错误的信息,这样查询到的错误信息将被转移了,不会再显示了。

  在Linux系统查找文件也会遇到这样一个实际问题。如果我们在整个硬盘,这个系统中查找某个文件就要花费相当长的一段时间,特别是大型Linux系统和容量较大的硬盘,文件放在套嵌很深的目录中的时候。如果我们知道了这个文件存放在某个大的目录中,那么只要在这个目录中往下找就能节省很多时间了。使用find /etc -name httpd.conf 就可以解决这个问题。上面的命令就是表示在etc目录中查询httpd.conf这个文件。这里再说明一下“/ ”这个函数符号的含义,如果输入 “find/ ”就是表示要求Linux系统在整个ROOT目录下查找文件,也就是在整个硬盘上查找文件,而“find/etc”就是只在 etc目录下查找文件。因为“find/etc”表示只在etc目录下查找文件,所以查找的速度就相应要快很多了。

  根据部分文件名查找方法:

这个方法和在WINDOWS中查找已知的文件名方法是一样的。不过在Linux中根据部分文件名查找文件的方法要比在WINDOWS中的同类查找方法要强大得多。例如我们知道某个文件包含有srm这3个字母,那么要找到系统中所有包含有这3个字母的文件是可以实现的,输入:

  find /etc -name '*srm*'

  这个命令表明了Linux系统将在/etc整个目录中查找所有的包含有srm这3个字母的文件,比如 absrmyz, tibc.srm等等符合条件的文件都能显示出来。如果你还知道这个文件是由srm 这3个字母打头的,那么我们还可以省略最前面的星号,命令如下:

  find/etc -name 'srm*'

  这是只有像srmyz 这样的文件才被查找出来,象absrmyz或者 absrm这样的文件都不符合要求,不被显示,这样查找文件的效率和可靠性就大大增强了。

linux 的shell之一 bash简介


Bash(GNU Bourne-Again Shell)是许多Linux平台的内定Shell,事实上,还有许多传统UNIX上用的Shell,像tcsh、csh、ash、bsh、ksh等等,Shell Script大致都类同,当您学会一种Shell以后,其它的Shell会很快就上手,大多数的时候,一个Shell Script通常可以在很多种Shell上使用。
bash 是一个为GNU项目编写的Unix shell。它的名字是一系列缩写:Bourne-Again SHell — 这是关于Bourne shell(sh)的一个双关语(Bourne again / born again)。Bourne shell是一个早期的重要shell,由Stephen Bourne在1978年前后编写,并同Version 7 Unix一起发布。bash则在1987年由Brian Fox创造。在1990年,Chet Ramey成为了主要的维护者。
bash是大多数Linux系统以及Mac OS X v10.4默认的shell,它能运行于大多数Unix风格的操作系统之上,甚至被移植到了Microsoft Windows上的Cygwin系统中,以实现windows的POSIX虚拟接口。此外,它也被DJGPP项目移植到了MS-DOS上。
bash的命令语法是Bourne shell命令语法的超集。数量庞大的Bourne shell脚本大多不经修改即可以在bash中执行,只有那些引用了Bourne特殊变量或使用了Bourne的内置命令的脚本才需要修改。 bash的命令语法很多来自Korn shell (ksh) 和 C shell (csh), 例如命令行编辑,命令历史,目录栈,$RANDOM 和 $PPID 变量,以及POSIX的命令置换语法: $(...)。作为一个交互式的shell,按下TAB键即可自动补全已部分输入的程序名,文件名,变量名等等。[1]
事实上对于刚接触linux的人而言,Linux/Unix的bash就相当于windows的dos命令提示符. 可以交互操作,也可以进行批处理操作,然而不同的是bash等shell的开发具有较强针对性,因而其功能及易用性远比dos命令提示符大得多。
编辑本段
参数说明

[2]-c字符串:若用-c参数,则bash从字符串中读入命令,如果字符串后还有变量就被设定为从$0开始的位置参数。
-i:若用-i参数,则bash是交互的。
-s:若用-s参数,则bash从标准输入中读入命令(在执行完-c带的命令之后。)直到输入exit。
-:单一的-符号表明参数执行完毕,并且屏蔽此后所跟参数,后面的所有变量都被看作是文件名。
-norc:如果bash是交互的,则不执行个人初始化文件:-/.bashrc,如果bash作为sh来运行,这个参数缺省是关闭的。
-noprofile:不执行系统范围的启动文件/etc/profile也不执行个人的启动文件-/.bash_profile,-/.bash_login或-/.profile,缺省情况下,bash作为登录的shell时以这些文件作为启动文件。
--refile文件名:如果bash是交互的,则以此文件作为bash的启动文件。替代-/.bashrc。
-version:在bash开始时显示此bash的版本号。
-quiet:不显示版本号和其他信息,这是缺省值。
-login:激活bash,伪装为登录shell。
-nobraceexpansion:不执行大括号扩展。
-nolineediting:在交互状态下不使用GNU的readline库去读取命令。即取消了命令行编辑功能。
-posix:改变bash的行为,使其符合Posix 1003.2规定的标准。

Linux shell编程之 while循环



#!/bin/bash
date;
x=0
while [ $x -lt 10 ];
do
    y="$x"
    while [ $y -gt 0 ];#这里应该有个分号。
    do
        echo -e "$y \c"
        y=`echo "$y-1"|bc`#y=y+1的意思,下面有个x=x-1
    done
    echo $x
    x=`echo "$x+1"|bc`
done
运行结果:
night@night-desktop:~/Desktop$ ./test.sh
2009年 05月 03日 星期日 14:35:54 CST
0
1 1
2 1 2
3 2 1 3
4 3 2 1 4
5 4 3 2 1 5
6 5 4 3 2 1 6
7 6 5 4 3 2 1 7
8 7 6 5 4 3 2 1 8
9 8 7 6 5 4 3 2 1 9

while :
do
    read CMD
    case $CMD in
        [qQ]|[qQ][uU][iI][tT]) break;;
        *) $CMD
    esac
done
#Linux

Linux shell编程之 while循环



#!/bin/bash
date;
x=0
while [ $x -lt 10 ];
do
    y="$x"
    while [ $y -gt 0 ];#这里应该有个分号。
    do
        echo -e "$y \c"
        y=`echo "$y-1"|bc`#y=y+1的意思,下面有个x=x-1
    done
    echo $x
    x=`echo "$x+1"|bc`
done
运行结果:
night@night-desktop:~/Desktop$ ./test.sh
2009年 05月 03日 星期日 14:35:54 CST
0
1 1
2 1 2
3 2 1 3
4 3 2 1 4
5 4 3 2 1 5
6 5 4 3 2 1 6
7 6 5 4 3 2 1 7
8 7 6 5 4 3 2 1 8
9 8 7 6 5 4 3 2 1 9

while :
do
    read CMD
    case $CMD in
        [qQ]|[qQ][uU][iI][tT]) break;;
        *) $CMD
    esac
done
#Linux

linux 中shell, 關於兩個整數之間的判定,例如 test n1 -eq n2


-eq 兩數值相等 (equal)
-ne 兩數值不等 (not equal)
-gt n1 大於 n2 (greater than)
-lt n1 小於 n2 (less than)
-ge n1 大於等於 n2 (greater than or equal)
-le n1 小於等於 n2 (less than or equal)

Linux Shell编程入门



从程序员的角度来看, Shell本身是一种用C语言编写的程序,从用户的角度来看,Shell是用户与Linux操作系统沟通的桥梁。用户既可以输入命令执行,又可以利用 Shell脚本编程,完成更加复杂的操作。在Linux GUI日益完善的今天,在系统管理等领域,Shell编程仍然起着不可忽视的作用。深入地了解和熟练地掌握Shell编程,是每一个Linux用户的必修 功课之一。

Linux的Shell种类众多,常见的有:Bourne Shell(/usr/bin/sh或/bin/sh)、Bourne Again Shell(/bin/bash)、C Shell(/usr/bin/csh)、K Shell(/usr/bin/ksh)、Shell for Root(/sbin/sh),等等。不同的Shell语言的语法有所不同,所以不能交换使用。每种Shell都有其特色之处,基本上,掌握其中任何一种 就足够了。在本文中,我们关注的重点是Bash,也就是Bourne Again Shell,由于易用和免费,Bash在日常工作中被广泛使用;同时,Bash也是大多数Linux系统默认的Shell。在一般情况下,人们并不区分 Bourne Shell和Bourne Again Shell,所以,在下面的文字中,我们可以看到#!/bin/sh,它同样也可以改为#!/bin/bash。

利用vi等文本编辑器编写Shell脚本的格式是固定的,如下:

#!/bin/sh

#comments

Your commands go here

首行中的符号#!告诉系统其后路径所指定的程序即是解释此脚本文件的Shell程 序。如果首行没有这句话,在执行脚本文件的时候,将会出现错误。后续的部分就是主程序,Shell脚本像高级语言一样,也有变量赋值,也有控制语句。除第 一行外,以#开头的行就是注释行,直到此行的结束。如果一行未完成,可以在行尾加上",这个符号表明下一行与此行会合并为同一行。

编辑完毕,将脚本存盘为filename.sh,文件名后缀sh表明这是一个Bash脚本文件。执行脚本的时候,要先将脚本文件的属性改为可执行的:

chmod +x filename.sh

执行脚本的方法是:

./filename.sh

下面我们从经典的“hello world”入手,看一看最简单的Shell脚本的模样。

#!/bin/sh

#print hello world in the console window

a = "hello world"

echo $a

Shell Script是一种弱类型语言,使用变量的时候无需首先声明其类型。新的变量会在本地数据区分配内存进行存储,这个变量归当前的Shell所有,任何子进 程都不能访问本地变量。这些变量与环境变量不同,环境变量被存储在另一内存区,叫做用户环境区,这块内存中的变量可以被子进程访问。变量赋值的方式是:

variable_name = variable_value

如果对一个已经有值的变量赋值,新值将取代旧值。取值的时候要在变量名前加$,$variable_name可以在引号中使用,这一点和其他高级语言是明显不同的。如果出现混淆的情况,可以使用花括号来区分,例如:

echo "Hi, $as"

就不会输出“Hi, hello worlds”,而是输出“Hi,”。这是因为Shell把$as当成一个变量,而$as未被赋值,其值为空。正确的方法是:

echo "Hi, ${a}s"

单引号中的变量不会进行变量替换操作。
关于变量,还需要知道几个与其相关的Linux命令。

env用于显示用户环境区中的变量及其取值;set用于显示本地数据区和用户环境区中的变量及其取值;unset用于删除指定变量当前的取值,该值将被指定为NULL;export命令用于将本地数据区中的变量转移到用户环境区。

下面我们来看一个更复杂的例子,结合这个例子,我们来讲述Shell Script的语法。
 1 #!/bin/bash
 2 # we have less than 3 arguments. Print the help text:
 3 if [ $# -lt 3 ]; then
 4 cat<<HELP
 5      ren -- renames a number of files using sed regular expressions
 6
 7      USAGE: ren 'regexp' 'replacement' files
 8      EXAMPLE: rename all *.HTM files in *.html:
 9      ren 'HTM$' 'html' *.HTM
10
11 HELP
12      exit 0
13 fi
14 OLD="$1"
15 NEW="$2"
16 # The shift command removes one argument from the list of
17 # command line arguments.
18 shift
19 shift
20 # $* contains now all the files:
21 for file in $*; do
22 if [ -f "$file" ]; then
23     newfile=`echo "$file" | sed  "s/${OLD}/${NEW}/g"`
24         if [ -f "$newfile" ]; then
25             echo "ERROR: $newfile exists already"
26         else
27             echo "renaming $file to $newfile "
28             mv "$file" "$newfile"
29         fi
30 fi
31 done

我们从头来看,前面两行上一个例子中已经解释过了,从第三行开始,有新的内容。if语句和其他编程语言相似,都是流程控制语句。它的语法是:

if …; then



elif …; then



else



fi

与其他语言不同,Shell Script中if语句的条件部分要以分号来分隔。第三行中的[]表示条件测试,常用的条件测试有下面几种:

[ -f "$file" ] 判断$file是否是一个文件

[ $a -lt 3 ] 判断$a的值是否小于3,同样-gt和-le分别表示大于或小于等于

[ -x "$file" ] 判断$file是否存在且有可执行权限,同样-r测试文件可读性

[ -n "$a" ] 判断变量$a是否有值,测试空串用-z

[ "$a" = "$b" ] 判断$a和$b的取值是否相等

[ cond1 -a cond2 ] 判断cond1和cond2是否同时成立,-o表示cond1和cond2有一成立

要注意条件测试部分中的空格。在方括号的两侧都有空格,在-f、-lt、=等符号两侧同样也有空格。如果没有这些空格,Shell解释脚本的时候就会出错。

$#表示包括$0在内的命令行参数的个数。在Shell中,脚本名称本身是$0,剩下的依次是$0、$1、$2…、${10}、${11},等等。$*表示整个参数列表,不包括$0,也就是说不包括文件名的参数列表。

现在我们明白第三行的含义是如果脚本文件的参数少于三个,则执行if和fi语句之间 的内容。然后,从第四行到第十一行之间的内容在Shell Script编程中被称为Here文档,Here文档用于将多行文本传递给某一命令。Here文档的格式是以<<开始,后跟一个字符串,在 Here文档结束的时候,这个字符串同样也要出现,表示文档结束。在本例中,Here文档被输出给cat命令,也即将文档内容打印在屏幕上,起到显示帮助 信息的作用。

第十二行的exit是Linux的命令,表示退出当前进程。在Shell脚本中可以使用所有的Linux命令,利用上面的cat和exit,从一方面来说,熟练使用Linux命令也可以大大减少Shell脚本的长度。

十四、十五两句是赋值语句,分别将第一和第二参数赋值给变量OLD和NEW。紧接下来的两句是注释,注释下面的两条shift的作用是将参数列表中的第一个和第二个参数删除,后面的参数依次变为新的第一和第二参数,注意参数列表原本也不包括$0。

然后,自二十一行到三十一行是一个循环语句。Shell Script中的循环有下面几种格式:

while [ cond1 ] && { || } [ cond2 ] …; do



done

for var in …; do



done

for (( cond1; cond2; cond3 )) do



done

until [ cond1 ] && { || } [ cond2 ] …; do



done

在上面这些循环中,也可以使用类似C语言中的break和continue语句中断 当前的循环操作。第二十一行的循环是将参数列表中的参数一个一个地放入变量file中。然后进入循环,判断file是否为一个文件,如果是文件的话,则用 sed命令搜索和生成新的文件名。sed基本上可以看成一个查找替换程序,从标准输入,例如管道读入文本,并将结果输出到标准输出,sed使用正则表达式 进行搜索。在第二十三行中,backtick(`)的作用是取出两个backtick之间的命令输出结果,在这里,也就是将结果取出赋给变量 newfile。此后,判断newfile是否已经存在,否则就把file改成newfile。这样我们就明白这个脚本的作用了,Shell Script编写的其他脚本与此相似,只不过是语法和用法稍有不同而已。

通过这个例子我们明白了Shell Script的编写规则,但还有几件事情需要讲述一下。

第一个,除了if语句之外,Shell Script中也有类似C语言中多分支结构的case语句,它的语法是:

case var in

pattern 1 )

… ;;

pattern 2 )

… ;;

*)

… ;;

esac


我们再就下面一个例子,看看case语句的用法。

while getopts vc: OPTION

do

case $OPTION in

c) COPIES=$OPTARG

     ehco "$COPIES";;

v) echo "suyang";;

\?) exit 1;;

esac

done

上面的getopts类似于C语言提供的函数getopts,在Shell Script中,getopts经常和while语句联合起来使用。getopts的语法如下:

getopts option_string variable

option_string中包含一串单字符选项,若getopts在命令行参数中 发现了连字符,那么它会将连字符之后的字符与option_string进行比较,若匹配成功,则把变量variable的值设为该选项,若无匹配,则把 变量的值设为?。有时候,选项还会带一个值,例如-c5等,这时要在option_string中该选项字母后面加上一个冒号,getopts发现冒号 后,会读取该值,然后将该值放入特殊变量OPTARG中。这个命令比较复杂,如有需要,读者可以详细参阅Shell编写的相关资料。

上面这个循环的作用就是依次取出脚本名称后面的选项,进行处理,如果输入了非法选项,则进入"?指定的部分,退出脚本程序。

第二个,Bash提供了一种用于交互式应用的扩展select,用户可以从一组不同的值中进行选择。其语法如下:

select var in …; do

break;

done

例如,下面这段程序的输出是:

#!/bin/bash

echo "Your choice?"

select var in "a" "b" "c"; do

break

done

echo $var

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

Your choice?

1) a

2) b

3) c

第三,Shell Script中也可以使用自定义的函数,其语法形式如下:

functionname()

{



}

例如我们可以把上面第二个例子中第四到第十二行放入一个名为help函数体内,以后每次调用的时候直接写help即可。函数中处理函数调用参数的方法是,直接用上面讲过的$1、$2来分别表示第一、第二个参数,用$*表示参数列表。

第四,我们也可以在Shell下调试Shell Script脚本,当然最简单的方法就是用echo输出查看变量取值了。Bash也提供了真正的调试方法,就是执行脚本的时候用-x参数。

sh ?x filename.sh

这会执行脚本并显示脚本中所有变量的取值,也可以使用参数-n,它并不执行脚本,只是返回所有的语法错误。

PHP 命令模式 执行文件 并传递参数



windows下。

使用cmd命令行执行php

把php目录放进环境变量path下面。

然后在命令行可以直接使用

用法1:php xxx.php

用法2:php xxx.php param1 param2 param1,param2,为参数。

xxx.php文件可以接受传入的这两个参数,分别用$argv[1],$argv[2]接受传入的param1和param2.。

例子: xxx.php文件代码如下: 在命令行下运行:php xxx.php 1 10 则输出:1 2 3 4 5 6 7 8 9 10

Linux:使用ulimit设置文件最大打开数


大家都知道Linux系统默认打开文件数是1024,而实际的生产环境中,这个值总是显得太小,而太小的后果就是你的系统会报:too many open files 等这样的错误导致你系统死掉,所以我们总是要修改这个值,虽然表面上看来,Linux提供了ulimit这样的命令让你修改这个文件打开数,但不幸的是,过程远远没有看到的那么简单,下面子猴就谈谈这方面的问题。

1、  首先我们通过ulimit –a命令来查看系统的一些资源限制情况,如下:

红框中所示的是最大文件打开数,一般情况下是1024,但由于我系统已经改为了32768,所以现在看到的是32768。

我们也可以通过ulimit –n命令来查看最大文件打开数,如下:

32768

2、  修改目标

我们的目标是:让每一个用户登录系统后系统打开的最大文件数都是我们设定好的。

但我这里不得不说的是:非常遗憾,网上很多这方面关于ulimit设置修改资源限制的文章,但没一篇文章管用。

把这个目标分解为两个目标:

2.1、设置对root用户登录系统生效

这个目标可以实现起来不难

2.2、设置对所有用户生效

这个就非常麻烦了,弄不好还会把你的系统给整坏,因为要重编译Linux的内核才行!

所以权衡之下,我只实现了第一个目标,因为第二个目标的风险太大,我想如果我之前知道这点,那么我在装系统的时候我会先做这个处理,但现在我觉得已经晚了。

3、  修改的地方

3.1、修改/etc/security/limits.conf

通过 vi /etc/security/limits.conf修改其内容,在文件最后加入(数值也可以自己定义):

* soft  nofile = 32768

* hard  nofile = 65536

3.2、修改/etc/profile

通过vi /etc/profile修改,在最后加入以下内容

ulimit -n 32768

然后重新登录即可生效了。

说明:

其实只修改/etc/profile就可以生效了,但我还是建议把/etc/security/limits.conf也修改一下。

最后强调的是,你如果要使得修改对所有用户都生效,那么现在看来你只能重新编译Linux的内核才行。

如无转载说明,则均为本站原创文章,转载请注明:来源:子猴博客


Windows下PHP集成环境Zend Studio配置


1.安装php5
   我下载了php5.2.6(一般是直接解压就可以使用)。假设解压到”c:\php5”;
2.安装MySQL5.X
3.安装Apache,将httpd.conf中的Listen端口改为8080;
4.前面3步的详细安装和配置见: http://pangdou.blog.51cto.com/396255/228434 。假设将最终的服务器脚本运行目录(比如Apache2.2\htdocs目录)放在定为 ”d:\PhpWeb”。
5.安装Zend Studio
通过http://www.zendstudio.net/zend-studio-all-in-one-download/ 链接到官方网站,例如下载Zend Studio 7.2.1版本。并一步步安装。为了方便起见,将workspace确定为”d:\PhpWeb”
6.安装配置Zend Debug
 http://downloads.zend.com/studio_debugger/5.2.26/ZendDebugger-v5.2-windows-i386.zip官方

<1>  下载到Zend Debugger的最新版。解压后可以看到适应很多php版本的Zend Debugger,比如4_3_x_comp里面的适应php4.3.x的版本等等。为了适应我的php5.2.6,这里选了5_2_x_comp里面的ZendDebugger.dll文件。
<2>  然后将选择的ZendDebugger.dll文件第一步中提到的C:\php5\ext目录下。再在C:\php5下的php.in文件中的末尾添加以下的内容(任意合适的位置都可以):
[zend]
zend_extension_ts="c:\php5\ext\ZendDebugger.dll"
zend_debugger.allow_hosts=127.0.0.1/32,127.0.0.1/24
zend_debugger.expose_remotely=always
zend_extension_ts
<3>  将<1>中Zend Debugger的解压根目录下的dummy.php文件复制到apache的Document Root目录中,这里指的是”d:\PhpWeb”(按我的设置,这个目录同时也是Zend Studio的workspace);
<4>  测试Zend Debug安装是否成功。假设在”d:\PhpWeb”目录下(存放网页脚本)已经存在文件phpinfo.php,且phpinfo.php的内容为以下几行:
<?php
phpinfo();
?>
重启Apache,然后在浏览器中输入:http://localhost:8080/phpinfo.php,正常情况下就可以出现那张熟悉的关于php配置的一系列的的网页信息,其中多出了以下的图示信息,就表明Zend Debug已经安装并配置好了。

图 1  Zend Debugger安装配置成功信息

(二)怎样使用Zend Studio来调试php程序。
假设在Zend工作已经存在以下的工程文件suiyuan。如下图2:

图2 工程suiyuan的截图
2.1 工程在Zend Studio服务器中的部署配置
在调试之前应先对这个工程的debug的选项进行一些设置。方法是:WindowPreferencesPHPDebug,然后就会弹出以下的窗口;

图 3
图中的第一个红框前面默认选择Zend Debugger,再点击第一处的红框的Configure,然后在下面的一个对话框中选择Zend Debugger,并点击Configure按钮,弹出以下的对话框

图 4
其他的都保持默认的值,注意的是在Client Host/IP中一般只保留127.0.0.1这个回环地址,因为一般是在本地调试。另外还要看到Dummy File Name中的dummy.php文件就是6.<3>中提到的那个文件,可见这个文件还是要保存在Apache的Document Root目录中的(我的设置是d:\PhpWeb)
然后点击图3中的第二处的红框(前面的选择为默认的“Default PHP Web Server”),在弹出的对话框中选择Default PHP Web Server,然后选择后面的edit按钮,弹出以下的图5,这个一般保持默认如下图示:

图 5
点击图5的Path Mapping选项卡,然后点击Add来添加该工程的Path on Server,如图6:

图 6
在“Path on Server”框中输入Apache的Document Root目录中的(我的设置是d:\PhpWeb),因为这个目录和Zend Studio的workspace是相同的,因此如图6选择Path in Workspace,然后点击Browse从而找到工程suiyuan的根目录,然后点击ok退出。至此就完成了该工程在Zend Studio上的服务器部署配置工作。下面就可以着手对工程suiyuan进行调试了。
2.2 调试
假设要调试index.php文件。在图2中的PHP Explorer窗口中选中index.php文件,然后:右键Debug AsDebug Configuration。这里假设要以PHP Web Page形式来调试,选择“PHP Web Page”,新建一个新的调试session,将Name命名为“test”,如图7。只要前面关于工程suiyuan的服务器部署配置都成功,则点击图7的“Test Debugger”按钮将会出现Success!信息。并在Browse中选择index.php文件。

图 7
点击图7的Advanced选项卡,如图8,可以对这个工程的调试文件的范围进行设定,表明在浏览其中打开的页面的内容的情况,一般保持默认的配置就可以了。这个在实际的应用中慢慢摸索。

图 8
可以在图8的Common选项卡中将调试输出信息的字体Console Encoding选择为UTF-8。

分布式缓存系统 Memcached 入门

© kekehu / 技术资源 / 2010.11.25 / 11:32 / 4282PV
维基百科上对 Memcached 的介绍是一个分布式的缓存系统, 但是 Memcachd 到底是什么意思,有什么作用呢?缓存一般用来保存一些经常被存取的数据和资源(例如:浏览器会将访问过的网页会话缓存起来),因为通过缓存来存取数据要比从磁盘存取同样的数据要快得多。所以 顾名思义,意味着 “内存缓存”,所有缓存的内容都在服务器的内存中。内存中的这些缓存数据可以通过 API 的方式被存取。数据是以 key/value 的配对方式存在的,就像一个很大的 Hash 表。

分布式是 的主要特性,所以你可以在多台服务器上来安装 来组建一个更大的缓存服务器。这样一来, 可以帮助我们使数据库的压力降到最低, 从而我们可以构建出更快的、更具扩展性的 WEB 应用。图一展示了 Memcache 如何与数据库端协同工作的情况。



图一:Memcache 如何和数据库协同工作

Memcache 如何工作?


图一展示的流程,相信有开发过数据库应用的同学都不会陌生。我们来一步步的说明图中发生了什么事情:
  1. 检查用户请求的数据是缓存中是否有存在,如果有存在的话,只需要直接把请求的数据返回,这时候跟数据库就完全扯不上关系了。
  2. 如果请求的数据在缓存中找不到,这时候再去查询数据库。返回请求数据的同时,把数据存储到缓存中一份。
  3. 保持缓存的“新鲜性”,每当数据发生变化的时候(比如,数据有被修改,或被删除的情况下),要同步的更新缓存信息,确保用户不会在缓存取到旧的数据。

显而易见, 在高并发的数据查询和海量数据输出的情况下,可以起到很大的作用。因为访问 中的内存数据,要比数据库的磁盘数据快的多。

如何安装 Memcache?

如果你想在自己的服务器上尝试使用 ,第一步就是要在你的服务器上安装 的相关组件。好在 在很多服务器的发行版软件上都已经被预安装了。你可以通过在 Shell 下执行下面的命令,来检查你的服务器上有没有被预安装了
memcached -h
如果 有被安装过,上面的命令会输出已经安装的版本号信息及一些帮助信息,否则则会返回一个错误。
下面以 CentOs 发行版为例,简单介绍一下如何安装
yum install memcached
上面的命令会在线搜索并安装最新的 包。

Memcache 在什么情况下被使用,什么情况下不要使用?


你在何时应该使用 Memcache,又要在何时避免使用它?现在你已经知道了,Memcahced 是被设计为减轻数据库端压力的。但是你最好能制定一个良好的策略,来想办法让 来尽可能的缓存那些最影响性能的查询。你可以试着为应用中的所有查询做一些执行时间日志,可以帮助你来分析哪些内容是要重点被缓存的。
现在假设你正在运营一个电子商务网站。 你可以在 中缓存产品的简介、运送信息,或者其它一些需要复杂查询的数据,等等。当一个产品页被加载的时候,上面提到的数据将会跳过数据库查询,直接从缓存中取得。缓存可以大大的改变你的网站整体性能表现,你只需要记得在后台更新产品的时候,把这些缓存一并更新就行了。
还有一些情况下,缓存数据并不是一个好主意,比如在一个数据被频繁更新的时候,每一次数据的更新,我们都需要去同时更新缓存,缓存的命中率不高,会导致一些额外的性能牺牲。这种情况下,或许直接查数据库会更好一些。

的安全性

如果你了解了 的工作流程, 你可能已经注意到了,在访问缓存的过程中,没有任何权限控制的相关流程。如果你的数据不是非常重要的,你大可不必担心这方面的安全问题。如果你需要的话,以下几点可以协助你更完全的使用它:
  1. 使用唯一的 Key:因为在 中的数据是以一个大的数组形式存在的,所以你应该使用唯一的 key。访问你的数据的唯一办法就是通过你保存数据时的 key,除此之外再没有其它可查询的办法。
  2. 保证你的 器安全: 因为 本身并没有身份验证机制,所以对 的服务器查询,都应该通过防火墙进行。你可以在防火墙上设定规则,哪些服务器是允许被访问的,哪些是不允许被访问的。
  3. 加密你的数据: 你可以将数据和 Key 通过加密的方式保存在 中。 这需要花费一些额外的 CPU 时间,但是为了你的数据安全,在情况允许的情况下,这个方法值得你去尝试。

代码实例

让我们来看一个实际的 PHP 例子。下面的代码展示了如何从缓存中取得数据,如果数据不存在,则自动从数据库中查询需要的数据,并将查询到的数据保存到缓存中的过程。
要在你的网站使用上面的代码,请先确认你有安装 Memcached 的 PHP 扩展。你可以通过 PECL 来安装对应的开发包。
class MyCache
{
  private $cache;
  function  __construct()
  {
    $this->cache = new Memcache();
    // you can replace localhost by Memcached server IP addr and port no.
    $this->cache->connect('localhost', 10987);
  }
 
  function get_data($key)
  {
    $data = $this->cache->get($key);
    if($data != null)
      return $data;
    else
    {
      if($this->cache->getResultCode() == Memcached::RES_NOTFOUND)
      {
        //do the databse query here and fetch data
        $this->cache->set($key,$data_returned_from_database);
      }
      else
      {
        error_log('No data for key '.$key);
      }
    }
  }
}
 
$cache = MyCache();
$cache->get_data('foo');

总结

是一个强大的工具,帮忙你建立像 Wikipedia、Flickr、Digg 这样的大型 WEB 应用。只要通过 就可以轻松提高你的站点性能,你还等什么?
翻译:avenge
原文链接:http://www.developer.com/features/article.php/52691_3901666_1/Getting-Started-with-Memcached-Distributed-Memory-Caching.htm

Zend Studio 插件 OpenExplorer

OpenExplorer是一款打开导进来的项目文件或文件夹所在磁盘的位置的插件。
支持Eclipse 3.2及以上版本,Zend Studio。
系统支持Mac OS X,Linux(nautilus)和Windows。

Screenshots

Open Explorer

Install

第一步:
下载最新版本的插件, 然后把它复制到你的ZendStudio插件目录
$ZendStudio_HOME/plugins
第二步:
打开$ZendStudio_HOME/configuration/org.eclipse.equinox.simpleconfigurator
目录下的bundles.info文件,在文件末尾添加如下代码:
OpenExplorer,1.5.0.v201108051513,plugins/OpenExplorer_1.5.0.v201108051513.jar,4,false
第三步:
重新启动ZendStudio

Tips

OpenExplorer支持多个选择,所以如果你选择多个目录/文件,在package explorer并单击图标,所有选中的目录/文件将被打开。

Download

https://github.com/samsonw/OpenExplorer/downloads

zend studio常见问题解答

1.zend studio 9可以破解吗?
可以的,具体破解步骤查看:http://www.geekso.com/ZendStudio9-key/
2.如何将zend studio 9的默认GBK编码设置为其它编码,例如UTF-8?
选择window菜单->Preferences->General->Workspace,在界面当中找到“Text file encoding” 选中Other,在下拉列表中选择UTF-8就可以了。这样所有的建立的项目将使用utf-8的编码。如果想某个项目使用其它编码,选中项目右键点击,在菜单中选择Preferences,弹出窗口左侧选择“Resource”,在右侧当中找到“Text file encoding” 选中Other,在下拉列表中选择你要的编码就可以了。
3.为什么我创建的项目会自动生成一个index.php文件?
当你新建项目时选择“Local PHP Project”就会产生index.php文件。所以要想不产生index.php文件,新建项目时选择PHP Project from Exiting Directoryt。
4.Zend Studio写代码不能自动提示了?
具体解决方法点击查看:http://www.geekso.com/ZendStudioCodeAutocomplete/
5.项目中出现.svn,如何隐藏?
选中项目右键点击,在出来的菜单中选择Build Path -> Configure Inclusion / Exclusion Filters… .在“Exclusion patterns:” 框中点击“Add…“按钮,输入**/.svn/  点OK按钮再点Finish按钮。
6.代码格式化后发现显示格式不是我想要的,可以设置吗?
选择window菜单->Preferences->PHP->Code Style->Formatter。点左侧“Edit”按钮进行编辑。如果你懒的编辑,我也附上了我使用的格式,你可以导入我使用的代码格式。下载地址:formatter.rar (已下载 1388 次)(记得下载后要解压)
7.zend studio10正式版如何汉化?
选择Help菜单->Install New Software...在Work with框中复制此地址:http://download.eclipse.org/technology/babel/update-site/R0.10.1/juno/,(提示:最后一个/线不能少)复制完地址后按回车键确认,这时会提示pending...(等待...),等侍完成后会出来很多语言列表让你选择,请选择“Babel Language Packs in Chinese(Simplified)”简体中文包选择项,下一步选同意,再漫长的等待之后就汉化好了,提示重启zend studio。
如果在线没有汉化成功,请下载官方的离线汉化包,离线汉化包下载地址为:
http://eclipse.org/downloads/download.php?file=/technology/babel/update-site/R0.10.1/babel-R0.10.1-juno.zip
【如何导入汉化包请看下面的第17条说明。】
8.如何选中整个行?
左键单击三次要选中的某一行,这样就选中整个行了。
9.zendstudio如何安装集成最新的svn插件?
选择Help菜单->Install New Software...在Work with中输入http://subclipse.tigris.org/update_1.8.x,等待完之后,除了Subclipse Integration for Mylyn 3.x (Optional)不要选之外,其它的都选上,下一步,完成。
10.zendstudio如何进行两个文件的比较?
选中你要比较的两个文件,右键点击,在弹出来的菜单中选取Compare With -> Each Other,这时会开启一个比较编辑器,就可以进行两个文件的比较了。(右上角的几个比较按钮自行测试它的功能)
11.新建PHP文件时怎么缺少后面的?>,如何补全?
选择window菜单->Preferences->PHP->Code Style->Code Templates,在右测点Code,选择“Simple php file” 点“Edit...”进行编辑增加?>,这样新建文件时就有后面的?>。
12.zend studio10正式版在线汉化没有成功,有汉化离线包没?
有的,官方离线下载地址:http://eclipse.org/downloads/download.php?file=/technology/babel/update-site/R0.10.1/babel-R0.10.1-juno.zip
请打开此链接后点页面的下载地址。如何导入汉化包请看下面的第17条说明。
13.有zend studio在线使用帮助教程吗?
在线使用教程地址:http://files.zend.com/help/Zend-Studio-10/zend-studio.htm
14.为什么html文件里面的内容格式化完都乱套了?
选择window菜单->Preferences->Web->HTML FIles->Editor。把Line width设置长一些,可以设置成800(默认的是72)钩上“Clear all blank lines”选中Inline Elements里面的所有内容点击“Remove”全部删除,然后点OK按钮完成设置。
15.为什么我的PHP文件在打开方式中不能选择zend studio打开呢?
文件夹中*.php文件,无法指定用zend studio,右键选择打开方式,指定zend studio.exe打开也无反应。
打开 “开始”——“运行”——输入“regedit”点回车——找到“HKEY_CLASSES_ROOT\Applications\zend studio.exe\shell\open1\command”,发现键值为:"C:\Program Files\Zend\Zend Studio 9.0.0\ZendStudio.exe" "%1"”,问题是这里,这个路径下的文件及文件夹已经删除,windows系统无法找到,所以无法添加,修改该键值为:"C:\Program Files\Zend\Zend Studio 9.0.2\ZendStudio.exe" "%1"”,(提示这个路径为你zendstudio安装所在的路径,所以要改成你安装zendstudio所在的路径)问题解决。
16.减少不必要的启动项,让启动更快
选择window菜单->Preferences->General->Startup and Shutdown
去掉下面项目前的钩
automatic updates scheduler
Subclipse Usage Reporting
Equinox Provisioning Platform Automatic Update Support
Zend Usage Data Collector
17.如何导入官方下载的离线汉化包
先解压下载下来的汉化包,然后选择Help菜单->Install New Software...在弹出的窗口中点击"add..."按钮,在弹出的窗口中点击"Local..."按钮,在弹出的窗口中选择你解压出来的汉化包的juno文件夹,点"ok"按钮,最后选择“Babel Language Packs in Chinese(Simplified)”简体中文选择项,一路Next下去就可以了。


首发Zend Studio 9.0.4正式版注册破解(2012-10-12更新)

首发Zend Studio 9.0.4正式版注册破解(2012-10-12更新)

写在前头:转发请标明转自http://www.geekso.com/ZendStudio9-key/
以下方法仅供技术交流学习,请勿非法使用,如长期使用请支持购买正版。
正版购买地址:http://shop.zend.com/en/zend-studio-for-eclipse.html
你还没有最新安装程序?
ZendStudio下载地址:http://www.geekso.com/component/zendstudio-downloads/
Zend Studio 10正式版注册破解地址:
http://www.geekso.com/ZendStudio100/
注册破解步骤
第一步:如果已经安装过Zend Studio 9.0.4的,请打开Zend Studio 9.0.4,在菜单中“help>Unregister”,如果显示是灰的跳过此步退出Zend Studio。如果显示可以点击的请点击,这时Zend Studio会重启,重启到要求你填注册码时点“QUIT”按钮

第二步:请根据你使用的Zend Studio版本下载对应的破解文件:
ZendStudio9.0破解文件com.zend.php.core_9.0.0.201111081531.jar (已下载 12729 次)
ZendStudio9.0.1破解文件com.zend.php.core_9.0.1.201112141951.jar (已下载 17655 次)
ZendStudio9.0.2破解文件com.zend.php.core_9.0.2.201202240955.jar (已下载 26139 次)
ZendStudio9.0.3破解文件com.zend.php.core_9.0.3.201206251721.jar (已下载 11376 次)
ZendStudio9.0.4破解文件com.zend.php.core_9.0.4.201210081806.jar (已下载 30224 次)

提示com.zend.php.core_9.0.4.201210081806.jar对应的版本号为9.0.4.v20121009466

下载成功后(提示:破解文件千万不要解压,也不要修改破解文件的文件名)复制到你安装Zend Studio 9.0.4的plugins目录下,覆盖同名文件。

第三步:启动Zend Studio,复制如下注册码License key,粘贴(粘贴快捷键是ctrl+v)到注册框中
  复制注册码
提示:先覆盖第二步当中的破解文件,然后在启动Zend Studio输入注册码。

第四步:查看是否注册成功,在菜单中“help>About Zend Studio ”, 显示如下图。
过期时间9999年12月31日说明注册破解成功完成。
点击在新窗口中浏览此图片
【已解决问题】
2011-12-06:解决同一局域网内相同的key只能使用一台的问题。如你遇到提示“user license number 1 is already in use by 1 users”,请重新下载破解文件。

zend studio9.0.4汉化及常见问题解答http://www.geekso.com/zendstudioquestion/

win7 64位32位,window server2008 64位,mac版都没问题,如果遇到无法注册的请留言。

我试了在CentOS(32位)操作系统下用此方法注册Zend Studio 9.0.4成功,所以Linux操作系统是没有问题的。以下是我在Linux操作系统注册成功的截图:
查看截图:http://www.geekso.com/attachment/201112/1323070502_8926bffc.png

你没破解成功,不防看一下是不是这个原因造成的?
最近发现好多朋友告诉我说注册破解没有成功,我看了下主要是因为把下载的那个破解包给解压了,造成破解不成功。所以下载完这个破解包后千万不要解压,直接覆盖到你安装Zend Studio 9.0.4的plugins目录下的同名文件。还有查看注册码复制的对不对。
为什么我复制破解文件到plugins目录时没有提示已存在同名文件?
原因1:是你下载的是9.0的测试版。建议下载最新版本的Zend Studio9.0.4,下载地址:http://www.geekso.com/component/zendstudio-downloads/
原因2:下载的破解文件版本跟你的安装的ZendStudio版本不一样。
原因3:下载的破解文件文件名跟我发布的破解文件名不一样,有可能在下载的时侯被修改了,请核对确认文件名是否被修改,必须跟我发布的文件名是一模一样的。
Linux操作系统破解zendstudio都按上面操作了,但在复制注册码时还是显示不正确?
注册码复制进去后,按下 ctrl+z (回滚),一直按回滚,一直滚到无法回滚的时候这个注册码就变成绿色的勾了!
如果以上方法你还是没有破解成功,请添加QQ群解答ZendStudio破解问题
1号QQ群:204192303(已满)。
2号QQ群:204192304(已满)。
3号QQ群:187586326(已满)。
转发请标明转自http://www.geekso.com/ZendStudio9-key/

Zend Studio 10正式版注册破解(2013-02-11更新)

Zend Studio 10正式版注册破解(2013-02-11更新)

© kekehu / ZendStudio / 2013.01.20 / 21:45 / 2873PV
1、写在前头
转发请标明转自http://www.geekso.com/ZendStudio100/
以下方法仅供技术交流学习,请勿非法使用,如长期使用请支持购买正版。
正版购买地址:http://shop.zend.com/en/zend-studio-for-eclipse.html
2、你还没有最新安装程序?
ZendStudio下载地址:http://www.geekso.com/component/zendstudio-downloads/
3、注册破解步骤
Zend Studio 10正式版破解步骤跟9.0步骤一样,如果不懂的步骤请查看:http://www.geekso.com/ZendStudio9-key/
4、破解文件
ZendStudio10破解文件:com.zend.php.core_10.0.0.201302111609.jar (已下载 1150 次)
对应的版本号为Build ID:20130211,如果你的不是请升级到此版本再覆盖,否则破解失败。安装的不是此版本?请到此处下载:http://www.geekso.com/component/zendstudio-downloads/
【如何升级?安装完后进入软件help>Check for Updates】
5、注册码License key
  复制注册码
6、汉化及常见问题解答
ZendStudio问题汇总:http://www.geekso.com/zendstudioquestion/
7、版本说明
此次正式版比上一版的测试版的性能要好很多,主要是因为测试版用的是最新的Eclipse 4.2.1(新版本Eclipse性能确实不怎么样),而正式版放弃了最新的Eclipse,而使用了Eclipse 3.8.1 juno版,性能大大提升,推荐升级此版本。


PHP:isset函数的用法、作用

PHP的isset()函数 一般用来检测变量是否设置 
格式:bool isset ( mixed var [, mixed var [, ...]] ) 

功能:检测变量是否设置 

返回值: 
若变量不存在则返回 FALSE 
若变量存在且其值为NULL,也返回 FALSE 
若变量存在且值不为NULL,则返回 TURE 
同时检查多个变量时,每个单项都符合上一条要求时才返回 TRUE,否则结果为 FALSE 
版本:PHP 3, PHP 4, PHP 5 
更多说明: 
使用 unset() 释放变量之后,它将不再是 isset()。 
PHP函数isset()只能用于变量,传递任何其它参数都将造成解析错误。 
检测常量是否已设置可使用 defined() 函数。 

PHP的empty()函数 判断值为否为空 

格式:bool empty ( mixed var ) 

功能:检查一个变量是否为空 

返回值: 
若变量不存在则返回 TRUE 
若变量存在且其值为""、0、"0"、NULL、、FALSE、array()、var $var; 以及没有任何属性的对象,则返回 TURE 
若变量存在且值不为""、0、"0"、NULL、、FALSE、array()、var $var; 以及没有任何属性的对象,则返回 FALSE 
版本:PHP 3, PHP 4, PHP 5 
更多说明: 
empty()的返回值=!(boolean) var,但不会因为变量未定义而产生警告信息。参见转换为布尔值获取更多信息。 
empty() 只能用于变量,传递任何其它参数都将造成Paser error而终止运行。 
检测常量是否已设置可使用 defined() 函数。 
例子: empty() 与 isset() 的一个简单比较 
代码如下:

<?php 
$var = 0; 
// 结果为 true,因为 $var 为空 
if (empty($var)) { 
echo '$var is either 0 or not set at all'; 
// 结果为 false,因为 $var 已设置 
if (!isset($var)) { 
echo '$var is not set at all'; 
?> 

注: 由于这是一个语言结构而非函数,因此它无法被变量函数调用。 
注: empty() 只检测变量,检测任何非变量的东西都将导致解析错误。换句话说,后边的语句将不会起作用: empty(addslashes($name))。 
下面是经过脚本之家测试过的一段isset与empty函数详细例子的代码,看完这个基本上就差不多了:
复制代码 代码如下:

<?php 
error_reporting(E_ALL); 
echo '<B>未定义$var</b><Br>'; 
echo "isset测试:<Br>"; 
if ( isset ( $var )) 
echo '变量$var存在!<Br>' ; 
echo "empty测试:<Br>"; 
if ( empty ( $var )){ 
echo '变量$var的值为空<Br>'; 
else 
echo '变量$var的值不为空<Br>'; 
echo "变量直接测试:<Br>"; 
if ( $var ){ 
echo '变量$var存在!<Br>'; 
else { 
echo '变量$var不存在!<Br>'; 
echo '----------------------------------<br>'; 
echo '<B>$var = \'\'</b><Br>'; 
echo "isset测试:<Br>"; 
$var = ''; 
if ( isset ( $var )) 
echo '变量$var存在!<Br>' ; 
echo "empty测试:<Br>"; 
if ( empty ( $var )){ 
echo '变量$var的值为空<Br>'; 
else 
echo '变量$var的值不为空<Br>'; 
echo "变量直接测试:<Br>"; 
if ( $var ){ 
echo '变量$var存在!<Br>'; 
else { 
echo '变量$var不存在!<Br>'; 
echo '----------------------------------<br>'; 
echo '<B>$var = 0</b><Br>'; 
echo 'isset测试:<Br>'; 
$var = 0 ; 
if ( isset ( $var )) 
echo '变量$var存在!<Br>' ; 
echo "empty测试:<Br>"; 
if ( empty ( $var )){ 
echo '变量$var的值为空<Br>'; 
else 
echo '变量$var的值不为空<Br>'; 
echo "变量直接测试:<Br>"; 
if ( $var ){ 
echo '变量$var存在!<Br>'; 
else { 
echo '变量$var不存在!<Br>'; 
echo '----------------------------------<br>'; 
echo '<B>$var = null</b><Br>'; 
echo 'isset测试:<Br>'; 
$var = null ; 
if ( isset ( $var )) 
echo '变量$var存在!<Br>' ; 
echo "empty测试:<Br>"; 
if ( empty ( $var )){ 
echo '变量$var的值为空<Br>'; 
else 
echo '变量$var的值不为空<Br>'; 
echo "变量直接测试:<Br>"; 
if ( $var ){ 
echo '变量$var存在!<Br>'; 
else { 
echo '变量$var不存在!<Br>'; 
echo '----------------------------------<br>'; 

echo '<B>$var ="php"</b><Br>'; 
echo 'isset测试:<Br>'; 
$var = "php"; 
if ( isset ( $var )) 
echo '变量$var存在!<Br>' ; 

echo "empty测试:<Br>"; 
if ( empty ( $var )){ 
echo '变量$var的值为空<Br>'; 
else 
echo '变量$var的值不为空<Br>'; 
echo "变量直接测试:<Br>"; 
if ( $var ){ 
echo '变量$var存在!<Br>'; 
else { 
echo '变量$var不存在!<Br>'; 
?>


在使用 php 编写页面程序时,我经常使用变量处理函数判断 php 页面尾部参数的某个变量值是否为空,开始的时候我习惯了使用 empty() 函数,却发现了一些问题,因此改用 isset() 函数,问题不再。 
顾名思义,empty() 判断一个变量是否为“空”,isset() 判断一个变量是否已经设置。正是这种所谓的“顾名思义”,令我开始时走了些弯路:当一个变量值等于0时,empty()也会成立(True),因而会发生 一些意外。原来,empty() 和 isset() 虽然都是变量处理函数,它们都用来判断变量是否已经配置,它们却是有一定的区别:empty还会检测变量是否为空、为零。当一个变量值为0,empty() 认为这个变量同等于空,即相当于没有设置。 
比如检测 $id 变量,当 $id=0 时,用empty() 和 isset() 来检测变量 $id 是否已经配置,两都将返回不同的值—— empty() 认为没有配置,isset() 能够取得 $id 的值: 

复制代码 代码如下:

$id=0; 
empty($id)?print "It's empty .":print "It's $id ."; 
//结果:It's empty . 
print "<br>"; 
!isset($id)?print "It's empty .":print "It's $id ."; 
//结果:It's 0 . 


这意味着,我们在使用变量处理函数时,当该变量可能出现0的值,使用 empty() 要小心,这个时候用 isset 取代它更明智一些。 
当一个php页面的 URL 尾部参数出现 id=0 时(比如:test.php?id=0),试比较: 

复制代码 代码如下:

if(empty($id)) $id=1; - 若 id=0 ,id 也会为1 
if(!isset($id)) $id=1; - 若 id=0 ,id 不会为1 


可分开运行以下代码检测上述推断: 

复制代码 代码如下:

if(empty($id)) $id=1; 
print $id; // 得到 1 
if(!isset($id)) $id=1; 
print $id; //得到 0 


要说它们的联系,其共同点就是empty()和 isset()都是变量处理函数,作用是判断变量是否已经配置,正是由于它们在处理变量过程中有很大的相似性,才导致对它们的关系认识不足。单从 empty()和isset()这两个函数本身来考虑的话会把人弄得更糊涂,换一个角度来它。empty()和isset()的处理对象无外乎未定义变量,0,空字符串。 
如果变量为0,则empty()会返回TRUE,isset()会返回TRUE; 

如果变量为空字符串,则empty()会返回TRUE,isset()会返回TRUE; 
如果变量未定义,则empty()会返回TRUE,isset()会返回FLASE; 

手册中对empty()的解释如下: 

描述bool empty( mixed var ) 
如果 var 是非空或非零的值,则 empty() 返回 FALSE。换句话说,”"、0、”0″、NULL、FALSE、array()、var $var; 以及没有任何属性的对象都将被认为是空的,如果 var 为空,则返回 TRUE。 
手册中对isset()的解释如下: 

isset()检测变量是否设置 

描述bool isset ( mixed var [, mixed var [, ...]] ) 

如果 var 存在则返回 TRUE,否则返回 FALSE。 

如果已经使用 unset() 释放了一个变量之后,它将不再是 isset()。若使用 isset() 测试一个被设置成 NULL 的变量,将返回 FALSE。同时要注意的是一个 NULL 字节(”?”)并不等同于 PHP 的 NULL 常数。 
警告: isset() 只能用于变量,因为传递任何其它参数都将造成解析错误。若想检测常量是否已设置,可使用 defined()函数。 

PHP:isset函数的用法、作用

isset函数是检测变量是否设置。

格式:bool isset ( mixed var [, mixed var [, ...]] )

返回值:

若变量不存在则返回 FALSE
若变量存在且其值为NULL,也返回 FALSE
若变量存在且值不为NULL,则返回 TURE
同时检查多个变量时,每个单项都符合上一条要求时才返回 TRUE,否则结果为 FALSE
如果已经使用 unset() 释放了一个变量之后,它将不再是 isset()。若使用 isset() 测试一个被设置成 NULL 的变量,将返回 FALSE。同时要注意的是一个 NULL 字节("")并不等同于 PHP 的 NULL 常数。

警告: isset() 只能用于变量,因为传递任何其它参数都将造成解析错误。若想检测常量是否已设置,可使用 defined() 函数。


<?php

$var = '';

if (isset($var)) {
print "This var is set set so I will print.";
}

// 在后边的例子中,我们将使用 var_dump函数 输出 isset() 的返回值。

$a = "test";
$b = "anothertest";

var_dump( isset($a) ); // TRUE
var_dump( isset ($a, $b) ); // TRUE

unset ($a);

var_dump( isset ($a) ); // FALSE
var_dump( isset ($a, $b) ); // FALSE

$foo = NULL;
var_dump( isset ($foo) ); // FALSE

?> 

这对于数组中的元素也同样有效: 


<?php

$a = array ('test' => 1, 'hello' => NULL);

var_dump( isset ($a['test') ); // TRUE
var_dump( isset ($a['foo') ); // FALSE
var_dump( isset ($a['hello') ); // FALSE

// 'hello' 等于 NULL,所以被认为是未赋值的。
// 如果想检测 NULL 键值,可以试试下边的方法。
var_dump( array_key_exists('hello', $a) ); // TRUE

?>