Board logo

标题: [Zend权威认证试题讲解]第十二章 -调试与性能管理 [打印本页]

作者: admin    时间: 2008-5-30 14:32     标题: [Zend权威认证试题讲解]第十二章 -调试与性能管理

作为一个开发者,无论你经验多么丰富,或者无论你多么努力,你的程序中总会有bug。这是生命中一个必然的部分,如同死亡与缴税(尽管并没有后面两个那么严重)。) p* S% H7 e, m. [* C
要想解决bug,首先要能找到bug。事实上,许多开发者花费了无数小时茫然得盯着代码,只是因为他们没有把程序的容错能力摆在首位。忽略了这个部分,那么期望一个没有bug的程序就是——不可能的。
0 i3 S! m" u! f; C本章测试题将考察你对调试和性能管理相关知识的了解,以及如何用PHP做好这两件事。4 E+ h; K8 e4 f" i5 s

( v/ Q- }' E0 q$ X6 I& \* ^* o4 y5 j1 _
问题
9 H0 B  b9 R# G6 R4 x, K
/ t7 o" [: s. ^2 r1.以下脚本如何用三元操作替代? , X6 `, D3 [- z- X6 n

  1. <?php
  2. if ($a < 10) {
  3.     if ($b > 11) {
  4.         if ($c == 10 && $d != $c) {
  5.             $x = 0;
  6.         } else {
  7.             $x = 1;
  8.         }
  9.     }
  10. }
  11. ?>
复制代码
! ^7 E% ]7 N1 T8 L
A.$x = ($a A. < 10 || $b > 11 || $c == 1 && $d != $c) ? 0 : 1;
: d8 X, ^' U/ h1 R% f1 W- L& y" kB.$x = ($a < 10 || $b > 11 || ($c == 1 && $d != $c)) ? 0 : 1;# K6 f: ]* N# X" S$ T$ M+ N# D
C.$x = (($a < 10 && $b > 11) || ($c == 1 && $d != $c)) ? 0 : 1;
$ j% f- L1 \9 v0 k. mD.$x = ($a < 10 && $b > 11 && $c == 1 && $d != $c) ? 1 : 0;
' S, i. p8 K3 o2 s4 j, rE.以上都不对
" x( e! Q! u/ C, S2 D0 ?; G) |" i0 U" \5 J2 U8 b3 x( J) Z
8 b) {+ ]& \/ H5 x5 ?6 u
2.有一个脚本由于要从远程获取数据,因而运行速度很慢,以下那种方法能对其进行优化?(双选)
: m, S4 J) e% C( h% u/ ^% w- g# {# t/ |! b/ i- R
A.安装操作码缓存(opcode cache)+ v9 p( d4 \& L, _* m# m" m1 ?: O+ @! V
B.优化或者升级你的网络连接& T5 l1 t3 F* ^; E# ^% l( A7 v" m
C.添置更多的硬件$ d, q! M8 U3 w% ^0 W
D.增加服务器的可用RAM
+ g, Y# ]& P2 H1 r2 D# a: E% X; eE.使用连接缓存
2 `* a0 w; X4 n
/ O5 O" y! F& `9 x2 V
3 C, Q! c: k5 Y; q+ I+ @' O  r3.架设生产环境下的服务器时,需要做哪些步骤?(双选). _7 t/ W: a) G& x# ~" n9 @
1 _" A. I, a( B# |2 A" m4 b. A
A.关闭错误报告; G1 s+ ]$ p2 S& [5 C: w
B.打开错误日志% L. }" N2 k& Z2 E
C.关闭错误日志
+ |7 u' }6 i0 ~* _  BD.关闭错误显示
1 x" B5 D% ^; z( W, q0 l3 {E.使用@抑错符3 N# P* v! @$ _, S

' O% n- c6 H; X7 M+ C+ h6 R+ \* y. |( h, ?  u+ x4 ?- }
4.______操作符能对操作数的数据类型进行严格的比较?
5 z0 V- j4 _( ^) G' x* G" M0 t" [/ y/ M: J# y
答案:____________5 R4 A8 B1 H& X% T$ J% f
& y- Y5 x/ ~" t& s5 @; R0 ~

/ A8 }, L9 C# G. n5 G5.操作码缓存(opcode cache)能做什么?& N+ o4 S  h, G) \0 c! B

