返回列表 发帖

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

作为一个开发者,无论你经验多么丰富,或者无论你多么努力,你的程序中总会有bug。这是生命中一个必然的部分,如同死亡与缴税(尽管并没有后面两个那么严重)。& z7 T1 E# c3 a$ ~/ w5 N8 h
要想解决bug,首先要能找到bug。事实上,许多开发者花费了无数小时茫然得盯着代码,只是因为他们没有把程序的容错能力摆在首位。忽略了这个部分,那么期望一个没有bug的程序就是——不可能的。
8 k3 ?$ a3 {9 P0 ^) i# _% v( X本章测试题将考察你对调试和性能管理相关知识的了解,以及如何用PHP做好这两件事。$ B- Q, z3 g7 D: t- d/ V

3 x! [6 j) p# L5 e4 u" h8 V8 Z# w* z3 X! t2 j
问题9 ]) _# Y: e$ B3 }
" e6 x2 P5 z9 b
1.以下脚本如何用三元操作替代?
3 d: Q; U. B5 }0 H6 ?

  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. ?>
复制代码
: V! N2 T. m" h5 P
A.$x = ($a A. < 10 || $b > 11 || $c == 1 && $d != $c) ? 0 : 1;
* R9 G  H* ]; n/ w4 f* WB.$x = ($a < 10 || $b > 11 || ($c == 1 && $d != $c)) ? 0 : 1;1 t, Y- K( n4 k
C.$x = (($a < 10 && $b > 11) || ($c == 1 && $d != $c)) ? 0 : 1;
) ^; Q' d$ w. ?, eD.$x = ($a < 10 && $b > 11 && $c == 1 && $d != $c) ? 1 : 0;9 F4 J+ ?# H0 X4 j! b
E.以上都不对
7 H$ G4 j. g6 x1 L$ b" |* H. Q( w% P6 K# A7 M, N$ {$ G
" l% V! D: j; _' C. z/ r
2.有一个脚本由于要从远程获取数据,因而运行速度很慢,以下那种方法能对其进行优化?(双选)/ b/ e* u$ j$ U1 C* c

