获得本站免费赞助空间请点这里
返回列表 发帖

[Zend权威认证试题讲解]第十二章 -调试与性能管理

作为一个开发者,无论你经验多么丰富,或者无论你多么努力,你的程序中总会有bug。这是生命中一个必然的部分,如同死亡与缴税(尽管并没有后面两个那么严重)。
  F& Z: J* j7 ]# t) r- b# u1 G要想解决bug,首先要能找到bug。事实上,许多开发者花费了无数小时茫然得盯着代码,只是因为他们没有把程序的容错能力摆在首位。忽略了这个部分,那么期望一个没有bug的程序就是——不可能的。' v# f& X7 i5 w/ d: v
本章测试题将考察你对调试和性能管理相关知识的了解,以及如何用PHP做好这两件事。: m: v  ]. n" o

5 _; _1 s1 X0 i3 T2 V6 f
9 \) s4 R6 I1 m1 ^6 H4 D问题
. n: ~" l! X4 F* B
8 _% i7 j! X+ l% s1.以下脚本如何用三元操作替代?
3 c6 J5 U) o. v) A

  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. ?>
复制代码
9 e5 B8 {. \7 I
A.$x = ($a A. < 10 || $b > 11 || $c == 1 && $d != $c) ? 0 : 1;# |2 `3 u: m7 g/ N6 p
B.$x = ($a < 10 || $b > 11 || ($c == 1 && $d != $c)) ? 0 : 1;
' o7 j5 g5 h1 J. m3 Z/ iC.$x = (($a < 10 && $b > 11) || ($c == 1 && $d != $c)) ? 0 : 1;
1 u8 M/ R. Y4 E' G5 Z) rD.$x = ($a < 10 && $b > 11 && $c == 1 && $d != $c) ? 1 : 0;
3 w- d! h+ |8 ?3 f" ?6 a* eE.以上都不对
) ^) [0 D/ e+ N. F$ _. P
; G- |- E0 L' b& {7 ]8 w
5 m5 n1 s$ N6 F; l2.有一个脚本由于要从远程获取数据,因而运行速度很慢,以下那种方法能对其进行优化?(双选)
# |. x8 j7 W4 l4 e, q6 j8 K. z1 z5 V+ I
A.安装操作码缓存(opcode cache)8 O$ [8 K$ p9 W, E! l
B.优化或者升级你的网络连接
# H! S% ^, B% N9 I1 }4 j1 iC.添置更多的硬件
! f/ A* [7 j. d1 a4 R+ A& V/ YD.增加服务器的可用RAM7 P% T% m7 _* \3 |
E.使用连接缓存) g& Q. }' g" m$ ]9 {1 _
7 g+ V% C; R3 ^$ s. W! P# @

  n+ K9 ~5 u* b; g4 B! i: H! K3.架设生产环境下的服务器时,需要做哪些步骤?(双选)7 z' S7 U& G1 T6 K, A) _. ~
$ f7 R4 m& n' o, ]3 G" n
A.关闭错误报告
8 ]/ q# S; P# k! u1 v; JB.打开错误日志* P8 Q0 N; f! O' T
C.关闭错误日志
8 i6 k1 e( c7 |  _& B( ?5 wD.关闭错误显示2 F+ V) @$ z( G8 m+ {- _) l* T4 ?$ `; y
E.使用@抑错符
* O- Z: N- b* u3 t1 x
0 i+ ~* N$ a4 m, F3 ]) l& b& U, O7 W* P$ @* n( v3 w8 S# b
4.______操作符能对操作数的数据类型进行严格的比较?
6 h* {! R! T9 T, r& L; V/ w: }: `! C: ^9 I& F9 N
答案:____________+ C+ F+ G6 `1 `" A1 w0 b& W- i
$ }7 l2 U2 Z5 e* W* `8 A

, T  F! C3 z4 a& R5.操作码缓存(opcode cache)能做什么?( v& a; D9 e% z; t! e/ w2 D
: }1 ]# c; y" j1 s, r1 A" I
A.把脚本编译成二进制对象,使它运行得更快) E! D4 s5 d$ ~& R$ s. Y; c
B.代替Zend引擎加快解释器的运行
: d. Y& Y, C+ a$ I; hC.缓存脚本输出以提高执行效率
# j0 W7 Q& H1 h; T2 `6 ^! \  ID.缓存解析器产生的中间码,以提高运行效率
1 h2 h, I' E$ VE.在内存中缓存脚本,减少从硬盘中读取的次数7 Y4 k8 m% D# P4 F( J' m

( ?+ R8 p/ C4 B. n' ~7 V
: V( u* Y8 r/ X# h/ l+ L6.以下哪些情况容易造成系统资源枯竭?(双选), m! J4 Y# f" v: U: {5 o+ ?/ R
8 f1 Y$ x- _% G9 l" U, m& O( B- t1 t
A.RAM太小6 C; H! `# j% T+ D4 C, u% v5 ?) @
B.使用了低带宽的连接& H" c' T) L0 N7 I8 T9 ~
C.虚拟内存超过2GB
$ h: B; R3 ~( D  e  ?' RD.允许同时运行太多的服务器进程
& \8 ^  `+ Z  BE.以上都不对
0 c2 ~5 K7 U8 q1 ^& U  A. i# a2 T8 z0 X# }* T* }- D
3 n7 s. ^( ]# M2 O0 I
7.以下脚本缺了些什么?(双选) # {' C' T# ?3 {7 ~+ w% w3 F

  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 I$ Y, D  y, U- W( lA.参数出口(Parameter escapement)
7 {& B0 S, U. x; I$ K( fB.输出格式化8 L$ E8 Z0 E  b4 z5 i1 S
C.错误检查
1 z: e9 A2 S, G* k5 mD.一个SQL查询
8 j- c" w' c, N7 u: Z4 q, T! Q- ~1 UE.以上都不对) G* y9 ^* }% c4 H' J5 [" _8 y
) m. C* H. q7 V" _) H

! C4 Y* g$ Q, g  g. p# ~8.以下那种错误类型无法被自定义的错误处理器捕捉到?(双选)+ v' X# y0 z4 c8 x3 y

% _0 T  m( ?& I* u3 GA.E_WARNING
  ~! A. e- [# C  KB.E_ERROR1 V* U2 m) e6 e+ M' d2 g
C.E_USER_ERROR
/ [" w$ R5 L- V& x6 g. o* H& QD.E_PARSE2 I' v( |% K" D: n% b
E.E_NOTICE+ o9 B8 X" @6 [
% J! A& e6 g) s9 ]7 K" d& v

+ n3 I$ K" k. s+ f2 O9.当需要比较一个常量和一个变量时,如何才能保证不会错弄成赋值?( K" H5 Y" i0 q' y

% `8 _$ X" i4 U. u* HA.把变量转换成int/ B! P" A. k! m" r
B.使用全等比较符(===)
# u& ^' ~3 ?  u' r/ K7 dC.确保常量是第一个操作数3 N8 J1 o- j& J1 [+ g, y! Q
D.使用三元运算符
" b$ c5 q" c! ~: C$ n; pE.用括号把操作包起来9 R0 [0 V1 C3 s+ n) j/ [: I" x

( {8 ?3 v; C4 M  F) s; {7 @' [) J
0 ?5 E4 x3 ~! }- H0 q0 h; Z10.要通过邮件给系统管理员发送错误信息,以下那种方法最简便?/ A1 k9 G2 `: c1 L* H( q
7 x* r& X. l* w8 X% g. o/ q6 h7 ?
A.创建一个连接远程SMTP服务器的函数  f' j3 W! F. g
B.使用mail函数) b, ^" u# Q& i1 E7 G
C.使用error_log函数
/ ]" W! Z, P% V0 R: bD.调用sendmial程序
% X. Q# t& `5 L8 {E.使用webservice2 n; z3 j4 b  C8 S8 U" s& v% ^, B
+ A  c0 C/ j& ?% G7 R; g1 I

) E' r6 s6 W1 h6 `! |3 G11.能否仅调用一个函数就关闭脚本内所有的错误报告?/ U( ]$ X0 D$ S+ h6 F
, o  ?+ {! `( D7 C+ `6 a( d
A.能
% v: I  P3 h( l! d9 v, Y3 {: VB.不能8 ?0 [1 k$ n: d  S1 r
( _" n# E0 n! [. A" d( x9 k5 G

! S. o2 [" c  w! |8 b8 g12.概要分析器(profiler)是做什么的?
( N6 F2 x! S' d  A& C! Q( \) K5 Q8 g: U  h0 x" `* l. x
A.创建关于脚本结构的档案
. b  B: O5 H( {; K6 Q( J5 x: NB.把脚本转化成UML图
6 i. L% u4 Z' Z8 Z6 \# D% RC.精确测算脚本不同部分的运行时间3 [. a1 M) C* T) n9 r
D.计算脚本通过web服务器执行时的维度
* H: h% F9 x6 S- R5 ?/ ?" d' nE.扫描脚本,识别由常见错误导致的bug9 v/ u1 F6 a% E& |. S

6 B; ~8 P6 f  ]& c$ X/ ^/ x# n, T, c1 T; @( y% C- }
13.______能帮助识别和解决bug。
& G4 ^$ q0 A3 t" o; s( {* f) s
5 G4 z8 T4 y8 _* _  _* u答案:____________
$ I. p0 K$ G( L/ z+ x3 L6 l9 E7 P9 O( g* E% C7 b0 C

3 A% p% I, l! q, F2 o14.trigger_error()和user_error()有什么区别?5 k9 J5 O! X3 g3 v
6 [# G: ~+ v4 A& J  o6 |! \
A.trigger_error()允许脚本抛出系统级的错误
# J4 ~* V4 G  O8 w4 R6 zB.user_error()允许脚本抛出系统级的错误8 b: n5 O3 r! Y8 c& E
C.user_error()不能被用在错误管理器中
, ]4 R1 ]9 u; |; bD.trigger_error只在PHP5中可用
0 e, E7 s" M. j' M5 lE.没有区别
* ?7 t- e/ p% W7 G, ?
: M* R) H4 h- P! C, v2 Y- g& O" W0 D5 J2 h1 O
15.______函数能返回脚本里任意行中调用的函数的名称。该函数同时还经常被用在调试中,用来判断错误是如何发生的。' P2 @# L& n' n- c2 d& h

7 R# B" ^  A6 DA.print_r) p$ e% p. K- X5 ?: b! z7 ]+ }: t5 k
B.var_dump
7 o9 g5 l' x! b1 B9 T$ s2 F" uC.stack_dump  y% b4 B2 b$ c/ n% s
D.debug_backtrace
8 K9 s: }1 `, x* Y) U0 sE.以上都不对% t% q4 W7 e9 {8 ?2 u  g9 @  L

! ^  y7 t* A8 ?- l( Y8 v, e答案" m  W3 M9 ]: Z5 h" m. A, O+ _: e- l
' `/ ]: x" B$ G  V( K1 p
1.答案是E。三元操作符把每个if语句连到一起,作为&&操作的一部分。然而本题中,$x=1这个赋值只在第三个if为false时发生。如果第一个和第二个条件都不成立,$x=1就不会执行。这题对三元操作的应用有些极端,实际应用时,需要根据可读性来决定是否需要用三元运算符(本题这种情况就最好不要用)。7 _0 f$ b4 ?; E$ z

) o5 k( u/ p2 F2.问题是由第三方数据源传输缓慢导致的,而你无法控制这个数据源。你也许能在网络连通性上做些工作(假设问题出在你这一边)。还可以对接收到的内容进行缓存,这样能减少获取重复数据的时间。因此,答案是B和E。
$ @! G, g- F& M$ Q9 {) g+ Q4 v) M# @+ G! j
3.正确的选择是B和D。如果关闭错误报告、使用@抑错符和关闭错误日志,那么在你交付给客户的网站出现问题时,你将很难进行分析和调试。
' Z8 Q; @$ {4 |1 u$ `& j5 K$ n0 c- _  k. `2 e0 O5 M) n
4.这是在描述===操作符。* ]  y6 u, F: i1 S; K% C6 V: c$ R% s& c

' o0 @1 F7 _5 [) k* R5.正确答案是D。PHP脚本在执行时,将首先被解析成“中间”码(也叫opcode,操作码),然后解释器执行。操作码缓存出现在这两个步骤之间,对解析器的输出进行缓存。下次执行该脚本时,将缓存的输出直接送入解释器。这样就就不需要再解析一次了。9 O; p, b& k3 _
- l0 v, `- f1 ^( m) B' _
6.正确答案是A和D。如果RAM太小,进程间将出现资源竞争,服务器将大量使用硬盘交换。同样的,如果允许过多进程同时执行,也会使服务器频繁进行交换,导致速度下降。+ ?# S9 R% f  E1 x8 w5 Y0 D

6 s( g# c8 K$ n8 g, r7.正确答案是A和C。脚本不检验datebase_query()的调用是否成功,因此将持续执行下去,最终产生错误。此外,$my_id参数没有转义——可能导致代码注入(详见第11章)。! y7 K; v( U+ Z3 Y3 V+ \. T6 q7 w2 |' B

7 t, M, w) D1 U8.答案B和D正确。出现解析错误往往表示脚本中有语法错误,自定义的错误管理器无法捕捉到它们的原因很明显:错误管理器在脚本里,而现在无法解析脚本,管理器也就无法执行。类似的,E_ERROR表示有致命的运行错误出现,比如内存耗尽。因此脚本会立刻被中断,因为解释器无法执行后面的代码。
- M6 t( B! n3 q2 L5 S, s; Y/ k5 Y1 ~! w' F7 G: o( S( U' y+ T) @
9.答案是C。比较操作是一个可交换的操作(就是说结果独立于操作数之外),而赋值不是。因此,比如说,$a==10和10==$a是等效的,而$a=10和10=$a却不是,而且后者会导致一个错误,因为这不是一个合法的操作。确保常量在操作符前面,能保证你不会错误得将比较变成赋值。
5 s( ?, ~0 a, M9 V& w( b! A, s. o. t9 l5 J, y3 U
10.答案是C。error_log函数能将信息送往一个指定的地址。尽管mail()也可以用,但error_log能自动给邮件添加标题,因此这才是最简单的方法。
7 t  R5 f6 D9 G9 Y. K! e. ?5 ]0 l% |* ?) a3 p
11.答案是不能。error_reporting函数能关闭所有运行时的错误报告,但对解析时的错误无效,因为解析错误发生在脚本执行之前。3 o- S8 C: e. {3 m$ {) M
5 V" u. R4 p* `$ X$ `
12.显然,答案是C。概要分析器(profiler)能监视脚本的运行,并记录单个部分的运行时间。它可以用来找出和解决瓶颈。, O1 `9 J" b7 Y' q8 w

* S0 l6 j2 V* M4 p4 \5 c13.这是对调试器的完美定义!你可以用调试软件监视脚本运行,同时分析系统资源消耗,从而发现和解决程序缺陷。5 t% z5 X5 X7 k3 V5 `

! T/ L+ g1 M0 g0 K8 Y4 M4 p/ w0 q9 g14.trigger_error()和user_error()之间没有区别。后者其实是前者的别名。
8 y$ o1 r5 n( S5 l, s5 n
9 O, [1 f& c* N% t; O$ Z15.答案是D。题目是在描述debug_backtrace函数,它返回一个由所有在代码的特定位置调用过的函数名组成的数组。

返回列表
【捌玖网络】已经运行: