捌玖网络工作室's Archiver

admin 发表于 2008-5-30 14:32

[Zend权威认证试题讲解]第十二章 -调试与性能管理

作为一个开发者,无论你经验多么丰富,或者无论你多么努力,你的程序中总会有bug。这是生命中一个必然的部分,如同死亡与缴税(尽管并没有后面两个那么严重)。%t%k"w"aDX
要想解决bug,首先要能找到bug。事实上,许多开发者花费了无数小时茫然得盯着代码,只是因为他们没有把程序的容错能力摆在首位。忽略了这个部分,那么期望一个没有bug的程序就是——不可能的。
S%[!p3lD4ZW.E;i:k4e 本章测试题将考察你对调试和性能管理相关知识的了解,以及如何用PHP做好这两件事。H2ISig$}
CHGTU/R g#ruc

m T#X mh!z`EM 问题
;b R.yr)e8hW+l
"Rsx@,h1j!d 1.以下脚本如何用三元操作替代? 8@#@ r,IS;M
[code]
+E.wm1W`W <?phps8U8B$B)im f?}$K
if ($a < 10) {
e*Q n~/H_ YK     if ($b > 11) {+y+h&iI^i
        if ($c == 10 && $d != $c) {
u V#_t'@C5Re0C'J             $x = 0;
$Us LHLi4At^         } else {
ZZ6v+I*C*CM             $x = 1;
y^\;T R2c7E         } r"eh*E$Mf
    }xY*u)Dq2fR N'og,w
}
E%S.P p&_3S&V4^LO ?>
.h+{7RYU8Pt
:Xu3Cl*m#Hsca4l [/code]
amT]+Fh!O R A.$x = ($a A. < 10 || $b > 11 || $c == 1 && $d != $c) ? 0 : 1;
][aStt9R B.$x = ($a < 10 || $b > 11 || ($c == 1 && $d != $c)) ? 0 : 1;
yCs@&S Z C.$x = (($a < 10 && $b > 11) || ($c == 1 && $d != $c)) ? 0 : 1;pzw-d0K"q @%_i"C
D.$x = ($a < 10 && $b > 11 && $c == 1 && $d != $c) ? 1 : 0;"Hur+ZjBt
E.以上都不对hY9sN#zEX)x

#Y#j3{v:IH5EN3L4B l-q)fq.}.@4q
2.有一个脚本由于要从远程获取数据,因而运行速度很慢,以下那种方法能对其进行优化?(双选)
i"~9C GRqj },G +o:aw7s!e ^_z l
A.安装操作码缓存(opcode cache)
$K,@s)Z|zS7| B.优化或者升级你的网络连接
0dUi]C(_c;G C.添置更多的硬件Z@vC;d{,vmWu
D.增加服务器的可用RAM&c)B.P3{3w;Q#FR
E.使用连接缓存hf5^U(p:wKY

~ T*bW9ou E2sF _}X@&n*BLat
3.架设生产环境下的服务器时,需要做哪些步骤?(双选)
-le!G'TBI3Et!FC
%mXc1p+D5_$Q A.关闭错误报告#s laYJqa
B.打开错误日志
T8T1Q;t"HF%J8z M:A C.关闭错误日志
"zFW2Tj!cN D D.关闭错误显示
i1_&u9B+tU4PWw] E.使用@抑错符
%dSQA){`3F`
&p8bGz]L[6X
)E P"F"j Kb 4.______操作符能对操作数的数据类型进行严格的比较?
3\ HB;?@${ajh
J/^)xooz1I0_3t 答案:____________
i?a:A \ D
,v j(bo8R@c+U 4x!t2\&R[b5b A
5.操作码缓存(opcode cache)能做什么?X8S)c$O J l

py$w$e1~-L(mxi A.把脚本编译成二进制对象,使它运行得更快
l-F,PNAl8nkm B.代替Zend引擎加快解释器的运行+cQ\2wN6[
C.缓存脚本输出以提高执行效率
@MH;v,zz E6~"Ym D.缓存解析器产生的中间码,以提高运行效率
f|Br}+mX E.在内存中缓存脚本,减少从硬盘中读取的次数X Ke*~KOI
Fon(X$V |
-]x8O0e` Bw"s
6.以下哪些情况容易造成系统资源枯竭?(双选)
m I R`x%hp 5u+cii)x2x["w%c
A.RAM太小
9jH7[^ } B.使用了低带宽的连接
6aO3j7d#lA;N C.虚拟内存超过2GB
v5D W"u6O9])O*z9\ D.允许同时运行太多的服务器进程@JO&rp
E.以上都不对!ekivi`7kt