* s% S) H4 E2 ~5 w; [A.安装操作码缓存(opcode cache)6 k6 M  T; c2 X4 q
B.优化或者升级你的网络连接
" A$ m8 D$ h! m1 H/ E- l  ?! pC.添置更多的硬件
* F# X) B: g9 _! _- t$ [  GD.增加服务器的可用RAM. w' n, i& O# c: T) W  G
E.使用连接缓存
% g- \, j8 S1 r  I0 M; M4 C
/ ~; T" E0 I$ K0 ?7 ^3 @* o& d9 d% ^0 @% @- M
3.架设生产环境下的服务器时,需要做哪些步骤?(双选)
' E2 n' ~' a1 N6 n' v; @7 @0 O* _- w
' {' h. d/ X4 kA.关闭错误报告1 T1 I9 @6 v! e* _7 z
B.打开错误日志
( U% Z4 w5 K; o" }5 Y# ~! [C.关闭错误日志) L5 c' k1 Y- m4 @- |( c( A+ \/ x& T
D.关闭错误显示5 M) F3 o' P. P& Y$ r/ v' ^3 N
E.使用@抑错符
/ i$ }. l2 z5 ?% K
# D( \. u( n/ _" ^
3 \  k+ \! p$ s$ Q) {3 a& [4.______操作符能对操作数的数据类型进行严格的比较?8 p8 ]" s' |* q: ^8 [
8 `4 V5 H2 S& p9 ]
答案:____________
6 I0 E  @& K5 O1 g+ R
0 X3 n* \# l8 y! Z
8 Z% C% j2 L( {" x1 Q5.操作码缓存(opcode cache)能做什么?
1 h" O& }8 [- _+ r( ]! T4 N0 e! s/ O
A.把脚本编译成二进制对象,使它运行得更快
% ]( G8 b4 w' q! Q1 gB.代替Zend引擎加快解释器的运行6 p1 D$ a4 u0 J* I. D; `6 s
C.缓存脚本输出以提高执行效率1 y& F% i. \0 t( b$ ?* e% |( b
D.缓存解析器产生的中间码,以提高运行效率
# h5 \6 |+ Y0 Z# uE.在内存中缓存脚本,减少从硬盘中读取的次数0 \6 b9 B& z! w; t9 I! D

; g0 ~% l) [/ M- \1 M( L, K' i3 b+ W; B& t% A, ?1 @
6.以下哪些情况容易造成系统资源枯竭?(双选)
" Q  S; Q0 V( X( @8 `
( P6 }3 K: z8 P& `A.RAM太小4 y$ V3 i& w1 Z
B.使用了低带宽的连接3 K: f' f, C$ \" a* {, L
C.虚拟内存超过2GB) z5 S  l$ r: c, {$ ]) `' Y* U
D.允许同时运行太多的服务器进程
( g- ~* j7 n3 l0 C  wE.以上都不对
7 S) S7 m) z( F) Q6 _7 w, J3 g6 w' S

- v( Z+ Y7 S2 b7 ]7.以下脚本缺了些什么?(双选)
# f' p" P2 B' x+ q

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

5 O' C* r! |, f4 y5 a" e" PA.参数出口(Parameter escapement)8 K- L# q. ]" c, t) Y. B
B.输出格式化; ~$ D, L8 A: e# |; w
C.错误检查
, M: S: p' r! ~' yD.一个SQL查询
% j  B' a: i% f+ ~$ PE.以上都不对- G' ^8 D! u+ r& g$ Y/ ~9 Z

. \. ]( I& H: r9 D$ J7 n6 l  Z6 l2 y( `/ W* A" i2 S, U+ Y
8.以下那种错误类型无法被自定义的错误处理器捕捉到?(双选)$ H8 t7 F3 b; e$ s

$ W9 J; q* c# f) `' V# H0 T9 @9 `A.E_WARNING
8 ~/ D" Y1 I+ d' qB.E_ERROR
& z3 C1 q8 I" ]8 n" E- I: f( zC.E_USER_ERROR8 M8 ?- d$ z& f
D.E_PARSE9 W# |) [  C! n/ i8 [3 W
E.E_NOTICE5 p/ b/ p* x5 E) g  n7 ~7 A. ~8 g

! @$ G9 B5 H/ @5 \$ C5 j5 X8 n, d' z( q* C
9.当需要比较一个常量和一个变量时,如何才能保证不会错弄成赋值?) }& W+ [2 k" F. T, F( }/ r
. C: x3 x% A* B/ Y' b
A.把变量转换成int* o4 T2 f. R. Z3 }
B.使用全等比较符(===)
. i* X2 D- J: p1 M9 Y& [* I& p. l% oC.确保常量是第一个操作数
7 L! F1 h( y6 H8 Y3 Q" BD.使用三元运算符. T% f1 x/ N, u1 A9 O
E.用括号把操作包起来, o1 w/ |  \- i* ]) x
" Q" p3 s" A) T' x0 p0 [

0 m! T& ^. G: H5 g$ m! X8 e10.要通过邮件给系统管理员发送错误信息,以下那种方法最简便?
$ N( f4 x# Y. ~# Q" L- w. h; q5 |' u; N
A.创建一个连接远程SMTP服务器的函数7 [, n: d1 u. [$ E
B.使用mail函数, i' U4 j6 n  Y* K: x: g' V& A
C.使用error_log函数5 Q. }1 ?' o. r# X. a' F# U2 p
D.调用sendmial程序3 j" Z# Q( n" E$ O
E.使用webservice+ X3 G2 r( z3 C1 U: X- M* J
  Q4 R0 h* A3 R8 ]; i
6 p0 L" T# o1 z+ @+ I7 Z
11.能否仅调用一个函数就关闭脚本内所有的错误报告?* W! J+ c; u* q  E: O% u- W2 s: _  K
+ S& y1 f+ w) A' U4 N) z, }
A.能
# q# Q# d& n* k3 KB.不能
  Q8 h' i5 W* B' P1 }/ U) x; ^/ C6 q* S7 J& r4 A0 \1 [) y' h
8 b6 U; D/ `$ ~
12.概要分析器(profiler)是做什么的?
2 W$ Z7 j4 v6 D8 R% G/ {
2 W" C  n( s: Y  K. I4 }1 |- ]A.创建关于脚本结构的档案
) C2 \2 D' ?$ H6 p. p) ZB.把脚本转化成UML图
; C) q) {5 m8 }' I8 l- WC.精确测算脚本不同部分的运行时间3 X' \# ^0 q6 ^( g& e' [
D.计算脚本通过web服务器执行时的维度
3 G- v5 I: C  q& X- J0 ?E.扫描脚本,识别由常见错误导致的bug9 u" M3 s7 @+ }/ a; @8 X' G6 R

+ m3 Q" ]- F7 _
" F/ O( z) C$ o* X, J3 U- K3 V- J8 ~13.______能帮助识别和解决bug。) |" Y/ t, e) a6 V/ D

1 m! x: W' [; d  L答案:____________
/ d* u9 T, @! t" J: c: l6 F5 v; B# F" w, Z
# e3 [% {- c9 s: u8 ^# f
14.trigger_error()和user_error()有什么区别?8 p9 k5 }$ L$ v9 z3 d; a3 I9 N( v
! t. f) s" H2 y8 T/ ~) b, c
A.trigger_error()允许脚本抛出系统级的错误7 X! }. t/ }% Q; M: E( W! C9 F
B.user_error()允许脚本抛出系统级的错误
* m0 ^$ h+ k- A% D! iC.user_error()不能被用在错误管理器中9 s* p; z  L; W' f" r
D.trigger_error只在PHP5中可用) j9 \6 {8 D  J2 [
E.没有区别
& M, Q  y1 x- B* [7 c* P7 E9 l5 k% E  x+ ^+ U+ e- Y
! \3 n& d. i4 F& f2 M  q
15.______函数能返回脚本里任意行中调用的函数的名称。该函数同时还经常被用在调试中,用来判断错误是如何发生的。, q& f& ]& v9 [2 H( }- h
2 c2 g& N8 M: g* `- X% U; r
A.print_r
: S, x6 ^6 |8 s- S! x* b  iB.var_dump, `; ~! a" z4 V" j
C.stack_dump
, [+ C0 B; h" X2 A. YD.debug_backtrace6 A$ d8 E& v- r" f+ k  v
E.以上都不对: v. G+ s% W2 f$ c" n" ]; ?
* u+ {/ K0 P8 J: }7 _
答案
2 s7 h- @* K" `$ T, `) r' V- V+ F; H) l4 y( o
1.答案是E。三元操作符把每个if语句连到一起,作为&&操作的一部分。然而本题中,$x=1这个赋值只在第三个if为false时发生。如果第一个和第二个条件都不成立,$x=1就不会执行。这题对三元操作的应用有些极端,实际应用时,需要根据可读性来决定是否需要用三元运算符(本题这种情况就最好不要用)。
1 z8 ?7 l! [/ @# h& u9 j
, u- z- l. l1 o: a6 M; M7 A* K8 Q2.问题是由第三方数据源传输缓慢导致的,而你无法控制这个数据源。你也许能在网络连通性上做些工作(假设问题出在你这一边)。还可以对接收到的内容进行缓存,这样能减少获取重复数据的时间。因此,答案是B和E。
( Z2 ]: ]/ g  h6 U; V5 V: u; U8 t
; U; A4 m  d( e- ^" Z$ k  y7 M3.正确的选择是B和D。如果关闭错误报告、使用@抑错符和关闭错误日志,那么在你交付给客户的网站出现问题时,你将很难进行分析和调试。
6 {$ ^( S) J  e
7 B2 ?; b7 b: a0 d4.这是在描述===操作符。
2 K- l. r8 t) `1 |% [! w' x& H9 Z. }  h
5.正确答案是D。PHP脚本在执行时,将首先被解析成“中间”码(也叫opcode,操作码),然后解释器执行。操作码缓存出现在这两个步骤之间,对解析器的输出进行缓存。下次执行该脚本时,将缓存的输出直接送入解释器。这样就就不需要再解析一次了。
: N/ B6 _. ?' |3 `3 R
3 }3 Y$ t7 _8 M9 g/ W6.正确答案是A和D。如果RAM太小,进程间将出现资源竞争,服务器将大量使用硬盘交换。同样的,如果允许过多进程同时执行,也会使服务器频繁进行交换,导致速度下降。' R3 J9 Y, C$ H" n
. ^$ ?& ?6 F; Y& i" A  q. c
7.正确答案是A和C。脚本不检验datebase_query()的调用是否成功,因此将持续执行下去,最终产生错误。此外,$my_id参数没有转义——可能导致代码注入(详见第11章)。
* M# K. t) O& H/ F% O: g7 o
8 y7 r7 m- t8 y& ^- q* y8.答案B和D正确。出现解析错误往往表示脚本中有语法错误,自定义的错误管理器无法捕捉到它们的原因很明显:错误管理器在脚本里,而现在无法解析脚本,管理器也就无法执行。类似的,E_ERROR表示有致命的运行错误出现,比如内存耗尽。因此脚本会立刻被中断,因为解释器无法执行后面的代码。0 @: b9 s  ^$ v& r7 @7 H$ K

" C2 U# K' F' C, N5 z, \6 d- d4 v5 x9.答案是C。比较操作是一个可交换的操作(就是说结果独立于操作数之外),而赋值不是。因此,比如说,$a==10和10==$a是等效的,而$a=10和10=$a却不是,而且后者会导致一个错误,因为这不是一个合法的操作。确保常量在操作符前面,能保证你不会错误得将比较变成赋值。  U' b9 x( v% w6 X6 N
$ x% X4 W; K0 ]* D) Q& Y
10.答案是C。error_log函数能将信息送往一个指定的地址。尽管mail()也可以用,但error_log能自动给邮件添加标题,因此这才是最简单的方法。
+ y; I. G. B- G" k  Q! r8 b4 @7 S' r% d% @3 c- ~
11.答案是不能。error_reporting函数能关闭所有运行时的错误报告,但对解析时的错误无效,因为解析错误发生在脚本执行之前。( }' D5 i  X) b4 v
: U3 r4 I% w3 \& i6 B8 h8 h
12.显然,答案是C。概要分析器(profiler)能监视脚本的运行,并记录单个部分的运行时间。它可以用来找出和解决瓶颈。: @" }3 Y2 S6 [; v; w: F: M
1 B1 s$ |4 H+ H" ?1 a1 z- ^
13.这是对调试器的完美定义!你可以用调试软件监视脚本运行,同时分析系统资源消耗,从而发现和解决程序缺陷。
; S/ |" Z( q4 G  e  J7 z* \0 t9 h( y- U  V
14.trigger_error()和user_error()之间没有区别。后者其实是前者的别名。
$ q6 l: r) q, R/ h8 \/ P# h
9 f5 {- N7 Z& c8 l4 x& |- ~15.答案是D。题目是在描述debug_backtrace函数,它返回一个由所有在代码的特定位置调用过的函数名组成的数组。

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