Board logo

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

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

作为一个开发者,无论你经验多么丰富,或者无论你多么努力,你的程序中总会有bug。这是生命中一个必然的部分,如同死亡与缴税(尽管并没有后面两个那么严重)。
/ ^) W0 m! ]7 h. K要想解决bug,首先要能找到bug。事实上,许多开发者花费了无数小时茫然得盯着代码,只是因为他们没有把程序的容错能力摆在首位。忽略了这个部分,那么期望一个没有bug的程序就是——不可能的。  O, w, ^8 ?* N3 @& y
本章测试题将考察你对调试和性能管理相关知识的了解,以及如何用PHP做好这两件事。( T8 [7 z6 _8 _8 O: B

% m- D& x4 d) K6 d" \; {
# T  `6 k( k8 S3 Y9 J0 T7 J问题
6 T7 m& T& B! s- e
, [' V2 F1 _8 H4 d# W* ?7 Q/ M1.以下脚本如何用三元操作替代?
, T$ X1 h" Q4 k9 o6 V

  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. ?>
复制代码

. A$ k1 @8 `& X8 gA.$x = ($a A. < 10 || $b > 11 || $c == 1 && $d != $c) ? 0 : 1;
% P( O2 H1 H' T3 J9 Z& J8 FB.$x = ($a < 10 || $b > 11 || ($c == 1 && $d != $c)) ? 0 : 1;
9 S$ \% F& I/ R5 u- AC.$x = (($a < 10 && $b > 11) || ($c == 1 && $d != $c)) ? 0 : 1;" C5 J* g: _# Z% U
D.$x = ($a < 10 && $b > 11 && $c == 1 && $d != $c) ? 1 : 0;. B" P- g$ O2 |/ R0 C: s3 y& `
E.以上都不对% Q/ o& U+ G3 }8 f0 q

2 ~2 V! r& j! |$ j! E; j+ a/ z: u+ K5 g) b- f; C
2.有一个脚本由于要从远程获取数据,因而运行速度很慢,以下那种方法能对其进行优化?(双选)
3 `! N2 ]! c: }1 [. ?! T8 N- p& O7 h! ^! a" Q5 p
A.安装操作码缓存(opcode cache)% T( B/ S/ y3 N" j9 R' }1 ]! y
B.优化或者升级你的网络连接
- H0 A. t0 W- G; VC.添置更多的硬件+ d( Y5 y- S; b4 l9 Q. o
D.增加服务器的可用RAM
, U. X" h; \" B  s  VE.使用连接缓存
1 d7 N' a6 o; d6 E
, M+ n7 }9 ]* b- Y. c' R8 `: T. _; r: U  o4 D$ d( X; L8 c
3.架设生产环境下的服务器时,需要做哪些步骤?(双选)/ W" M/ f4 e6 W- o5 f& r$ W
/ ]/ D7 J& n8 r- H+ T
A.关闭错误报告
* `" H! u: s$ L/ [) Z+ T# PB.打开错误日志
- u4 M) q; `# }/ ?3 ]) m- zC.关闭错误日志* c! R( e/ o) O* t6 E' B+ w. H
D.关闭错误显示
% j8 d" {. ~: K- y# m+ i1 jE.使用@抑错符
6 ?6 t$ O" S: m' m" C8 j. c& L5 V$ X. t1 x$ R6 _