9?Z@6v&ZuHp
.LO]9E%A0` 7.以下脚本缺了些什么?(双选) X1h/t:M"pY0k
[code] h.E&B2KW
<?php!L-}s+W bJMt
$rs = database_query ("select * from mytable where id = " .
|&yg7A ^g4P $my_id);
8X-b"S7q-s+` while ($a = database_get_data ($rs)) {5G:We$R!@
    var_dump ($a);F-Nf+C?/~-?}
}0nK;f5k7M] kSe
?> iaQ(z1Z0^
[/code]
igX u%Q"e/f#` A.参数出口(Parameter escapement),tb"C2nJtB(X
B.输出格式化 X'L;\Px"}([
C.错误检查
JVp1x5vOo D.一个SQL查询jb5Z |Z1tk1n
E.以上都不对
n7F{6d(G5_2^S Q s'B
DN L9Ao1f ;Qm*`uV3U
8.以下那种错误类型无法被自定义的错误处理器捕捉到?(双选)
rft@C#z nm8kD,B
A.E_WARNING;W&@t;A {:yiT
B.E_ERROR
OZ_+AS[ C.E_USER_ERROR
R3kpdB$v;gbD D.E_PARSE
&X(|,P$sa!W E.E_NOTICEH4X8M a-w:z

)w O.A,sJV7S.rO B l
,k Q7S*km] t dw@ 9.当需要比较一个常量和一个变量时,如何才能保证不会错弄成赋值?
@Xv3^eoz^9i
#pdRX&^E.W [U A.把变量转换成int
,Za0N|yR B.使用全等比较符(===)
.t'r7} { k1h2h MA C.确保常量是第一个操作数:N^+^k GwhiCN
D.使用三元运算符$sy}5T~!o
E.用括号把操作包起来?#` o8KR{$x[-S
C/l"hZC [
6VP@ S:t~ b/Tv
10.要通过邮件给系统管理员发送错误信息,以下那种方法最简便?~ Z DP E%vGj{8V

.X8V7?"B:Y?a A.创建一个连接远程SMTP服务器的函数
'b~Im Rg B.使用mail函数6dK,v j4l
C.使用error_log函数
%k$t"?*O(WK D.调用sendmial程序1e?W` b'y'S
E.使用webservice3A c%j;k0UH

] i!b n,sT"i
|@H8jAKT 11.能否仅调用一个函数就关闭脚本内所有的错误报告?
z#C,gc/s3]P9l [2LJmF S
A.能
"T7V;S2`zt@%gt B.不能
"o E;}.CTw"X*h gC ?:~.c~:L ?VyBu

]Tc4S}g6]k [K 12.概要分析器(profiler)是做什么的?3N;wS bem

&K x1f v!F(A0k h A.创建关于脚本结构的档案0ZB)Nfn
B.把脚本转化成UML图/gf:w*YU
C.精确测算脚本不同部分的运行时间
-Ox/X {(G*Q!D-u D.计算脚本通过web服务器执行时的维度^)FpY@mh&m%i
E.扫描脚本,识别由常见错误导致的bug
L3{?/A(u Wiy8k5B0x
.U2v6? HC\ ^-X;E7myR*j
13.______能帮助识别和解决bug。0x"QV Q*wdO8N&F|a

F%?:?"BH6l"L~R-v 答案:____________
Fq"Te!u&V 2y/vs4Fl7vXAv(] Y

k5VW)rg9j^ 14.trigger_error()和user_error()有什么区别?1jyU.Mba+a
lr&s\.x}5iy_ gS
A.trigger_error()允许脚本抛出系统级的错误.F9\&g_f
B.user_error()允许脚本抛出系统级的错误
v\ K$T4w iZ_ C.user_error()不能被用在错误管理器中
V'O7CGH,{UY8}/p D.trigger_error只在PHP5中可用
e{Msv6I(do u E.没有区别 w/M:Ha*d.TJ
e8x+^ d'P!S:e M

9}2[~,D n 15.______函数能返回脚本里任意行中调用的函数的名称。该函数同时还经常被用在调试中,用来判断错误是如何发生的。)Z |^#pL {5Yo5CM
4X:^n1T6R;V@"Z
A.print_r
$SK+^c-U$g6So5z-Y B.var_dump!},Lr kS
C.stack_dump
:@-\rn7K V*P D.debug_backtrace+{!ZW$^ m [
E.以上都不对z"KB(w:y

#ZPeQ~7W_b 答案
;zr)w~A
v8TVR_ 1.答案是E。三元操作符把每个if语句连到一起,作为&&操作的一部分。然而本题中,$x=1这个赋值只在第三个if为false时发生。如果第一个和第二个条件都不成立,$x=1就不会执行。这题对三元操作的应用有些极端,实际应用时,需要根据可读性来决定是否需要用三元运算符(本题这种情况就最好不要用)。
XP2|wL$oX*O{ 2NRry)a$v&U
2.问题是由第三方数据源传输缓慢导致的,而你无法控制这个数据源。你也许能在网络连通性上做些工作(假设问题出在你这一边)。还可以对接收到的内容进行缓存,这样能减少获取重复数据的时间。因此,答案是B和E。R1T8Q&[2P*V~
b&|4V5eJ*I6s2JS
3.正确的选择是B和D。如果关闭错误报告、使用@抑错符和关闭错误日志,那么在你交付给客户的网站出现问题时,你将很难进行分析和调试。"@a~.a2}+Z5p,E8J
2a-W1nd!_
4.这是在描述===操作符。6Dz]a R&p.U7v

N[ZSSgg 5.正确答案是D。PHP脚本在执行时,将首先被解析成“中间”码(也叫opcode,操作码),然后解释器执行。操作码缓存出现在这两个步骤之间,对解析器的输出进行缓存。下次执行该脚本时,将缓存的输出直接送入解释器。这样就就不需要再解析一次了。Z?k&IJpq3e k'v
sxxo3T$~Sp
6.正确答案是A和D。如果RAM太小,进程间将出现资源竞争,服务器将大量使用硬盘交换。同样的,如果允许过多进程同时执行,也会使服务器频繁进行交换,导致速度下降。
6j4^g!HU9~N #jn}eJO F-w
7.正确答案是A和C。脚本不检验datebase_query()的调用是否成功,因此将持续执行下去,最终产生错误。此外,$my_id参数没有转义——可能导致代码注入(详见第11章)。
Q/M9\ViA ]B;e yU$tU @+\*WE!_6K4P3r m[8^
8.答案B和D正确。出现解析错误往往表示脚本中有语法错误,自定义的错误管理器无法捕捉到它们的原因很明显:错误管理器在脚本里,而现在无法解析脚本,管理器也就无法执行。类似的,E_ERROR表示有致命的运行错误出现,比如内存耗尽。因此脚本会立刻被中断,因为解释器无法执行后面的代码。
6p sm$b@4^| V5G7M:MtKx
9.答案是C。比较操作是一个可交换的操作(就是说结果独立于操作数之外),而赋值不是。因此,比如说,$a==10和10==$a是等效的,而$a=10和10=$a却不是,而且后者会导致一个错误,因为这不是一个合法的操作。确保常量在操作符前面,能保证你不会错误得将比较变成赋值。
!mu3s;e"_RG EbX`@)g1ty
10.答案是C。error_log函数能将信息送往一个指定的地址。尽管mail()也可以用,但error_log能自动给邮件添加标题,因此这才是最简单的方法。tW8@qM)}-S)tD Z
%S*H+dp8w8Z
11.答案是不能。error_reporting函数能关闭所有运行时的错误报告,但对解析时的错误无效,因为解析错误发生在脚本执行之前。
P1g-N/T:m-p9V b#N R"H)ty` hI
12.显然,答案是C。概要分析器(profiler)能监视脚本的运行,并记录单个部分的运行时间。它可以用来找出和解决瓶颈。l N l7B Q3e h|

.~M)lKk"l,{"Ud 13.这是对调试器的完美定义!你可以用调试软件监视脚本运行,同时分析系统资源消耗,从而发现和解决程序缺陷。V2}tM ~-U.~u

*x%{Cx;L;z 14.trigger_error()和user_error()之间没有区别。后者其实是前者的别名。1r(x J)E q@:Tx-Ti
_B*E;rWc:w%~
15.答案是D。题目是在描述debug_backtrace函数,它返回一个由所有在代码的特定位置调用过的函数名组成的数组。

页: [1]
【捌玖网络】已经运行:


Powered by Discuz! Archiver 7.2  © 2001-2009 Comsenz Inc.