捌玖网络工作室's Archiver

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

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

作为一个开发者,无论你经验多么丰富,或者无论你多么努力,你的程序中总会有bug。这是生命中一个必然的部分,如同死亡与缴税(尽管并没有后面两个那么严重)。
ZnQT9~ q 要想解决bug,首先要能找到bug。事实上,许多开发者花费了无数小时茫然得盯着代码,只是因为他们没有把程序的容错能力摆在首位。忽略了这个部分,那么期望一个没有bug的程序就是——不可能的。
.XP Nq V5Q_ 本章测试题将考察你对调试和性能管理相关知识的了解,以及如何用PHP做好这两件事。
cnY;i,~K} RzLCOzv8jM+p
)X&} |ld M]U,?%G
问题[CE {fa E z|
r:@ W5d{%b*c0re(h
1.以下脚本如何用三元操作替代? PK5C8T!wT
[code]
ut[(q1N7lz*r-E <?php
}@OFs if ($a < 10) {_){x)tt `
    if ($b > 11) {#N]4I ?2z q
        if ($c == 10 && $d != $c) {3G k7}.T+x mR
            $x = 0;
$u%B'bJ/Nw#~         } else {,r)N|QF/k
            $x = 1;j:~8Z0aq
        } Ph4l9tPg
    }
H[Cj lM({ }
(CF0@EyYka*kgk ?>(V_K?m1M(g Z g&Y

/{eFC ox [/code]
O?1q$m,L8q({6kI A.$x = ($a A. < 10 || $b > 11 || $c == 1 && $d != $c) ? 0 : 1;
2^*@r z%t}tI ? B.$x = ($a < 10 || $b > 11 || ($c == 1 && $d != $c)) ? 0 : 1;9k4_N(z&dgg;^
C.$x = (($a < 10 && $b > 11) || ($c == 1 && $d != $c)) ? 0 : 1;
[;Co#?,J@ D.$x = ($a < 10 && $b > 11 && $c == 1 && $d != $c) ? 1 : 0;
qxE*l/F9P;M%~ E.以上都不对2C'H5rZ+v2k:{

;{W:n8~Ci4K *B W T$j9z%h
2.有一个脚本由于要从远程获取数据,因而运行速度很慢,以下那种方法能对其进行优化?(双选)j{b `y
(b4\%K*d3f J9EWB
A.安装操作码缓存(opcode cache) i!E t ieAT.h+}4w
B.优化或者升级你的网络连接
8d${x AEL4I C.添置更多的硬件6va4@1jc~Mu
D.增加服务器的可用RAM(Aw2uE6Fp gw \
E.使用连接缓存
9@\1D _ `+i6G
9|Pt7w@4c @m4[ ^l-r9F,u7Xd1u
3.架设生产环境下的服务器时,需要做哪些步骤?(双选)
8{A/T0^(h5H$Z-h
_d1Qo&l-h`q0O A.关闭错误报告
1A#ua j_6K1Z9b2tT!_"k B.打开错误日志^4T l?+{%fb"H4A
C.关闭错误日志;[![-_|Ywo@
D.关闭错误显示
:V"]Im~'tj E.使用@抑错符h#~'J0OFD1|j
(H&J.n C!V`EQ

rdO`5FQ$?0tX 4.______操作符能对操作数的数据类型进行严格的比较?
5L3N8Q6m}H
B'M ht2Yn 答案:____________"b`0t'\#Q

0t,]{fmK y4Z|k#K-z
5.操作码缓存(opcode cache)能做什么?
I(_J,y3in/VO
A%u;DB%ZA^ A.把脚本编译成二进制对象,使它运行得更快]1?/q4nrp"@?#w0\
B.代替Zend引擎加快解释器的运行V7ZE.mR_a
C.缓存脚本输出以提高执行效率
P"yz:jx$X ? D.缓存解析器产生的中间码,以提高运行效率
|4` R;f,kg6p E.在内存中缓存脚本,减少从硬盘中读取的次数 jE i@e*Mn
~5C?~1y%w

:MsW}kQ7~ 6.以下哪些情况容易造成系统资源枯竭?(双选)CgRzg"X
L,F,}1t0H2^
A.RAM太小$b;_0h2{K^FFZ ~q
B.使用了低带宽的连接
\PikV/_B.L3V? C.虚拟内存超过2GB
E2qG4L8H3U/I7z(^'J5x D.允许同时运行太多的服务器进程
O pI7]({ UIT E.以上都不对
fm:V,k A?*A 9XZjaEB

(mncQt#t5Nf 7.以下脚本缺了些什么?(双选)
.D`R2CLN!t-OL^B [code] .V&P9ot5Yr~"^A
<?php
7KX$@/V$A#g I8_V $rs = database_query ("select * from mytable where id = " .6UM1eh}
$my_id);
XN9BUz while ($a = database_get_data ($rs)) {
-yjGd_+]5^     var_dump ($a);
Ns%WUlptE9v,o x }
d2r)H;Fl(k'b ?>}C+]3ssWj
[/code]
ayF)QPg6UvRK A.参数出口(Parameter escapement)
jN PO7T B.输出格式化mEg&C!F^[ksI
C.错误检查!YF ]9eb d[R X
D.一个SQL查询
Hv!et? E.以上都不对
q!mfXK0Z"T)S s
ZAW4w+z;RQ:Fs $w P-MYX
8.以下那种错误类型无法被自定义的错误处理器捕捉到?(双选)0|)y.N ?0v8?

R:DC9fE2v$P$@ A.E_WARNINGe#x*d{4lNi
B.E_ERRORjJ$_8Wl@
C.E_USER_ERROR.y rx[)`%E+g
D.E_PARSE&r z%]Li(l
E.E_NOTICE7d&n Y9QmF

;iiIX\*e [ !Ax(w [ ^/e yn
9.当需要比较一个常量和一个变量时,如何才能保证不会错弄成赋值?^JT*h)U/eL b"Ln&|c

)UU0pj Oto A.把变量转换成int
}B6V,U9C B.使用全等比较符(===).d8IBQ5{
C.确保常量是第一个操作数,u k z!C|T1XD
D.使用三元运算符#U#m'}d$d"W `[
E.用括号把操作包起来pZ6cw$brCy

;v ^x9SA%}U8C
qGzLH UH 10.要通过邮件给系统管理员发送错误信息,以下那种方法最简便?N Fh8L9mT4~
b Gx8gn8x0M
A.创建一个连接远程SMTP服务器的函数yekx/d ?J3{Z] P
B.使用mail函数T_#}(s+um
C.使用error_log函数 H"Dle \xB.^
D.调用sendmial程序
BtJSv5\,t E.使用webserviceQpA} HXO
1Azw0_5@'ST!MuW

d!Bay'LcW)[_'k{ 11.能否仅调用一个函数就关闭脚本内所有的错误报告?
cUW*o||0g8b mH7[w C|&U
A.能7Zd0cp9G)C;ua ` X$D
B.不能5w%X!P:VJv/Q(XE]

@/Bd5]&G.o
.`NE4_cI:ya O 12.概要分析器(profiler)是做什么的?
U)Q%@_G&@t4A N0X$Iluv
A.创建关于脚本结构的档案
!y$L8]\m+w B.把脚本转化成UML图] {~Z_zW9i p
C.精确测算脚本不同部分的运行时间[~M)b8L
D.计算脚本通过web服务器执行时的维度
7Z)W`2Hjd*c A E.扫描脚本,识别由常见错误导致的bugVi.H \]p{r
4BS ?y2| f}%G5]
]Z6P+A8N Q2W@9JI
13.______能帮助识别和解决bug。0} W }4](I@.KB

I}Ay!XfYuWq'F 答案:____________
Clx{O0h*M)@)Cj ? j d3cK
C%du m$@T4vv4W:R`
14.trigger_error()和user_error()有什么区别?*y)]? j;k%a/T){

R d-r.N:h#le*@ A.trigger_error()允许脚本抛出系统级的错误
!`y:D&{yq&L? B.user_error()允许脚本抛出系统级的错误y:Uyq P6l)|
C.user_error()不能被用在错误管理器中
g\H;P*| D.trigger_error只在PHP5中可用:tP!Xa%}0A9\1s
E.没有区别
0L*@W wB7\*R n6l%] m?
{E;FJ-?4| q]sHX,oh
15.______函数能返回脚本里任意行中调用的函数的名称。该函数同时还经常被用在调试中,用来判断错误是如何发生的。a:tE'}5ft @2LZ
U2v#y+]x#QPq{
A.print_r
L5H~R'Y? B.var_dump
3W}u(^ ~%Sg7r s C.stack_dump~M.z%hC9@ z&?;QUc
D.debug_backtrace/Zso4OG
E.以上都不对 m2J6v3~&F*i [
~5N,g F'q}?c
答案
!R hs+^)dM
&X:c,M/a`uj b 1.答案是E。三元操作符把每个if语句连到一起,作为&&操作的一部分。然而本题中,$x=1这个赋值只在第三个if为false时发生。如果第一个和第二个条件都不成立,$x=1就不会执行。这题对三元操作的应用有些极端,实际应用时,需要根据可读性来决定是否需要用三元运算符(本题这种情况就最好不要用)。
Q8d[g _T6E MdC *@*s7dW4I#T#n6S
2.问题是由第三方数据源传输缓慢导致的,而你无法控制这个数据源。你也许能在网络连通性上做些工作(假设问题出在你这一边)。还可以对接收到的内容进行缓存,这样能减少获取重复数据的时间。因此,答案是B和E。o7c7R5\Q{:w
5B{-{pP{*S8jL
3.正确的选择是B和D。如果关闭错误报告、使用@抑错符和关闭错误日志,那么在你交付给客户的网站出现问题时,你将很难进行分析和调试。
1NYK"E7I{
S"L?4L*X8bI1p 4.这是在描述===操作符。
%P AMh!f-RM 9w3s(c^#j
5.正确答案是D。PHP脚本在执行时,将首先被解析成“中间”码(也叫opcode,操作码),然后解释器执行。操作码缓存出现在这两个步骤之间,对解析器的输出进行缓存。下次执行该脚本时,将缓存的输出直接送入解释器。这样就就不需要再解析一次了。
:iE_f dY g,Ljt&} uB2S$B
6.正确答案是A和D。如果RAM太小,进程间将出现资源竞争,服务器将大量使用硬盘交换。同样的,如果允许过多进程同时执行,也会使服务器频繁进行交换,导致速度下降。
9v2_X}OV\1v.BZ
J:gW!PKf 7.正确答案是A和C。脚本不检验datebase_query()的调用是否成功,因此将持续执行下去,最终产生错误。此外,$my_id参数没有转义——可能导致代码注入(详见第11章)。
+ZD6A%Z4J.L .u!sX e9O4l7H
8.答案B和D正确。出现解析错误往往表示脚本中有语法错误,自定义的错误管理器无法捕捉到它们的原因很明显:错误管理器在脚本里,而现在无法解析脚本,管理器也就无法执行。类似的,E_ERROR表示有致命的运行错误出现,比如内存耗尽。因此脚本会立刻被中断,因为解释器无法执行后面的代码。
4e"h&V} q7[6n (H;f4obf6Aw
9.答案是C。比较操作是一个可交换的操作(就是说结果独立于操作数之外),而赋值不是。因此,比如说,$a==10和10==$a是等效的,而$a=10和10=$a却不是,而且后者会导致一个错误,因为这不是一个合法的操作。确保常量在操作符前面,能保证你不会错误得将比较变成赋值。
U(Pu"z ~m6~.\2p
*v(u \:X p7xI 10.答案是C。error_log函数能将信息送往一个指定的地址。尽管mail()也可以用,但error_log能自动给邮件添加标题,因此这才是最简单的方法。&K{D _Jou

?.DIQ[#qT#| 11.答案是不能。error_reporting函数能关闭所有运行时的错误报告,但对解析时的错误无效,因为解析错误发生在脚本执行之前。
~!eiG { R,_$f:|8KmA
12.显然,答案是C。概要分析器(profiler)能监视脚本的运行,并记录单个部分的运行时间。它可以用来找出和解决瓶颈。4W6f rute8u x
k({zl)^2K:K
13.这是对调试器的完美定义!你可以用调试软件监视脚本运行,同时分析系统资源消耗,从而发现和解决程序缺陷。\s!O+^9p

h~+D&_6X 14.trigger_error()和user_error()之间没有区别。后者其实是前者的别名。!R{d'a m

5^%}kX-G%C 15.答案是D。题目是在描述debug_backtrace函数,它返回一个由所有在代码的特定位置调用过的函数名组成的数组。

页: [1]

Powered by Discuz! Archiver 6.1.0  © 2001-2007 Comsenz Inc.