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

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

作为一个开发者,无论你经验多么丰富,或者无论你多么努力,你的程序中总会有bug。这是生命中一个必然的部分,如同死亡与缴税(尽管并没有后面两个那么严重)。4 I  N) F: r& _( ]8 [  g
要想解决bug,首先要能找到bug。事实上,许多开发者花费了无数小时茫然得盯着代码,只是因为他们没有把程序的容错能力摆在首位。忽略了这个部分,那么期望一个没有bug的程序就是——不可能的。, v" u! Q/ z) o9 ~) D. h
本章测试题将考察你对调试和性能管理相关知识的了解,以及如何用PHP做好这两件事。9 T! I$ ?1 e5 n1 `. i( R
7 r$ a, f" d  y! W! x- k
+ f2 x8 c# F4 D7 x- P
问题
7 @8 I; O* g9 G  w4 _/ P: `2 ?1 _9 n, r& A, ?
1.以下脚本如何用三元操作替代? % q' ~8 @  A- a8 |2 S& E# M

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

& z. ?$ s9 ]5 V6 ?, v8 K9 TA.$x = ($a A. < 10 || $b > 11 || $c == 1 && $d != $c) ? 0 : 1;& E  h- ^0 y' R# X0 l
B.$x = ($a < 10 || $b > 11 || ($c == 1 && $d != $c)) ? 0 : 1;$ @" `/ m7 u1 O- ^* O
C.$x = (($a < 10 && $b > 11) || ($c == 1 && $d != $c)) ? 0 : 1;
( ^6 M( e' A7 P/ [7 UD.$x = ($a < 10 && $b > 11 && $c == 1 && $d != $c) ? 1 : 0;6 h: T: R- h5 ]/ I  K3 |
E.以上都不对* G- V( m" B/ P- T4 F: {

3 D2 K" ?+ H0 ]$ i# ]3 l
* W0 E9 I7 b! K" ^- L' u0 J1 V  ?2.有一个脚本由于要从远程获取数据,因而运行速度很慢,以下那种方法能对其进行优化?(双选)
' `) c2 g6 d6 D* I
5 F. w4 c7 a# i" Y+ N1 t: YA.安装操作码缓存(opcode cache)
% i1 O9 D, U; E! \0 l* JB.优化或者升级你的网络连接: F+ v% ^( B# z2 j  R: H. U
C.添置更多的硬件
* H' `( N3 _/ a' a, xD.增加服务器的可用RAM
8 F( v  P1 h) k4 c$ |* HE.使用连接缓存
  M) P/ c  Y* b6 `8 c* p" n6 \( x) o
2 N; L" I/ `* Z3 a( `0 }4 m% \3 X0 P2 W7 W. w) u/ m
3.架设生产环境下的服务器时,需要做哪些步骤?(双选)
- f' E/ g! W% b1 w& E: w5 {' l4 p1 V; R( Z( H2 Y
A.关闭错误报告
0 o4 Y5 ]' u6 N3 E7 o. E7 ~* @B.打开错误日志) P8 z# w) J, X1 ~6 h
C.关闭错误日志
# Z. P2 P: ~: FD.关闭错误显示* M9 w, I! S6 P/ ^8 y. i
E.使用@抑错符
# D. _3 I& K3 M7 Y
  N6 V9 k- l* H2 J5 y
9 S# p* [- F- N& o6 N4.______操作符能对操作数的数据类型进行严格的比较?
/ {2 r, m$ \4 F2 O# a1 k% Y# t: q
答案:____________
4 r% P" i2 p% A, J/ F
/ `& I( G9 C7 {% C( e7 R
# r9 q+ I7 A" e) ?+ P5.操作码缓存(opcode cache)能做什么?
& _5 X3 t' r8 `8 g
  j8 Q2 e$ L! Q7 J& K6 B6 b0 ZA.把脚本编译成二进制对象,使它运行得更快  b) L0 {. j4 v& U; v7 v5 t+ y
B.代替Zend引擎加快解释器的运行
6 s  d! ]  q; y: tC.缓存脚本输出以提高执行效率& G; O. M1 {/ p9 Y$ O
D.缓存解析器产生的中间码,以提高运行效率
6 ]6 p7 B- b' e/ c# YE.在内存中缓存脚本,减少从硬盘中读取的次数, j' n  r4 H# E. w' g0 e9 L9 P
7 B( Z/ B" p- `: G' x( w, c% w
! p/ @6 N8 {3 [7 {7 ?  q
6.以下哪些情况容易造成系统资源枯竭?(双选)/ Z: N0 c, r. r: ^
. U# y* K3 O& ~) V8 [1 h- t3 t
A.RAM太小
) k) G+ G5 k( I! u2 d; tB.使用了低带宽的连接
  R+ ~0 @* I  zC.虚拟内存超过2GB
  U, b( U* g  v* {# CD.允许同时运行太多的服务器进程
5 b5 K) k# S, q6 x& Z5 jE.以上都不对
$ E8 r9 N+ R( ]& w  z
# s6 k8 u5 n. {. e9 t7 B
6 O2 x# ?. E  d1 G7.以下脚本缺了些什么?(双选) . ^( L# S; P$ X5 D. [9 e

  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. ?>
复制代码
9 u5 S4 w6 \# W+ O* S- i
A.参数出口(Parameter escapement)2 e9 r; @' q, ?5 |; v' K! X' |8 S
B.输出格式化3 v. e4 q! O* _6 e/ A, L  Y
C.错误检查9 A& \: `$ b, W! p% w) O! q& K: s
D.一个SQL查询
+ m& r: I$ B" Z" s2 {$ \E.以上都不对
; `" Q3 U  f9 u8 E8 n' k7 w3 Z: B$ T) X
8 j: O) l% v8 H5 P
8.以下那种错误类型无法被自定义的错误处理器捕捉到?(双选)  X: P$ p8 y  P3 Z0 u! X6 ^) S3 e
/ n2 _8 N& {* ]+ T
A.E_WARNING6 d6 u& a6 w5 s: _
B.E_ERROR4 ]& B0 n& O8 k+ ^8 R1 M+ I
C.E_USER_ERROR
- A; E5 J5 I+ q( K) l; x/ }$ yD.E_PARSE  Z# I3 Z! q5 H5 a. c
E.E_NOTICE! k2 a2 b. d* V4 S1 a, B' Y
* {- q& s+ I6 s
0 g+ e' n+ s) ~8 u% V7 C
9.当需要比较一个常量和一个变量时,如何才能保证不会错弄成赋值?
1 L# p. _9 y- _1 p& G4 a2 s: J: ?' ~/ b$ n" E! ]' Y
A.把变量转换成int/ s1 I1 |! U& }$ r
B.使用全等比较符(===)5 u0 E0 {# T) l+ s: h8 R& L
C.确保常量是第一个操作数0 C4 m" z* s% h" V
D.使用三元运算符" f7 q3 M. i0 U0 k9 g* K% O/ D/ J- N
E.用括号把操作包起来" R6 T# p7 j, `+ [1 r+ k; }
/ }: \) q9 i2 |, a! S
/ i" L6 l2 f4 u# Q. q( G
10.要通过邮件给系统管理员发送错误信息,以下那种方法最简便?
' Q0 e( Q- C5 u. L* f. c  C7 v; c- U. B2 c# P8 q) Z4 x+ n
A.创建一个连接远程SMTP服务器的函数
. _' |- p: l: b2 ^- m. B1 LB.使用mail函数4 W9 x" ]" M: e" t6 f+ E
C.使用error_log函数( [; r0 r% _" L# C0 f8 I/ ^! Q
D.调用sendmial程序9 p. }$ a6 l. t, U0 h" ~/ F( q) \$ j
E.使用webservice* _0 c) S  P3 v0 E& p
" J; _7 h9 d' @! W, B" R. S

. K( J' \/ Q5 U2 j  f11.能否仅调用一个函数就关闭脚本内所有的错误报告?) i: a: T$ A% J  f  W, d
& o1 Z8 f, }! t
A.能8 i* W, @+ G. v
B.不能
% a2 F: T! c9 d
9 r  l+ H9 O0 R- e& d
! |0 Q; M/ g: n% c2 Z12.概要分析器(profiler)是做什么的?
0 s3 Y- \$ B! j* _
  }" q% h) q2 T0 B6 NA.创建关于脚本结构的档案
8 k: \8 E* I" |- A+ B1 zB.把脚本转化成UML图" Q6 Q/ q, n3 y5 M5 h3 ]
C.精确测算脚本不同部分的运行时间
' F# j. X+ ~5 k+ W; a( s* lD.计算脚本通过web服务器执行时的维度
  }  R+ D5 b: k( [. a. [1 IE.扫描脚本,识别由常见错误导致的bug
1 \. v9 V+ ?$ j3 B) [" w9 o: w0 h& K  Y  f- ?! T& }
( |3 i" X$ D' Y; g
13.______能帮助识别和解决bug。9 V2 `$ {0 C$ q' r" U/ U0 D: M6 R" e

' {. J5 [: [: D" C答案:____________) f' ?; J9 C5 ^+ `7 W
3 s% T2 g9 i7 v

3 o' P9 i0 p( n; w8 k* w1 {- ?/ Y14.trigger_error()和user_error()有什么区别?6 b6 e) Y" W6 p; }- h" f0 ?$ P4 u$ Q; M

$ R+ `6 R8 J6 }: aA.trigger_error()允许脚本抛出系统级的错误
" c+ E1 ^" g/ H; j  m; nB.user_error()允许脚本抛出系统级的错误/ I1 P" U) H5 r0 T- v
C.user_error()不能被用在错误管理器中
. ]6 }$ G4 ^/ G; bD.trigger_error只在PHP5中可用! _' d3 R9 Q; i- W$ V
E.没有区别  f% Z( p! o& M# t7 M  q

- x4 L) b# M* ?  ?, n( M' U9 K6 [) T' z$ \' ?6 V/ K3 O7 E
15.______函数能返回脚本里任意行中调用的函数的名称。该函数同时还经常被用在调试中,用来判断错误是如何发生的。
' S: ~9 l8 x/ V* Q; @* B4 Y2 J+ o% E8 }- s& w& H4 v2 {% C9 b
A.print_r' o1 m8 z8 i- n8 l4 ]$ M6 z
B.var_dump
! U) R+ _, m9 k. ^- s5 p  d( @C.stack_dump7 X6 T0 {6 Z5 i$ f/ Y. [
D.debug_backtrace
: e9 ~. v/ x/ Y" h1 i6 oE.以上都不对
9 K9 E3 v8 u: \# x* G' r6 f% o
) L8 d% E! ~2 ?. I5 S5 |答案' I' P$ ]4 |( l5 N
6 E; G* S$ U( w* r: L% J) `! f
1.答案是E。三元操作符把每个if语句连到一起,作为&&操作的一部分。然而本题中,$x=1这个赋值只在第三个if为false时发生。如果第一个和第二个条件都不成立,$x=1就不会执行。这题对三元操作的应用有些极端,实际应用时,需要根据可读性来决定是否需要用三元运算符(本题这种情况就最好不要用)。
' v- H9 ?, C+ {
( n* {/ d+ a' r8 ?# B7 \2.问题是由第三方数据源传输缓慢导致的,而你无法控制这个数据源。你也许能在网络连通性上做些工作(假设问题出在你这一边)。还可以对接收到的内容进行缓存,这样能减少获取重复数据的时间。因此,答案是B和E。
# ?$ f8 p& k  ]0 U) S; N2 B. g7 o0 Z5 z9 y
3.正确的选择是B和D。如果关闭错误报告、使用@抑错符和关闭错误日志,那么在你交付给客户的网站出现问题时,你将很难进行分析和调试。/ t" L" D2 R- z, \
$ Q. `7 Y# r- T
4.这是在描述===操作符。
# f# {! _" e/ a1 C! i5 Z0 m
. ]1 h9 b% }* l. v; t5.正确答案是D。PHP脚本在执行时,将首先被解析成“中间”码(也叫opcode,操作码),然后解释器执行。操作码缓存出现在这两个步骤之间,对解析器的输出进行缓存。下次执行该脚本时,将缓存的输出直接送入解释器。这样就就不需要再解析一次了。2 i! R( j( b% k; {0 Y. k
: g( H3 _4 A$ w9 o% O
6.正确答案是A和D。如果RAM太小,进程间将出现资源竞争,服务器将大量使用硬盘交换。同样的,如果允许过多进程同时执行,也会使服务器频繁进行交换,导致速度下降。( W) q  l' K% H- V- C

* f7 T/ |* F% X6 C7.正确答案是A和C。脚本不检验datebase_query()的调用是否成功,因此将持续执行下去,最终产生错误。此外,$my_id参数没有转义——可能导致代码注入(详见第11章)。  u/ u4 r8 U5 d9 L2 x: k

; A6 x+ v" S1 Z$ Z8.答案B和D正确。出现解析错误往往表示脚本中有语法错误,自定义的错误管理器无法捕捉到它们的原因很明显:错误管理器在脚本里,而现在无法解析脚本,管理器也就无法执行。类似的,E_ERROR表示有致命的运行错误出现,比如内存耗尽。因此脚本会立刻被中断,因为解释器无法执行后面的代码。4 |1 h' I5 \3 U) T. A
: ]$ \, X5 R5 {
9.答案是C。比较操作是一个可交换的操作(就是说结果独立于操作数之外),而赋值不是。因此,比如说,$a==10和10==$a是等效的,而$a=10和10=$a却不是,而且后者会导致一个错误,因为这不是一个合法的操作。确保常量在操作符前面,能保证你不会错误得将比较变成赋值。
+ p7 j& [" Z  J) t+ @  A8 i+ u
1 ^8 D- B; B, t0 P% I4 h: O& `10.答案是C。error_log函数能将信息送往一个指定的地址。尽管mail()也可以用,但error_log能自动给邮件添加标题,因此这才是最简单的方法。; C: Y! S" P0 z3 C2 q
: }; G- J8 N3 C7 O2 w/ C# \3 i( ]4 T
11.答案是不能。error_reporting函数能关闭所有运行时的错误报告,但对解析时的错误无效,因为解析错误发生在脚本执行之前。# O) J9 {7 |7 O3 U9 \  i) Z
% D, J$ U9 T1 i% H
12.显然,答案是C。概要分析器(profiler)能监视脚本的运行,并记录单个部分的运行时间。它可以用来找出和解决瓶颈。6 b0 v! ^4 f6 |' P. ^0 v4 C

2 A& G" [. @7 a+ z& `13.这是对调试器的完美定义!你可以用调试软件监视脚本运行,同时分析系统资源消耗,从而发现和解决程序缺陷。
, `0 d! ?$ v5 h" r9 a+ l' `
3 P9 J4 Q0 j9 x& P+ j14.trigger_error()和user_error()之间没有区别。后者其实是前者的别名。: r7 w' E' K' b: t1 g5 d: C
+ @! a% ]& o* Y; U& s. c: ?/ Q# V
15.答案是D。题目是在描述debug_backtrace函数,它返回一个由所有在代码的特定位置调用过的函数名组成的数组。

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