8 ]. A$ }8 S& n+ Q" b# }1 Y+ sA.把脚本编译成二进制对象,使它运行得更快
2 n; p$ R3 X: K; j3 UB.代替Zend引擎加快解释器的运行
, c9 R7 |3 Q. N$ q8 eC.缓存脚本输出以提高执行效率: R3 d: d8 w: q/ [
D.缓存解析器产生的中间码,以提高运行效率
+ Y! k3 U; ~* z9 Q8 U. AE.在内存中缓存脚本,减少从硬盘中读取的次数- Z5 A; T' p+ }) Q( I9 |
5 N% E6 e$ ]: c/ h4 N- Q0 B, D

! x5 u6 A+ K* q9 N6.以下哪些情况容易造成系统资源枯竭?(双选)6 j9 u. _, Z  C/ [7 t0 g. {4 K* J

* a8 i% ?, j1 h  ?8 \: c$ nA.RAM太小8 ]# |/ d0 G$ u
B.使用了低带宽的连接4 t. H) }6 T9 B+ T( Y
C.虚拟内存超过2GB
  Z) u: ^, d' u1 I0 WD.允许同时运行太多的服务器进程
2 Y9 H* |7 V  u5 z* Q7 kE.以上都不对1 K2 I, s. f5 q% Q5 P3 l
! |; R8 d& k, R/ A/ F
8 w* h$ L* S! R
7.以下脚本缺了些什么?(双选)
# [9 X) X( a( e/ L( w

  1. <?php
  2. $rs = database_query ("select * from mytable where id = " .
  3. $my_id);
  4. while ($a = database_get_data ($rs)) {
  5.     var_dump ($a);
  6. }
  7. ?>
