Board logo

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

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

作为一个开发者,无论你经验多么丰富,或者无论你多么努力,你的程序中总会有bug。这是生命中一个必然的部分,如同死亡与缴税(尽管并没有后面两个那么严重)。
6 h. x8 `8 L7 l) F: c# r+ F3 z. j要想解决bug,首先要能找到bug。事实上,许多开发者花费了无数小时茫然得盯着代码,只是因为他们没有把程序的容错能力摆在首位。忽略了这个部分,那么期望一个没有bug的程序就是——不可能的。4 e* E9 t, R% d
本章测试题将考察你对调试和性能管理相关知识的了解,以及如何用PHP做好这两件事。
8 S. h- J& ~9 e) F* L
+ l# U0 p* k5 |2 [& u& a- M
# I' v4 E7 h3 Q( U' i9 K/ Z问题% G% |8 p7 j$ w$ v) H. D

5 a2 S  s& K6 s  o/ e/ b9 W1.以下脚本如何用三元操作替代? ; J5 J% K" |- A* E4 R# G* w9 D

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

5 J: A! \& h) ~2 r  @; xA.$x = ($a A. < 10 || $b > 11 || $c == 1 && $d != $c) ? 0 : 1;+ z, g  `8 u/ T
B.$x = ($a < 10 || $b > 11 || ($c == 1 && $d != $c)) ? 0 : 1;
) x) l2 E, `4 M7 T) C. }& wC.$x = (($a < 10 && $b > 11) || ($c == 1 && $d != $c)) ? 0 : 1;6 s$ K$ N9 E2 I  U- p6 L% E: z
D.$x = ($a < 10 && $b > 11 && $c == 1 && $d != $c) ? 1 : 0;" c4 w# ?9 i* J+ ]5 {8 q: q
E.以上都不对
7 P/ v3 L& B# f! G, [2 R$ }. I- C7 m$ x" |0 K
3 e% t2 o  I& B0 ?  }7 P
2.有一个脚本由于要从远程获取数据,因而运行速度很慢,以下那种方法能对其进行优化?(双选): ^3 f! _* ]# M- k! w
: U" `  p! R( @2 w
A.安装操作码缓存(opcode cache)2 X" T: l, m4 X5 Y5 B0 j9 ?0 W3 Q
B.优化或者升级你的网络连接
9 `0 o) F: I6 p0 D/ W8 I0 h, r( gC.添置更多的硬件. r+ a' B2 ~+ z! c$ B
D.增加服务器的可用RAM
% U+ K  a; t1 ?3 JE.使用连接缓存
/ {5 L' ]9 e9 C: B3 ?2 g7 A  s: l$ a- v, w6 I/ n2 ?  ^/ _

* t* |; |$ y* h$ b1 g* P% [; p2 x( [3.架设生产环境下的服务器时,需要做哪些步骤?(双选)
" J3 n3 ^! W; _8 o" P7 y) |
. }! w" K& b+ i/ qA.关闭错误报告
9 y6 T3 j& A$ G6 ]B.打开错误日志
3 E2 b; y5 K8 o4 H7 G& dC.关闭错误日志  h" X+ K) _4 I) c5 c
D.关闭错误显示
& |5 q: F: q, r6 ^( W. x. @E.使用@抑错符& X9 [# _! Z5 S' c

* O9 c6 ^: N) v4 e
9 ~* f2 B( Q: M4 u1 z3 g4.______操作符能对操作数的数据类型进行严格的比较?3 m" B; ~0 i6 \/ R
1 Z- c5 d+ r& ?/ i5 l; q4 Z; d, F  J
答案:____________
6 b: J- R! V/ J3 u  N% N' x/ r
0 N. x1 j. B( z1 {2 [
; n8 Q. P& l! N+ ?! S. l5.操作码缓存(opcode cache)能做什么?
+ P% r5 |6 v) A3 T) a( Z9 `+ _6 f$ w8 B2 \. b& r" P
A.把脚本编译成二进制对象,使它运行得更快
; W4 j* \" }! y2 G+ Y. t* @" r# GB.代替Zend引擎加快解释器的运行' x5 |6 ]  T' r4 F; B% A& H
C.缓存脚本输出以提高执行效率
: y' S0 N( L" z& zD.缓存解析器产生的中间码,以提高运行效率* `& z6 Z6 C6 L
E.在内存中缓存脚本,减少从硬盘中读取的次数
; l0 g, F* ~: g1 T: B
5 h# _& ~) C# D& x4 s5 S" b# s0 _, D1 [
6.以下哪些情况容易造成系统资源枯竭?(双选)6 {$ Y; b& ^3 P. Z& p3 ?* E  v. x
" I; z  i5 Z+ j
A.RAM太小# K5 g* d2 R/ }9 a( E/ A. w) r
B.使用了低带宽的连接
* [3 `# N: r( RC.虚拟内存超过2GB8 F$ c2 Y8 r4 u* C3 ^; J) W2 _( V
D.允许同时运行太多的服务器进程
% Z( d  X& M1 x. j- y8 |! {E.以上都不对
, ^$ }; S- f3 {" G% E4 b
/ o- }- d3 c; ]3 H5 K
, V. S# u6 U4 D  [* C7.以下脚本缺了些什么?(双选)
) P8 W, A( a, G1 y5 W- P! ~

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

0 `: A+ {( M! l- kA.参数出口(Parameter escapement)
1 |2 ]) f) X/ a9 JB.输出格式化
* Y; y8 C0 o2 M$ _) SC.错误检查
, {* y* D: a9 E3 ?5 T* x: ID.一个SQL查询
9 ~4 S( ~/ `$ _$ D9 Z3 HE.以上都不对
# g, v$ i/ \1 x5 ^1 a% p6 u# k+ N  M4 J# @1 t. _  c

6 t" i- w$ p; j+ u9 v/ z: W( L3 S8.以下那种错误类型无法被自定义的错误处理器捕捉到?(双选)
  B9 x, I6 i7 D
) e/ r" H+ ^8 J- _! ?A.E_WARNING
# C$ |  c3 Y. mB.E_ERROR
1 l, ?; y% p3 zC.E_USER_ERROR
* r/ K. [' m& q5 M, FD.E_PARSE
+ `1 F* r0 t+ Z* f8 C' ]1 {9 d2 \E.E_NOTICE
  d1 g- \* n3 _' e  d# N7 k! b" k/ b9 V/ F9 T5 p) }5 F- \% B- o6 o% C# f

* I  _& Z, z, W# e$ v% `* F! R3 ]9.当需要比较一个常量和一个变量时,如何才能保证不会错弄成赋值?
" N# z3 A3 T2 n4 l. Y( J0 H1 v% u( O' |; i7 Q
A.把变量转换成int
1 n. f% s, Y  |8 Q" x" NB.使用全等比较符(===)5 V$ N* L6 P7 Q# ~) U( m* @
C.确保常量是第一个操作数
8 m# M" ^% D" yD.使用三元运算符
9 k- G) O* G# m7 n9 V  n* hE.用括号把操作包起来; s3 R, _. l$ F4 _) ~

" V2 q1 Q1 q+ T! j7 S1 F+ P6 [& s' ^$ X7 {+ H
10.要通过邮件给系统管理员发送错误信息,以下那种方法最简便?) |, ?8 d' |/ U) ~8 W) A: M6 z

" g, Q' Z, `8 P! RA.创建一个连接远程SMTP服务器的函数
" q6 @3 H  D3 q, `B.使用mail函数
# |& _) u* K: |* n4 \: G0 Y5 V! |C.使用error_log函数
) D  b, [$ a5 y- K2 A4 ZD.调用sendmial程序2 h2 W) V) G! A, o: p! G
E.使用webservice; h. W" x: E& q7 O
$ a: t0 F& w) T# Y; @

