  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14221
- 金币
- 2401
- 威望
- 1647
- 贡献
- 1349
|
[Zend权威认证试题讲解]第十二章 -调试与性能管理
作为一个开发者,无论你经验多么丰富,或者无论你多么努力,你的程序中总会有bug。这是生命中一个必然的部分,如同死亡与缴税(尽管并没有后面两个那么严重)。
& _, E: A! s% o要想解决bug,首先要能找到bug。事实上,许多开发者花费了无数小时茫然得盯着代码,只是因为他们没有把程序的容错能力摆在首位。忽略了这个部分,那么期望一个没有bug的程序就是——不可能的。
/ ^" y$ Q0 G9 f: `& R* s本章测试题将考察你对调试和性能管理相关知识的了解,以及如何用PHP做好这两件事。6 b- c; T% `2 n) \
# W# w0 S) n- b6 A) ]2 G% J, t' y E2 H7 s' [3 p
问题4 D9 Z3 k9 X+ J
/ x9 V3 Q# i" S* `" p1.以下脚本如何用三元操作替代? G& I: }2 O C3 t
-
- <?php
- if ($a < 10) {
- if ($b > 11) {
- if ($c == 10 && $d != $c) {
- $x = 0;
- } else {
- $x = 1;
- }
- }
- }
- ?>
复制代码
# Q5 v. R o: ^6 tA.$x = ($a A. < 10 || $b > 11 || $c == 1 && $d != $c) ? 0 : 1;0 Z% i* k. i ~8 \! e
B.$x = ($a < 10 || $b > 11 || ($c == 1 && $d != $c)) ? 0 : 1;
% _* k6 o! H. O& {C.$x = (($a < 10 && $b > 11) || ($c == 1 && $d != $c)) ? 0 : 1; p9 |1 L; m/ Y: S/ f2 w
D.$x = ($a < 10 && $b > 11 && $c == 1 && $d != $c) ? 1 : 0;
- ^! ~$ q7 |0 j2 QE.以上都不对
! P) g9 v# B$ g5 B# q* ^
: L9 V" f3 r @5 d7 M
5 X Q( Y. M, f( V+ f3 a2.有一个脚本由于要从远程获取数据,因而运行速度很慢,以下那种方法能对其进行优化?(双选)
, f: o# {2 O v4 N8 W
! j/ I% d6 D8 S* |A.安装操作码缓存(opcode cache) A5 \" [8 V7 M; V. k# D4 Q1 ]$ z
B.优化或者升级你的网络连接) Y4 r! p2 O- t# h
C.添置更多的硬件
9 z; L: H4 \0 o( V1 DD.增加服务器的可用RAM
6 I+ N3 l3 B D0 ~E.使用连接缓存' A& H+ @9 V5 p5 P! Q) J# G) U
) \' @2 w. L. o, k9 d* s( H6 C4 p% `+ m; w8 k# }; V- n. x
3.架设生产环境下的服务器时,需要做哪些步骤?(双选)- L) c5 d1 U+ G) R0 ]6 P( }
) ?% A6 s9 Z4 z. s- c* t& j8 `
A.关闭错误报告% b! h5 A& C3 ?% Y. j: \+ O
B.打开错误日志0 b! r1 ]$ J" w" M( U4 y9 q2 a6 C
C.关闭错误日志8 ]$ B) y* S; y+ i2 A2 y
D.关闭错误显示+ X* x0 ?! ]5 c# @/ L: i& t; r
E.使用@抑错符
1 w2 f1 Q* Y/ D* P' B9 h$ W5 u4 g. U2 R l8 j
) Y+ }, y/ } I# V: K4 {
4.______操作符能对操作数的数据类型进行严格的比较? O$ P; p6 N8 s: h3 V1 s& k z
2 j7 y1 w p! X9 Y答案:____________
# Q" ^1 F& W. x% P& \# j' P3 V" |" S2 Y6 ]
* f' c. l3 j+ U9 x# |' b5.操作码缓存(opcode cache)能做什么?8 w. U! b: T( \( M1 d
- m. D8 P- O0 J8 p( i) pA.把脚本编译成二进制对象,使它运行得更快
. `% x& C7 W: @9 b3 ^5 M$ I# oB.代替Zend引擎加快解释器的运行
$ u" M9 G3 l. O. H6 IC.缓存脚本输出以提高执行效率
6 U7 G+ v; t( L" wD.缓存解析器产生的中间码,以提高运行效率# u5 n! H! g/ E8 P3 X- u
E.在内存中缓存脚本,减少从硬盘中读取的次数
! y2 N/ P$ f8 o8 V9 W. X1 G! x% t9 r( `# v5 D2 I3 x
$ M" R4 T6 v8 q! C4 D8 o4 q
6.以下哪些情况容易造成系统资源枯竭?(双选)
( l9 q/ M: V) c$ p/ B4 ^ y8 P- E, ?4 s4 i& T, h9 N0 K& c A) V0 v8 z8 L8 ~
A.RAM太小# F6 q7 L5 y4 ~+ L" a$ R
B.使用了低带宽的连接
& i0 a* D' s) O* S. z1 c$ ~ ~C.虚拟内存超过2GB6 V, k9 e! V3 [4 C! B
D.允许同时运行太多的服务器进程
3 o3 Z7 [9 K, |5 [) f5 d% LE.以上都不对2 I. ]8 P; d3 f" f8 H$ H: J% `
; Y, d5 \: l9 {. o* f, T: }0 E8 C2 B- R" j. M
7.以下脚本缺了些什么?(双选)
5 ^ ^ W! @5 _3 T" o-
- <?php
- $rs = database_query ("select * from mytable where id = " .
- $my_id);
- while ($a = database_get_data ($rs)) {
- var_dump ($a);
- }
- ?>
复制代码 ( \& N4 d0 ~0 e% \
A.参数出口(Parameter escapement)* ~7 Z$ E. X1 ~0 X5 O' H5 c
B.输出格式化
# X. C3 {; x: p8 ?6 _! GC.错误检查% g) \& j7 z+ s* r* ]3 Y% Y
D.一个SQL查询
( D0 r; p6 }( @E.以上都不对
# @$ v' v; T4 T, C8 v1 r
4 P7 {' D8 W% U
/ U6 l# _% n( V2 F+ q8.以下那种错误类型无法被自定义的错误处理器捕捉到?(双选)* {' D& m# W* ^/ P4 l+ `$ w% P6 x
+ P" V1 F f2 S. I- R
A.E_WARNING
' z* E+ u2 t% \& ^B.E_ERROR
5 l* J Y) y1 K+ a; VC.E_USER_ERROR
' B, Y" u6 M3 t! Q. d5 t! S; ND.E_PARSE
' o; u. {4 y+ P, n0 {) {9 JE.E_NOTICE: G( _% R. P5 X: T3 k
. L- _: i$ o# X# [7 |, F. |7 E
- I1 {; Z2 I/ R2 @$ U9.当需要比较一个常量和一个变量时,如何才能保证不会错弄成赋值?$ r7 ]7 F( H, }* E+ x9 \
# P9 @$ r7 s7 E5 N* p* _A.把变量转换成int
' e! S$ [1 n4 ]& v4 d' M# T5 yB.使用全等比较符(===)% g4 Z5 H4 M' t
C.确保常量是第一个操作数
( s: Y& o ~- n: M% b2 ?7 G6 MD.使用三元运算符8 w s- f/ t/ y
E.用括号把操作包起来0 R: m8 D4 M! a3 e' D3 T
. J, @, [% R$ ^$ j) Q! M, f5 `
8 B% D9 c2 V" f0 Z10.要通过邮件给系统管理员发送错误信息,以下那种方法最简便?
7 g& D# V9 R9 p: W1 b( B/ [
. }* ^1 v" N) N* V6 e5 tA.创建一个连接远程SMTP服务器的函数- \' _4 s! Q. t% `: ]5 @
B.使用mail函数! D" @9 `% K) o
C.使用error_log函数
8 \" C5 J; X1 H+ _* ~7 U0 @+ [: x! LD.调用sendmial程序% N( h: k% p8 \' A
E.使用webservice
+ P9 P4 j/ x" S
8 u) [ W( ^# \0 ?3 W0 u: J. q- Z
1 a1 b8 B5 V2 Q11.能否仅调用一个函数就关闭脚本内所有的错误报告?$ x" U2 H9 {* N8 {% I9 g
* B \6 j+ w3 F6 D+ a/ S B$ q
A.能9 `. g1 f! b, J" U
B.不能' C/ n: S- M8 E2 V
8 T, [+ _+ V# `" S( C; u3 h) F- S7 f8 y
12.概要分析器(profiler)是做什么的?6 E7 g8 M" v+ L2 Y! h" ]
( [; g8 _, ], O9 Z ]
A.创建关于脚本结构的档案
9 o& D r2 O' s1 V ~: K7 F6 L, mB.把脚本转化成UML图+ i% s# ?, l6 `2 n0 ?, B* w. k
C.精确测算脚本不同部分的运行时间5 j" A: a9 f0 I* u
D.计算脚本通过web服务器执行时的维度
8 H0 f; M4 g/ }( M! LE.扫描脚本,识别由常见错误导致的bug
" [- A1 M/ [( H; ?5 {) K: g( N+ N. V+ T; P
. K7 V6 E7 q% |
13.______能帮助识别和解决bug。
3 c5 N+ S# ?5 k P/ G) V: w- c
) }# N) Q3 n0 v4 W答案:____________7 |& I2 g5 n, D5 h7 P# u
( X% _8 ^2 u; d- }$ e
8 y: W3 f; u4 S14.trigger_error()和user_error()有什么区别?
6 R W N% C1 |/ i0 t% X
. a( j$ F2 o1 S# c$ ?A.trigger_error()允许脚本抛出系统级的错误$ l2 e5 a; U7 g/ p
B.user_error()允许脚本抛出系统级的错误
7 X( h$ r+ n/ u# b! h( |C.user_error()不能被用在错误管理器中
S& T! D6 L T% pD.trigger_error只在PHP5中可用2 h% D4 M+ I1 {; z' M0 w
E.没有区别
4 x+ s. [8 {5 p
; _) U$ t& w# ]
9 f1 I4 M7 g" l H1 `15.______函数能返回脚本里任意行中调用的函数的名称。该函数同时还经常被用在调试中,用来判断错误是如何发生的。$ z: y3 t3 q$ q+ R
5 ?2 |; F' M1 d+ t0 y9 O6 s; AA.print_r
, n) E$ T: `; a8 H; F% eB.var_dump
D" D& ]. D9 v: [C.stack_dump
2 q& H4 Z9 q6 N& s" OD.debug_backtrace
' ^& S" ]6 m) G8 n1 H* B/ GE.以上都不对
* W; k& J5 s" j& T! R9 N% o; h
答案
) R" T; l9 r% }" }
! s8 O) Z, x; G1.答案是E。三元操作符把每个if语句连到一起,作为&&操作的一部分。然而本题中,$x=1这个赋值只在第三个if为false时发生。如果第一个和第二个条件都不成立,$x=1就不会执行。这题对三元操作的应用有些极端,实际应用时,需要根据可读性来决定是否需要用三元运算符(本题这种情况就最好不要用)。$ ^* I$ R' E8 M5 M# H: W
) d. f5 e- M, C! G( A# E
2.问题是由第三方数据源传输缓慢导致的,而你无法控制这个数据源。你也许能在网络连通性上做些工作(假设问题出在你这一边)。还可以对接收到的内容进行缓存,这样能减少获取重复数据的时间。因此,答案是B和E。
4 e0 K: q5 `9 I9 R, Z2 U4 l
0 G- C. N3 w0 I0 Y/ ]$ e0 }. {3 `3.正确的选择是B和D。如果关闭错误报告、使用@抑错符和关闭错误日志,那么在你交付给客户的网站出现问题时,你将很难进行分析和调试。
) o, k2 [+ ?5 ]* H6 Q8 \# y& Q8 ?
4.这是在描述===操作符。' i% m& ]& q% { c) m
z. Y# K: G+ |
5.正确答案是D。PHP脚本在执行时,将首先被解析成“中间”码(也叫opcode,操作码),然后解释器执行。操作码缓存出现在这两个步骤之间,对解析器的输出进行缓存。下次执行该脚本时,将缓存的输出直接送入解释器。这样就就不需要再解析一次了。
( L; l3 M; j7 {6 M0 i! r# n6 i7 p# s, h4 u2 T+ I) }9 u' n
6.正确答案是A和D。如果RAM太小,进程间将出现资源竞争,服务器将大量使用硬盘交换。同样的,如果允许过多进程同时执行,也会使服务器频繁进行交换,导致速度下降。3 l3 d& \( l; R0 X
# o5 Q& j; a9 q# M2 P7.正确答案是A和C。脚本不检验datebase_query()的调用是否成功,因此将持续执行下去,最终产生错误。此外,$my_id参数没有转义——可能导致代码注入(详见第11章)。
7 ^5 [. D9 t5 V8 e4 W5 j, s+ u- Z, f9 f" g E3 p1 H- y1 V
8.答案B和D正确。出现解析错误往往表示脚本中有语法错误,自定义的错误管理器无法捕捉到它们的原因很明显:错误管理器在脚本里,而现在无法解析脚本,管理器也就无法执行。类似的,E_ERROR表示有致命的运行错误出现,比如内存耗尽。因此脚本会立刻被中断,因为解释器无法执行后面的代码。
" Q6 w4 S7 M+ m$ C( n- h+ l
) `$ h9 [6 r& n' r9.答案是C。比较操作是一个可交换的操作(就是说结果独立于操作数之外),而赋值不是。因此,比如说,$a==10和10==$a是等效的,而$a=10和10=$a却不是,而且后者会导致一个错误,因为这不是一个合法的操作。确保常量在操作符前面,能保证你不会错误得将比较变成赋值。
3 Q. ?* u. l& k* p/ Y1 _( a2 n$ E0 Y! m) ~4 `+ g
10.答案是C。error_log函数能将信息送往一个指定的地址。尽管mail()也可以用,但error_log能自动给邮件添加标题,因此这才是最简单的方法。9 h$ I4 V. t W! [5 ?3 ~, H
8 S% f7 I4 t+ D0 }0 W" D& q6 h6 c
11.答案是不能。error_reporting函数能关闭所有运行时的错误报告,但对解析时的错误无效,因为解析错误发生在脚本执行之前。8 j; j# N% c7 P8 B- r+ A5 u( C
( Z5 p: _+ E; B. p* s# |9 B12.显然,答案是C。概要分析器(profiler)能监视脚本的运行,并记录单个部分的运行时间。它可以用来找出和解决瓶颈。
7 w$ F4 d# F$ ~0 A. Y) z$ m
( s7 s: Q- v, e* |* u( d13.这是对调试器的完美定义!你可以用调试软件监视脚本运行,同时分析系统资源消耗,从而发现和解决程序缺陷。
" z4 w' p7 U% C, p" E/ a) N
B) m: r& B3 n& W; F14.trigger_error()和user_error()之间没有区别。后者其实是前者的别名。+ t. a3 `$ g @5 Z$ A
1 d! Y2 ?2 w$ H
15.答案是D。题目是在描述debug_backtrace函数,它返回一个由所有在代码的特定位置调用过的函数名组成的数组。 |
|