  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14247
- 金币
- 2414
- 威望
- 1647
- 贡献
- 1362
|
[Zend权威认证试题讲解]第十二章 -调试与性能管理
作为一个开发者,无论你经验多么丰富,或者无论你多么努力,你的程序中总会有bug。这是生命中一个必然的部分,如同死亡与缴税(尽管并没有后面两个那么严重)。( v: K# k0 ~1 z% g, y
要想解决bug,首先要能找到bug。事实上,许多开发者花费了无数小时茫然得盯着代码,只是因为他们没有把程序的容错能力摆在首位。忽略了这个部分,那么期望一个没有bug的程序就是——不可能的。
) V, A: a: s" I7 ]本章测试题将考察你对调试和性能管理相关知识的了解,以及如何用PHP做好这两件事。
# l% n+ b' w$ J6 j$ E5 a y5 q- Y" r0 t' v$ R+ g. t. B
8 l, c2 [6 _0 i
问题! |, E' H' f' F6 |
; W; Z% W0 I) V! B* h
1.以下脚本如何用三元操作替代? 1 O. J/ Q' A2 Q/ u7 a ~; e# ~
-
- <?php
- if ($a < 10) {
- if ($b > 11) {
- if ($c == 10 && $d != $c) {
- $x = 0;
- } else {
- $x = 1;
- }
- }
- }
- ?>
复制代码 + U( j! U! Q: J ^
A.$x = ($a A. < 10 || $b > 11 || $c == 1 && $d != $c) ? 0 : 1;- a8 @0 B+ p5 S# P& K; K' O w$ X
B.$x = ($a < 10 || $b > 11 || ($c == 1 && $d != $c)) ? 0 : 1;
3 g8 b( ? f9 lC.$x = (($a < 10 && $b > 11) || ($c == 1 && $d != $c)) ? 0 : 1;/ j, f }7 Y1 p* Z4 c/ c0 _, z3 i
D.$x = ($a < 10 && $b > 11 && $c == 1 && $d != $c) ? 1 : 0;
. @( d) \! n, e+ |3 u& RE.以上都不对
7 d3 p" Y; k/ E. S" n2 x; O1 _" l* p2 s5 L* L8 [
" W; S/ N3 @' W9 e
2.有一个脚本由于要从远程获取数据,因而运行速度很慢,以下那种方法能对其进行优化?(双选)+ X4 d: z. o# d6 i# y
$ C! A M m2 K9 ~9 c/ h( O
A.安装操作码缓存(opcode cache)# O$ {3 A: S o& R' D0 f
B.优化或者升级你的网络连接
1 i/ }$ |% T: b4 L) T4 q! jC.添置更多的硬件
3 n0 S. |" }5 A" u" O# lD.增加服务器的可用RAM: p; |5 w( B; i5 E8 s
E.使用连接缓存
' \+ u0 u0 C, o* Q w; y1 g5 k! N& U1 ]( S; O; o9 R9 Z
) O/ Q% s& I: F9 z6 k5 o0 j6 Q
3.架设生产环境下的服务器时,需要做哪些步骤?(双选)) n% H+ e0 ^% |9 |; q$ n' j+ D
- \/ M7 Z- l9 E. G9 e' z8 eA.关闭错误报告% C9 C/ U7 j+ B" ?# |
B.打开错误日志7 X5 Q2 J r1 l
C.关闭错误日志: w& }1 c$ ^. L& |* x% s9 ]; N
D.关闭错误显示1 x3 M9 s, d9 ]& |& H
E.使用@抑错符% T- j$ d+ F3 P& i3 v( H
3 k7 R0 U) H1 X8 g
" T8 I5 D" |" s- O0 D+ B4.______操作符能对操作数的数据类型进行严格的比较?
( S; b* S7 _/ E" p$ J r+ a" v* D" L" E' t; U4 o) z8 r
答案:____________
4 H' n+ K3 ~+ z' P9 d e( n3 G9 m. }7 ?; ~8 ?8 }; |7 ^
3 g6 b$ L" l" t/ N3 k, v5.操作码缓存(opcode cache)能做什么?/ a! R4 Q! z5 g% L
) ?# V) |+ U9 A, H; X! c, T9 u( i- o# m
A.把脚本编译成二进制对象,使它运行得更快
. S7 \ J4 H! n% EB.代替Zend引擎加快解释器的运行/ `) r$ f P: F2 X3 o
C.缓存脚本输出以提高执行效率
2 z0 X8 v8 l& `# {8 t0 fD.缓存解析器产生的中间码,以提高运行效率
3 S+ l( w% d0 N6 W( M2 a/ H/ n; ZE.在内存中缓存脚本,减少从硬盘中读取的次数
" w2 M# C& b5 t
) @3 |5 g) s) {; |8 J- w0 V
( f. i+ i- X7 Z8 o2 T& h6.以下哪些情况容易造成系统资源枯竭?(双选)9 s/ f) l1 b+ U& \- Q5 h" G
0 O7 j7 u0 ^: G; a: E
A.RAM太小: {9 a: }$ ?* e- k' I( K
B.使用了低带宽的连接2 c3 V5 B/ p9 g8 y: W8 U
C.虚拟内存超过2GB
) e6 u" w) k1 @ p0 X( x, ?D.允许同时运行太多的服务器进程
& I7 ^# I6 c0 u% LE.以上都不对% R% G2 z$ Q4 m8 a' X/ X
, O; o) E+ R9 A: w& S
2 X9 v. |* n5 u7.以下脚本缺了些什么?(双选) " `! ?. S+ _: s( C2 U7 d8 w Y
-
- <?php
- $rs = database_query ("select * from mytable where id = " .
- $my_id);
- while ($a = database_get_data ($rs)) {
- var_dump ($a);
- }
- ?>
复制代码
4 j/ a" r4 d" k: q0 n, z. d- ]# gA.参数出口(Parameter escapement)
& i" z$ k2 ~4 b4 b- Z# [: x' UB.输出格式化$ j. Z' O. D- z+ D! z, C+ A
C.错误检查) R% |" g$ w2 u0 a3 i' v+ F
D.一个SQL查询% A1 f" ]& s. h
E.以上都不对. P& Z4 B: q5 \. T, O1 q+ r
4 t; T" V: d: U3 e
4 C& ^$ I9 J4 j0 m4 v8.以下那种错误类型无法被自定义的错误处理器捕捉到?(双选)
4 F# h) d' ]$ s( `+ ~ `, x3 _8 v2 p/ d! x" {) r
A.E_WARNING
) c( y; v# y5 x; S0 JB.E_ERROR
( \0 A( v) y8 O/ m+ L! `C.E_USER_ERROR
r# j; A g' p' mD.E_PARSE
7 b2 }* M) W6 UE.E_NOTICE( R5 A9 B8 U3 u- U
) |. A' l- k# y
Q ~0 U! V9 M) Q7 }9.当需要比较一个常量和一个变量时,如何才能保证不会错弄成赋值?
( T1 i7 J, ?5 \. t
$ m$ A% D( n8 z& o& p( x: o* s; s; gA.把变量转换成int2 Q2 R) k' J* P2 e+ N8 R) d
B.使用全等比较符(===)
1 a( Y" e1 U7 j1 ~/ ~7 DC.确保常量是第一个操作数6 |+ w5 D" ~3 U$ B) p" `
D.使用三元运算符/ r+ }4 u( c2 ~/ @
E.用括号把操作包起来, g8 _, p1 P) u, a8 ]0 Y' |
C1 a5 _3 ~4 S" j8 Z$ \ Q" s D& x9 I
10.要通过邮件给系统管理员发送错误信息,以下那种方法最简便?
; a5 d* w% J/ t% H2 t9 M) t& U" C1 |( E$ e9 y8 N- n& } h
A.创建一个连接远程SMTP服务器的函数6 n$ c: d5 x& t/ t0 z" o" }
B.使用mail函数2 g q8 J, i# s3 l2 K& F
C.使用error_log函数
9 }! l# P$ _8 [9 T A1 uD.调用sendmial程序4 v+ r1 F# H( N+ s1 m
E.使用webservice
$ L0 y/ v+ j; Y
2 T4 O2 L' O2 s1 c4 K1 @! D. i# f: c# @& V; N; V
11.能否仅调用一个函数就关闭脚本内所有的错误报告?' g- C6 p3 T) u. T0 B0 j
6 P& h6 L$ ~" l4 N: j/ y% z9 o0 {+ n
A.能
6 w' B! b0 \- D( FB.不能( `$ u7 I9 S; D# t9 O
1 A" n! \# e' X y
# K5 c. k( }; C" ?2 D* j
12.概要分析器(profiler)是做什么的?
3 C/ K2 d1 s& ~3 t3 V/ h$ K
% s1 V% O H! a5 R7 ^* y, l' wA.创建关于脚本结构的档案! g: _( _, f5 A5 j
B.把脚本转化成UML图# I' G; _9 r% ?! R) S- V7 `$ E
C.精确测算脚本不同部分的运行时间
$ U; t6 a1 J9 b: cD.计算脚本通过web服务器执行时的维度. G" j( Z! ]* i2 L* u9 E! w
E.扫描脚本,识别由常见错误导致的bug$ M% D4 q/ E2 U9 d4 F
/ }) R$ |# n9 L8 \/ H$ ?" `+ n4 F& O
8 w9 x1 d i8 Q" ?13.______能帮助识别和解决bug。
/ d4 @- F+ }4 A& S( {2 v
5 x- b! a) F3 T T# n3 V& b答案:____________
4 q# Z- _7 X$ ]" h* Z8 I! c5 h4 g* x# C5 Y0 b1 }
D, `: ~& u' _6 k" q14.trigger_error()和user_error()有什么区别?) p: M" r( ?( h k
+ o2 X2 i6 p3 c; E9 D& f, f. e
A.trigger_error()允许脚本抛出系统级的错误
+ a2 y1 y; f& }B.user_error()允许脚本抛出系统级的错误- R! H& S# u" v) J4 T }8 T
C.user_error()不能被用在错误管理器中
$ B) |5 Q2 [7 u3 y1 a$ ID.trigger_error只在PHP5中可用
4 D: G; p9 k* Y' I5 [- AE.没有区别5 q! J: _8 ^6 P
" V0 \+ K5 m/ @& {% \% \: I4 [* m
. h+ p. [8 `; k5 k) f: Q
15.______函数能返回脚本里任意行中调用的函数的名称。该函数同时还经常被用在调试中,用来判断错误是如何发生的。
/ x( @$ b9 d6 ^& G
0 m# g( O5 o+ GA.print_r
0 {9 P% I4 I, g- o1 B& ]B.var_dump9 }" O( R% ]# @: P3 L+ x k
C.stack_dump6 y$ `2 W# |; S$ `/ I( J O& k
D.debug_backtrace- Q2 U0 q7 q- x- [( @3 ~' V
E.以上都不对
# O! B5 n; _4 W3 z
$ Y( T, E. |7 d1 n9 C答案) k. s8 g/ j. w" K
4 N7 @" n) [3 Z. i" r: E: ]
1.答案是E。三元操作符把每个if语句连到一起,作为&&操作的一部分。然而本题中,$x=1这个赋值只在第三个if为false时发生。如果第一个和第二个条件都不成立,$x=1就不会执行。这题对三元操作的应用有些极端,实际应用时,需要根据可读性来决定是否需要用三元运算符(本题这种情况就最好不要用)。" J2 b) v3 `4 s% A8 z r
; Q# }5 E) u( n' s D2.问题是由第三方数据源传输缓慢导致的,而你无法控制这个数据源。你也许能在网络连通性上做些工作(假设问题出在你这一边)。还可以对接收到的内容进行缓存,这样能减少获取重复数据的时间。因此,答案是B和E。
) d* A: a" ?0 Z7 v8 P0 K4 ~. o
1 x( P8 ~: F/ m0 w% V2 e7 v3.正确的选择是B和D。如果关闭错误报告、使用@抑错符和关闭错误日志,那么在你交付给客户的网站出现问题时,你将很难进行分析和调试。' s9 L1 }4 Y: Z, b
* P M) W' Z- ?/ \1 Z8 P4.这是在描述===操作符。
' O. K* _/ X+ o5 f
/ F6 I. C% A s+ a0 a1 q( y D5.正确答案是D。PHP脚本在执行时,将首先被解析成“中间”码(也叫opcode,操作码),然后解释器执行。操作码缓存出现在这两个步骤之间,对解析器的输出进行缓存。下次执行该脚本时,将缓存的输出直接送入解释器。这样就就不需要再解析一次了。
' w" b x8 E% D. @0 x- h
* X Q0 H: ^8 x# T" K3 Y4 z9 ^. W6.正确答案是A和D。如果RAM太小,进程间将出现资源竞争,服务器将大量使用硬盘交换。同样的,如果允许过多进程同时执行,也会使服务器频繁进行交换,导致速度下降。
$ M% Y- M4 o; e% @$ x" p2 @. A( k( O B" b4 t# n
7.正确答案是A和C。脚本不检验datebase_query()的调用是否成功,因此将持续执行下去,最终产生错误。此外,$my_id参数没有转义——可能导致代码注入(详见第11章)。0 J5 [7 ^& w; U, C9 o2 Y2 u( Z! ?) ~
, I7 u1 q: u6 S: L, k' n
8.答案B和D正确。出现解析错误往往表示脚本中有语法错误,自定义的错误管理器无法捕捉到它们的原因很明显:错误管理器在脚本里,而现在无法解析脚本,管理器也就无法执行。类似的,E_ERROR表示有致命的运行错误出现,比如内存耗尽。因此脚本会立刻被中断,因为解释器无法执行后面的代码。
: q6 g# W0 l$ t1 F' n F. p
( U( w; b5 v( i, {9.答案是C。比较操作是一个可交换的操作(就是说结果独立于操作数之外),而赋值不是。因此,比如说,$a==10和10==$a是等效的,而$a=10和10=$a却不是,而且后者会导致一个错误,因为这不是一个合法的操作。确保常量在操作符前面,能保证你不会错误得将比较变成赋值。% Z* j% o# e; C) z# |
8 C2 @! n* L' U+ y' ~10.答案是C。error_log函数能将信息送往一个指定的地址。尽管mail()也可以用,但error_log能自动给邮件添加标题,因此这才是最简单的方法。
& O; e4 H% K2 d& F* f/ p6 [) S
; n/ D% w2 }3 F2 w/ @0 n8 l11.答案是不能。error_reporting函数能关闭所有运行时的错误报告,但对解析时的错误无效,因为解析错误发生在脚本执行之前。
* q5 u/ a0 A* L$ F f: Z) C
3 |- q0 o% O; Y' x+ r1 z& k12.显然,答案是C。概要分析器(profiler)能监视脚本的运行,并记录单个部分的运行时间。它可以用来找出和解决瓶颈。! o/ e1 ~! j: ]" s5 v) u+ F
) d$ }7 v( T: x8 ^' j' `
13.这是对调试器的完美定义!你可以用调试软件监视脚本运行,同时分析系统资源消耗,从而发现和解决程序缺陷。
' h# w# ]" u$ D2 O4 y+ p$ e/ G0 ]9 H6 q- O6 g: _8 S
14.trigger_error()和user_error()之间没有区别。后者其实是前者的别名。
6 N/ o/ _ U- P* B/ A' f1 h/ H: ^1 u% g6 w/ d
15.答案是D。题目是在描述debug_backtrace函数,它返回一个由所有在代码的特定位置调用过的函数名组成的数组。 |
|