, Z" o* z- F4 X& t6 K; w11.能否仅调用一个函数就关闭脚本内所有的错误报告?+ ]8 N: O8 j# Y4 j. A4 n0 e

2 u! w  t% }/ j  x  X; LA.能
3 J* e8 P& g$ h4 ?- KB.不能, L% g! D) R/ u2 N* h
2 \# ?, q2 n3 \
5 T5 q/ p. L- R: R1 j- c/ I+ @
12.概要分析器(profiler)是做什么的?0 m1 Z3 z( P8 T% i

0 s* ?8 _% E( Z0 f6 D7 lA.创建关于脚本结构的档案
$ I6 c' @; U- W, U% K) OB.把脚本转化成UML图. R2 b  w4 P; M- I, T5 R
C.精确测算脚本不同部分的运行时间
  T6 ]" P" I+ C( ID.计算脚本通过web服务器执行时的维度
: `$ s4 ~9 X; o/ w/ p9 i9 `) V3 EE.扫描脚本,识别由常见错误导致的bug
! V! O% v2 ~8 ^; [" o0 B& {/ O
3 a9 h4 A3 `1 J8 I& g6 V2 O& f* i4 C8 E( H
13.______能帮助识别和解决bug。) V9 q* O8 M# |' s" c$ b4 C* Y

5 E: O2 ]( ]. X4 m& G( V答案:____________
% k1 p7 X5 |* ~: t: h" g; u% B5 Y( ]% q* s, X  y' A

2 ^0 n. |: t( ?& i0 f14.trigger_error()和user_error()有什么区别?  ?! v1 @9 q. J' p% Z" `, x
5 J9 |8 L: ~" X# V! d4 h
A.trigger_error()允许脚本抛出系统级的错误
& a6 ~$ ]+ O0 w- kB.user_error()允许脚本抛出系统级的错误+ v/ Z, v! S3 g
C.user_error()不能被用在错误管理器中3 i0 D: y5 J/ G7 W
D.trigger_error只在PHP5中可用
) {* Z& Y/ h; p  W3 oE.没有区别
/ d$ O% F2 S, X; W4 i% c5 x9 R% R

+ w$ N6 b9 i9 [/ C) i15.______函数能返回脚本里任意行中调用的函数的名称。该函数同时还经常被用在调试中,用来判断错误是如何发生的。
6 C/ N0 y; `8 T7 d6 x+ D
2 N+ s6 P# p2 E% Q" XA.print_r2 o! [, l. [/ c
B.var_dump  H$ S& h$ M, O+ N0 [  d
C.stack_dump+ T* D6 l- ~% Z/ i
D.debug_backtrace
; m' P6 N) b! Y/ z# OE.以上都不对
# C* v% X" s* j0 E4 l- O' y0 `% o6 ]: H' s
答案, {1 U/ y; r1 u6 e* A2 u

" w" R$ a7 j- Y& M  t$ ?3 A/ W/ {' ]1.答案是E。三元操作符把每个if语句连到一起,作为&&操作的一部分。然而本题中,$x=1这个赋值只在第三个if为false时发生。如果第一个和第二个条件都不成立,$x=1就不会执行。这题对三元操作的应用有些极端,实际应用时,需要根据可读性来决定是否需要用三元运算符(本题这种情况就最好不要用)。& I/ c% T6 z4 F; Y; k) U1 h
8 N- t# X$ B# k: b( O
2.问题是由第三方数据源传输缓慢导致的,而你无法控制这个数据源。你也许能在网络连通性上做些工作(假设问题出在你这一边)。还可以对接收到的内容进行缓存,这样能减少获取重复数据的时间。因此,答案是B和E。$ u9 i) @* w/ {) |. Y
, m$ e4 _, j2 `9 n9 W% a
3.正确的选择是B和D。如果关闭错误报告、使用@抑错符和关闭错误日志,那么在你交付给客户的网站出现问题时,你将很难进行分析和调试。1 f9 N; N/ K  s4 g/ _

: z  Y: J! [  W6 E4.这是在描述===操作符。
: j: o9 n, u/ w6 T. S, C9 M; }$ b+ c& ^% o6 t/ |- q7 W# z
5.正确答案是D。PHP脚本在执行时,将首先被解析成“中间”码(也叫opcode,操作码),然后解释器执行。操作码缓存出现在这两个步骤之间,对解析器的输出进行缓存。下次执行该脚本时,将缓存的输出直接送入解释器。这样就就不需要再解析一次了。2 ?' f5 x  ^" \2 U: V
$ K1 U7 p3 L/ S- d7 v
6.正确答案是A和D。如果RAM太小,进程间将出现资源竞争,服务器将大量使用硬盘交换。同样的,如果允许过多进程同时执行,也会使服务器频繁进行交换,导致速度下降。" S  j, B- N# O
5 B1 J( V2 S- U/ h. A
7.正确答案是A和C。脚本不检验datebase_query()的调用是否成功,因此将持续执行下去,最终产生错误。此外,$my_id参数没有转义——可能导致代码注入(详见第11章)。# Q$ O2 s# ^( f

5 S! {% q$ T, f8.答案B和D正确。出现解析错误往往表示脚本中有语法错误,自定义的错误管理器无法捕捉到它们的原因很明显:错误管理器在脚本里,而现在无法解析脚本,管理器也就无法执行。类似的,E_ERROR表示有致命的运行错误出现,比如内存耗尽。因此脚本会立刻被中断,因为解释器无法执行后面的代码。1 ^9 m5 @% _6 {3 v: q9 t" `: E* y

1 T5 d. f* S$ B  j) r* {9.答案是C。比较操作是一个可交换的操作(就是说结果独立于操作数之外),而赋值不是。因此,比如说,$a==10和10==$a是等效的,而$a=10和10=$a却不是,而且后者会导致一个错误,因为这不是一个合法的操作。确保常量在操作符前面,能保证你不会错误得将比较变成赋值。
, r5 Q9 X/ \$ W
( z# v, X# g$ c6 d: e10.答案是C。error_log函数能将信息送往一个指定的地址。尽管mail()也可以用,但error_log能自动给邮件添加标题,因此这才是最简单的方法。5 Y' o  d- \5 I4 W. x' L* `! o
# e$ f8 D, z, Z4 x% ?
11.答案是不能。error_reporting函数能关闭所有运行时的错误报告,但对解析时的错误无效,因为解析错误发生在脚本执行之前。8 |4 K- E! r0 {

3 h' H" F" [2 V( D: X3 [12.显然,答案是C。概要分析器(profiler)能监视脚本的运行,并记录单个部分的运行时间。它可以用来找出和解决瓶颈。
- V, e# x- l) V2 c! j9 [  V  S& l" |+ L8 ?
13.这是对调试器的完美定义!你可以用调试软件监视脚本运行,同时分析系统资源消耗,从而发现和解决程序缺陷。
2 p4 N. J5 e4 ~8 u) W( Q9 Z9 ?! I
) R" o# a' `3 M14.trigger_error()和user_error()之间没有区别。后者其实是前者的别名。
. a* X# v+ n( i9 ]3 @1 R7 ^- h* e$ }
  C& N# h1 [! {9 ?$ t2 U5 s15.答案是D。题目是在描述debug_backtrace函数,它返回一个由所有在代码的特定位置调用过的函数名组成的数组。




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