复制代码
# x* X' w0 v) I4 t+ w
A.参数出口(Parameter escapement)+ ~- u7 K# |+ n: Z
B.输出格式化
9 h0 m0 i( u4 b1 Z4 A0 B2 G% f! KC.错误检查( Q  n+ a5 X' R6 e9 h
D.一个SQL查询- G: V# \. p' J* p: E0 }) ?" I
E.以上都不对
# q3 F: s2 |  X: X+ c" y0 y, s
! n# {. I! \6 e7 r. i0 e8 f
( O' M" h* |$ ~6 l8.以下那种错误类型无法被自定义的错误处理器捕捉到?(双选)
/ l+ d5 N8 @; n! x$ g' t5 a" r$ |/ _% `: M7 J3 m+ A# _2 W& }
A.E_WARNING7 n6 @6 L+ Q; \2 w* x, K, D3 ]
B.E_ERROR
) @9 P% O7 N- B% {8 L5 k7 rC.E_USER_ERROR3 j6 t( B+ z6 N" I' K
D.E_PARSE
' P/ a4 s9 u: iE.E_NOTICE2 G0 b2 w6 R8 T- k" w  x
  ~/ J" r& P$ N* o: ^$ u

. z0 `1 M: h2 h. d9.当需要比较一个常量和一个变量时,如何才能保证不会错弄成赋值?5 T8 Q8 H) f5 B* q0 a

# H4 j# Z* Y' _: ?8 X5 TA.把变量转换成int# O: l* T0 M: H/ E3 v+ Z
B.使用全等比较符(===)- i2 ~; N  v( i' I7 j7 S0 Z
C.确保常量是第一个操作数4 I6 R+ l2 Q5 K- I- H
D.使用三元运算符( `+ m4 [: E1 `" P% }' o
E.用括号把操作包起来! X" f5 b* {0 t3 B% b2 {6 ?( P* y
2 \" O: v8 C- P4 I# e% W
" R( `3 {* o7 P  ^9 l& x( J9 B
10.要通过邮件给系统管理员发送错误信息,以下那种方法最简便?
1 v6 m" F1 U+ p
3 n' h. g2 Q$ B! }- c( y/ ]' j' {A.创建一个连接远程SMTP服务器的函数% s3 O% G/ t) M5 _6 l5 w, ~+ Y
B.使用mail函数- X4 _% y: B/ w
C.使用error_log函数
& P% ?$ ^; j' L1 ^8 S- p. U6 R/ T6 bD.调用sendmial程序
* E: K* A$ n6 wE.使用webservice, u. _2 O. I3 k, [3 }" C" l
' {1 D5 G3 I5 ^

4 J5 S9 r# N3 g9 K11.能否仅调用一个函数就关闭脚本内所有的错误报告?
1 ^+ Y$ H! L; K. M" b, f+ I1 I6 P0 y  O3 A( {3 O
A.能1 x- v# ]+ w# e, q' ^- |
B.不能
4 M5 u% W$ Y3 R* F2 f; z3 @* ^  f  K! O8 M) r& r

2 |9 u* V/ f, h/ I12.概要分析器(profiler)是做什么的?
3 a7 V: B, _8 n+ {( @1 N3 t
: s* J! q  |% u( ^- V/ a! ]A.创建关于脚本结构的档案& v1 G9 |: Z- E
B.把脚本转化成UML图
* V# M9 a" m" C/ A& S6 VC.精确测算脚本不同部分的运行时间/ B. v, f4 ^, h+ V* q
D.计算脚本通过web服务器执行时的维度
; E# q6 ^8 s4 N5 o8 g: L# CE.扫描脚本,识别由常见错误导致的bug# i( l9 w; i# B2 t0 X4 k3 b$ c
0 X  C2 U6 v9 W* p7 V

/ W# B* b: j0 X0 |! r) Z2 ~4 R13.______能帮助识别和解决bug。! N; G" i$ y/ S- [6 X

( k; A3 D* p  q1 P% P8 h答案:____________
/ t, x- B* N6 f7 e5 Z; @( g. e9 T) X9 d1 u! N4 q
0 [4 {. k1 P4 Z6 @! K
14.trigger_error()和user_error()有什么区别?
5 `4 K+ }1 p2 D9 h+ e% I4 v6 n- N; j: o. J* c$ Z
A.trigger_error()允许脚本抛出系统级的错误4 A0 u. Z6 p- C" ~1 F% e) c  L8 F
B.user_error()允许脚本抛出系统级的错误
) o: `  U4 `% V/ s- v. [; qC.user_error()不能被用在错误管理器中8 v  x7 K( |% ~0 ?: x7 U/ b+ B
D.trigger_error只在PHP5中可用
4 U" @. }4 c6 `% HE.没有区别- N3 a! U6 A. L" N1 g0 W7 c/ V9 \
$ }6 Y7 p, _4 A

5 Q) m( m% p. ]15.______函数能返回脚本里任意行中调用的函数的名称。该函数同时还经常被用在调试中,用来判断错误是如何发生的。
8 _4 N+ e# F3 S1 Q4 @$ Q& p; r9 F
. k) ?3 {4 w0 S' V# p# m( T6 cA.print_r) R9 P8 y# O3 Z- V
B.var_dump
0 y0 ~( k: h1 L8 LC.stack_dump8 r. t% n7 n  }; `5 ~5 O6 ^. h
D.debug_backtrace" b0 _3 m( H9 b0 i$ k& E
E.以上都不对
4 t2 w! i1 X8 i# {! U- M3 d! j& e/ _2 ^9 M
答案
( {# A+ i( V" o- q3 L! }& k7 w2 F2 B
1.答案是E。三元操作符把每个if语句连到一起,作为&&操作的一部分。然而本题中,$x=1这个赋值只在第三个if为false时发生。如果第一个和第二个条件都不成立,$x=1就不会执行。这题对三元操作的应用有些极端,实际应用时,需要根据可读性来决定是否需要用三元运算符(本题这种情况就最好不要用)。' f3 \$ |5 a7 X- P7 \

2 Q9 Q5 m, s* d5 F0 f$ G7 r7 S2.问题是由第三方数据源传输缓慢导致的,而你无法控制这个数据源。你也许能在网络连通性上做些工作(假设问题出在你这一边)。还可以对接收到的内容进行缓存,这样能减少获取重复数据的时间。因此,答案是B和E。* ^+ J8 J* ~* a/ H
* R1 r5 `7 j6 [% _
3.正确的选择是B和D。如果关闭错误报告、使用@抑错符和关闭错误日志,那么在你交付给客户的网站出现问题时,你将很难进行分析和调试。3 u6 |" u- m" ?; N  o

3 y7 N1 S8 P  w2 B. ]: @4.这是在描述===操作符。
& M7 K8 Y; [+ a
# a+ }$ m3 F6 T! Q5.正确答案是D。PHP脚本在执行时,将首先被解析成“中间”码(也叫opcode,操作码),然后解释器执行。操作码缓存出现在这两个步骤之间,对解析器的输出进行缓存。下次执行该脚本时,将缓存的输出直接送入解释器。这样就就不需要再解析一次了。* i+ Q1 [: C0 f; C& c0 D
" Z, c3 t+ B8 h8 Y
6.正确答案是A和D。如果RAM太小,进程间将出现资源竞争,服务器将大量使用硬盘交换。同样的,如果允许过多进程同时执行,也会使服务器频繁进行交换,导致速度下降。
& @8 p* f. u( w6 G
8 P; Q( J" ?  X5 S& u6 ?; C7.正确答案是A和C。脚本不检验datebase_query()的调用是否成功,因此将持续执行下去,最终产生错误。此外,$my_id参数没有转义——可能导致代码注入(详见第11章)。0 B' ^+ Q  o3 c7 I; D9 T  K% ~3 G! Q
( r7 Z) Z6 u4 u0 y+ l) L
8.答案B和D正确。出现解析错误往往表示脚本中有语法错误,自定义的错误管理器无法捕捉到它们的原因很明显:错误管理器在脚本里,而现在无法解析脚本,管理器也就无法执行。类似的,E_ERROR表示有致命的运行错误出现,比如内存耗尽。因此脚本会立刻被中断,因为解释器无法执行后面的代码。! k! l4 V( R7 _( ?# [  M# z
$ k+ Y0 {" v! F' ?3 g6 [6 f% K
9.答案是C。比较操作是一个可交换的操作(就是说结果独立于操作数之外),而赋值不是。因此,比如说,$a==10和10==$a是等效的,而$a=10和10=$a却不是,而且后者会导致一个错误,因为这不是一个合法的操作。确保常量在操作符前面,能保证你不会错误得将比较变成赋值。
, m# X  l5 g2 w3 y4 R, C) ~( I8 A0 f2 i; s
10.答案是C。error_log函数能将信息送往一个指定的地址。尽管mail()也可以用,但error_log能自动给邮件添加标题,因此这才是最简单的方法。0 ^3 ?' O+ j7 g6 |3 L

- v, K# c* _2 }; G. ]! Y; X11.答案是不能。error_reporting函数能关闭所有运行时的错误报告,但对解析时的错误无效,因为解析错误发生在脚本执行之前。
, L4 s1 B# n, V; J% F* E+ X& X3 Y( j1 b
12.显然,答案是C。概要分析器(profiler)能监视脚本的运行,并记录单个部分的运行时间。它可以用来找出和解决瓶颈。
7 w+ x. F" I! R9 A/ r; h, m
7 J/ j8 `, t2 l. |13.这是对调试器的完美定义!你可以用调试软件监视脚本运行,同时分析系统资源消耗,从而发现和解决程序缺陷。
! d" A3 j8 ~: S
4 D$ }2 a) M0 j; h/ a9 k0 U; W' e$ g% t( V14.trigger_error()和user_error()之间没有区别。后者其实是前者的别名。' Q( ], i/ @' z

! l* K- @7 `/ x/ P9 I15.答案是D。题目是在描述debug_backtrace函数,它返回一个由所有在代码的特定位置调用过的函数名组成的数组。




欢迎光临 捌玖网络工作室 (http://89w.org/) Powered by Discuz! 7.2