3 q& _8 |" P% p4.______操作符能对操作数的数据类型进行严格的比较?" i% q0 Z3 s( C, s- i: |" F

2 E! k# s, r1 o& E' j5 Q答案:____________, k2 `$ M5 J/ S& i7 q

5 E5 T0 ]/ s5 W* K! V- R( T& L8 I) m
5.操作码缓存(opcode cache)能做什么?$ e- U2 m4 G3 v2 g5 l+ l% V
- p. L0 Q3 n% n% [) t
A.把脚本编译成二进制对象,使它运行得更快, V! Q* M: \' e/ S3 N$ w
B.代替Zend引擎加快解释器的运行
9 g6 i6 U: b0 a( R2 P+ O5 EC.缓存脚本输出以提高执行效率
! K2 |4 x2 J2 }D.缓存解析器产生的中间码,以提高运行效率9 S1 T- C( y5 T  U4 ^6 J2 Y. f
E.在内存中缓存脚本,减少从硬盘中读取的次数8 @0 Q& J+ C! t1 u, [, n

0 L5 x  s" ~$ L3 |" E# `% r% ^) }4 I0 N6 N2 M; u0 D: D
6.以下哪些情况容易造成系统资源枯竭?(双选)
. R2 e% ~* _/ i6 \& f0 W8 P- l6 z7 }. L7 ]3 b
A.RAM太小4 M: e0 I2 A1 M: B) ?" ]/ o
B.使用了低带宽的连接
7 ^$ M( {0 s3 ^C.虚拟内存超过2GB7 F# H# D. E8 _( S6 J- M
D.允许同时运行太多的服务器进程0 J& J9 {6 p1 j2 j
E.以上都不对
5 f% J/ l5 V# B  J4 U- ?7 ^/ }9 q% ^. @, I

  c8 M$ y, D- q( P- M8 R7.以下脚本缺了些什么?(双选)
4 T7 L2 u8 f& X) X. t

  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. ?>
复制代码
" \# [, J$ n- v0 K0 r; {& ^
A.参数出口(Parameter escapement)
- u1 ]/ W- F; x4 V' E  lB.输出格式化
4 n3 M$ l. |& x# h' G# l$ TC.错误检查. ?% a9 j# C+ k9 H# }, M( b+ G1 o
D.一个SQL查询5 h9 f, S4 \( ?( g* `  K
E.以上都不对
" W3 s7 j# o% P, `& v' i6 |6 Z4 I6 z- j9 V9 p# `5 z
* F& v7 G, D# l/ j' D
8.以下那种错误类型无法被自定义的错误处理器捕捉到?(双选)
9 u8 u( _; L" t% f; {7 P% l( l9 C4 }2 T8 H7 ]- B
A.E_WARNING
: N9 l" `% d7 r6 u& w+ Q5 J$ c  p6 nB.E_ERROR$ w: q) _4 v6 N! ?& K7 ]
C.E_USER_ERROR: f/ W' P* `' a; x7 v/ w+ e7 X
D.E_PARSE5 O/ J4 e6 T: p8 F7 P
E.E_NOTICE
( S& ~2 |: A4 h5 R/ t% l& x
4 v" X. {; Q$ I1 s8 k8 o8 b
/ D/ R( q" |! {$ E9.当需要比较一个常量和一个变量时,如何才能保证不会错弄成赋值?% `- i) d; P- T. m+ n
- F8 c* P' \( v' U# S. [2 v! r& E
A.把变量转换成int# q( z: j, t/ ~( F- \; g
B.使用全等比较符(===)( A$ U' A+ P4 {) A* K& K
C.确保常量是第一个操作数" z) m+ q( o8 @' i
D.使用三元运算符" d" {5 \, M- Q' R1 ?/ X* B+ c
E.用括号把操作包起来5 z# m( j6 m) b- o4 I* d  M

# @, z( I$ p1 T! ?; V7 Q# R- V6 E. W  m
10.要通过邮件给系统管理员发送错误信息,以下那种方法最简便?
7 J7 }* H! ?7 n1 m" j
5 ?0 B9 R, P% \  jA.创建一个连接远程SMTP服务器的函数1 ?" I" W  ^% M* K/ {* b  s
B.使用mail函数
* y% d8 B6 e- v" {' f" fC.使用error_log函数
: I. e. Z! b) |+ S2 _7 DD.调用sendmial程序
* e1 t2 B: N, r! R3 hE.使用webservice1 m1 `: A" [! s5 h
' r' \" ~* F8 z9 c- I8 T& D8 W

9 |: t. t7 t+ ^. f6 i' x+ Q- B11.能否仅调用一个函数就关闭脚本内所有的错误报告?
$ L, \1 ?, W6 J. Y
& I5 ?- a, O4 z/ S6 l& u" t$ J1 w  BA.能/ Q  h3 u! B% U
B.不能0 U; u+ E- I4 g2 p/ }9 K5 s/ J& ~9 b
8 C8 c9 [1 `1 K. C. e
8 P& x% T$ a6 B
12.概要分析器(profiler)是做什么的?2 j1 Q8 g* i" H5 i' i
' R$ L6 U, Q/ }6 a' h3 t6 |, [) J
A.创建关于脚本结构的档案; a. X) b8 r3 k) d0 @
B.把脚本转化成UML图
9 @0 Q1 S, o9 W) _$ P1 M! eC.精确测算脚本不同部分的运行时间6 R' a+ y% g6 k
D.计算脚本通过web服务器执行时的维度
( Y% w7 h7 g+ H4 _" N5 {# b% }E.扫描脚本,识别由常见错误导致的bug
) T3 c2 s" x: p8 t1 w, W$ \  r. g1 }1 p
$ f" h$ {6 f/ ?/ g# v
13.______能帮助识别和解决bug。
& x4 ^7 s" B$ t7 W" f
$ ]! z% y$ H9 x8 n9 z答案:____________
$ O/ l7 h; |) |! Q- X; r9 z5 Z) v# r- g$ S, i
# M  @, F, m9 U# f5 C
14.trigger_error()和user_error()有什么区别?
) ^* ?5 e9 E1 E1 d3 j/ e/ e) j$ u  E, ^( i  b
A.trigger_error()允许脚本抛出系统级的错误- A: z9 D* K) f* h0 ~; K& l
B.user_error()允许脚本抛出系统级的错误2 v: m2 U/ v$ {' d
C.user_error()不能被用在错误管理器中8 F/ }2 {  _' w# |' d" ~9 w
D.trigger_error只在PHP5中可用! o/ [5 h( c7 e  ]# O+ ^
E.没有区别- u/ w. Y2 G! z) U, i; D9 n' g  Q2 W

* |$ k  |0 ~8 ]; X
' m) ^0 G+ j3 Q1 m! R15.______函数能返回脚本里任意行中调用的函数的名称。该函数同时还经常被用在调试中,用来判断错误是如何发生的。. l/ z  w/ C/ c0 }- c! g2 ?
& r/ ]/ u% ]# g5 G. a! n5 N
A.print_r$ {' ~$ |% d& c5 b; C; Y4 ^* ?
B.var_dump  d; z* z# A% Y/ L# ]: h
C.stack_dump# b& Q- s& A: k, \/ c* A/ R9 r2 E; Q
D.debug_backtrace) Z% {6 c& Q3 g( z, x: H
E.以上都不对
+ r* Q" A  r- j2 z3 a, l4 Q: k" }! H8 r. N
答案
5 C' x4 }5 @4 `  H( l6 n/ O1 R( x" r
) n6 V$ T# |4 }& [1 a5 m1.答案是E。三元操作符把每个if语句连到一起,作为&&操作的一部分。然而本题中,$x=1这个赋值只在第三个if为false时发生。如果第一个和第二个条件都不成立,$x=1就不会执行。这题对三元操作的应用有些极端,实际应用时,需要根据可读性来决定是否需要用三元运算符(本题这种情况就最好不要用)。5 r$ E8 X8 W5 Q5 G( C- N' e

' o$ H" O* j' {) m; c3 L) C# C2.问题是由第三方数据源传输缓慢导致的,而你无法控制这个数据源。你也许能在网络连通性上做些工作(假设问题出在你这一边)。还可以对接收到的内容进行缓存,这样能减少获取重复数据的时间。因此,答案是B和E。
/ k6 b7 B4 |5 R0 _6 J* z% w) A5 F( i4 A) C5 V; z$ W* O
3.正确的选择是B和D。如果关闭错误报告、使用@抑错符和关闭错误日志,那么在你交付给客户的网站出现问题时,你将很难进行分析和调试。
& J" X# R0 h/ u/ C/ O" s& [( \4 b0 B
4.这是在描述===操作符。
# L* P5 j' t8 y" y; ?
, m: k/ E& {2 Z9 |: f5.正确答案是D。PHP脚本在执行时,将首先被解析成“中间”码(也叫opcode,操作码),然后解释器执行。操作码缓存出现在这两个步骤之间,对解析器的输出进行缓存。下次执行该脚本时,将缓存的输出直接送入解释器。这样就就不需要再解析一次了。
  i+ M4 i6 r, @! K8 y
+ w" o: W3 M0 n- z7 O: M  Q) H  q6.正确答案是A和D。如果RAM太小,进程间将出现资源竞争,服务器将大量使用硬盘交换。同样的,如果允许过多进程同时执行,也会使服务器频繁进行交换,导致速度下降。
7 h% x4 y" ~' K8 C+ T! I0 H: [3 u' @3 p" ^/ H
7.正确答案是A和C。脚本不检验datebase_query()的调用是否成功,因此将持续执行下去,最终产生错误。此外,$my_id参数没有转义——可能导致代码注入(详见第11章)。7 c1 ]; x/ L  D/ ~4 T7 n

5 k: r; g" N* v. ]4 W8.答案B和D正确。出现解析错误往往表示脚本中有语法错误,自定义的错误管理器无法捕捉到它们的原因很明显:错误管理器在脚本里,而现在无法解析脚本,管理器也就无法执行。类似的,E_ERROR表示有致命的运行错误出现,比如内存耗尽。因此脚本会立刻被中断,因为解释器无法执行后面的代码。
8 h9 i8 X( k% C4 p# \5 U" V1 O. n. ]5 G; t  {- o0 R/ J& O& N
9.答案是C。比较操作是一个可交换的操作(就是说结果独立于操作数之外),而赋值不是。因此,比如说,$a==10和10==$a是等效的,而$a=10和10=$a却不是,而且后者会导致一个错误,因为这不是一个合法的操作。确保常量在操作符前面,能保证你不会错误得将比较变成赋值。0 e0 h: l. t+ c. S% e

, N: S8 M5 t" M0 ]& u5 F# L) O10.答案是C。error_log函数能将信息送往一个指定的地址。尽管mail()也可以用,但error_log能自动给邮件添加标题,因此这才是最简单的方法。
. V* O1 Y! p* k5 B( s9 i, O
$ [' L; ^9 c! @2 ~7 ]11.答案是不能。error_reporting函数能关闭所有运行时的错误报告,但对解析时的错误无效,因为解析错误发生在脚本执行之前。
( ~" p, M1 v+ g' p
/ m8 K9 W' [+ M/ M1 o12.显然,答案是C。概要分析器(profiler)能监视脚本的运行,并记录单个部分的运行时间。它可以用来找出和解决瓶颈。+ U6 g: y) M- w3 b
2 t8 ]: e7 @* x3 }  t
13.这是对调试器的完美定义!你可以用调试软件监视脚本运行,同时分析系统资源消耗,从而发现和解决程序缺陷。
, k1 c  E! q  u: T% \
/ w7 D- m" @2 P0 _3 B* r8 V. \8 r14.trigger_error()和user_error()之间没有区别。后者其实是前者的别名。7 c% E3 L( D" L. f8 @6 h4 H% a8 M: V
7 ?, Q% i, O. ?' [! m+ N0 t' C  T
15.答案是D。题目是在描述debug_backtrace函数,它返回一个由所有在代码的特定位置调用过的函数名组成的数组。




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