返回列表 发帖

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

作为一个开发者,无论你经验多么丰富,或者无论你多么努力,你的程序中总会有bug。这是生命中一个必然的部分,如同死亡与缴税(尽管并没有后面两个那么严重)。
# K) m; c; \, ?" Y要想解决bug,首先要能找到bug。事实上,许多开发者花费了无数小时茫然得盯着代码,只是因为他们没有把程序的容错能力摆在首位。忽略了这个部分,那么期望一个没有bug的程序就是——不可能的。& w9 D! e# {! Q2 R: O
本章测试题将考察你对调试和性能管理相关知识的了解,以及如何用PHP做好这两件事。
, i1 \6 T. Y" Y, W# m. F
9 g+ v/ Q7 r2 M) N3 Q7 \  z( r# B- `
" K$ k/ H9 N$ ?1 d问题- D/ W5 L# L% T! }% t( t6 n- i

% J- P6 A+ O. u5 B/ |. z1.以下脚本如何用三元操作替代? % O5 `) P* Z, s. z# c

  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. ?>
复制代码
8 s* Z/ G5 K1 J: f; ~
A.$x = ($a A. < 10 || $b > 11 || $c == 1 && $d != $c) ? 0 : 1;
3 e, f1 d5 f) K* e/ `  k  c, U6 V) `B.$x = ($a < 10 || $b > 11 || ($c == 1 && $d != $c)) ? 0 : 1;
1 j7 c3 S7 S) D5 pC.$x = (($a < 10 && $b > 11) || ($c == 1 && $d != $c)) ? 0 : 1;" C. I# r- I" b5 M
D.$x = ($a < 10 && $b > 11 && $c == 1 && $d != $c) ? 1 : 0;
/ _  K8 a6 [* \$ Q) iE.以上都不对8 I, R6 H+ g9 U, C/ A

: }4 h2 ?2 ^7 k4 ~
8 B9 r; n8 x8 |$ Q% |& ]1 F! ^( Z2.有一个脚本由于要从远程获取数据,因而运行速度很慢,以下那种方法能对其进行优化?(双选)% W5 _0 o$ U) Q* l

2 g% R7 I" i% g4 DA.安装操作码缓存(opcode cache)
+ I0 F/ t: L8 ~- w0 GB.优化或者升级你的网络连接
4 ]6 b- b, N/ cC.添置更多的硬件  q; c+ X* ~  V7 o. X8 a& _
D.增加服务器的可用RAM
4 F5 ]! n! J/ }) O, u! v0 |E.使用连接缓存5 L. k" @/ m( y! D) x

( J" V& S  w& Q2 `  z& g
* S2 O% m4 M2 K- n, d# g3.架设生产环境下的服务器时,需要做哪些步骤?(双选)
7 i% Q& N$ v4 ?6 e' |
8 p. ~$ \. C4 w( J  n4 ZA.关闭错误报告
/ u# U4 o% ^# y3 y2 Z3 QB.打开错误日志6 W, X8 A0 X7 H8 j
C.关闭错误日志6 p0 z  V. q, `" i+ M
D.关闭错误显示
' m$ R& F1 S( C0 S, `$ t4 s! w9 lE.使用@抑错符
# |* i( T' u+ {2 d
% R1 i  v1 T* t+ D  R1 {" ?  x. b2 b' n* [2 e2 m' e5 N
4.______操作符能对操作数的数据类型进行严格的比较?
3 S- L8 Q! Y3 L7 \8 C" O# [0 r5 [0 ^' Y# u8 M' a1 i2 Y
答案:____________
: C5 n- l: Z4 ^% B# \
6 [3 p; f1 Z- `6 a; n
; f- k9 c+ F& b, J# A5.操作码缓存(opcode cache)能做什么?
8 N) C  v, J+ t7 s5 h$ G% h) @6 |: E: P' J" I( p/ S5 R
A.把脚本编译成二进制对象,使它运行得更快
3 d% t: T8 H% `' y! F: OB.代替Zend引擎加快解释器的运行
" u( ]$ q% X2 U: j1 a  U3 WC.缓存脚本输出以提高执行效率, k/ }' N% \& I& Y  K9 B6 M' i
D.缓存解析器产生的中间码,以提高运行效率" j& x  r- G4 _1 \
E.在内存中缓存脚本,减少从硬盘中读取的次数' t0 P0 _( C6 p( f7 p
( p2 x. _, i1 v$ h5 }1 s
  R, Y) ?8 l8 ~. T& |
6.以下哪些情况容易造成系统资源枯竭?(双选)
0 c2 S" e; q/ B2 \" X8 S. v( {( e3 i. K8 G, }! r
A.RAM太小
! b" }; D1 ~  F. u* g2 AB.使用了低带宽的连接
& u2 S0 P& `, |9 V& sC.虚拟内存超过2GB
7 s; ~' V' U; U' gD.允许同时运行太多的服务器进程
% d; K4 M: H/ F9 S+ eE.以上都不对; k+ W6 n) O* [( p, r0 R) _
2 O/ T' L, ]8 j2 Y  w7 f( M1 d! W7 w

; D9 w2 y) j/ t% D+ e* F7.以下脚本缺了些什么?(双选)
! y6 ]' d6 w* l$ A% \8 h: X

  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 @( u0 c" U; p
A.参数出口(Parameter escapement)
  q2 Y; M: q, e8 B  z( I- L8 j1 I6 cB.输出格式化* [# Y8 p- _8 L2 Z. S; h8 ]
C.错误检查' g* ~; r6 v* S: m% v  \
D.一个SQL查询
  |4 V$ j3 @8 W! IE.以上都不对
2 c( q( X; r. P$ x8 q; \* s. {9 J$ d$ _9 q/ a- w
6 w' G1 m+ |. ]+ P6 G8 I
8.以下那种错误类型无法被自定义的错误处理器捕捉到?(双选)
0 p( o$ m& m* G" G
4 s1 x; Z; @8 q- L8 uA.E_WARNING
  `6 d2 ?. x/ D6 k+ c+ e/ YB.E_ERROR8 u; a- `$ Q6 i; P. R; l
C.E_USER_ERROR
6 ]- [. A# I# Z' K$ C  D* bD.E_PARSE
# g( [% h: O, f: |: k8 Z% uE.E_NOTICE
; }1 n* L7 _' g/ r( `; W9 _; q! T# u' k$ j2 {% k4 K" K0 d
7 z* f; j' |2 `) v  i
9.当需要比较一个常量和一个变量时,如何才能保证不会错弄成赋值?/ Q9 k+ @) S$ [

# q8 R2 |/ W1 OA.把变量转换成int
! u* U+ G, X- }! W; L& PB.使用全等比较符(===)0 ]; e) o: j. L# u
C.确保常量是第一个操作数( C' z3 ^9 u  r2 ]" L! ]7 S- t
D.使用三元运算符
( E( I  o. |* B% T3 pE.用括号把操作包起来
8 h4 X- g& \! J, }
5 M4 ?$ a8 e; P1 M
9 k1 h! o. c) H( k2 D# I( ^" L10.要通过邮件给系统管理员发送错误信息,以下那种方法最简便?& f& z& l/ L4 C  p
) X& ^4 b1 T" G
A.创建一个连接远程SMTP服务器的函数8 S& |" V0 Y, S9 q/ Z0 r
B.使用mail函数" [; v8 P+ p4 D$ y
C.使用error_log函数: z1 j- i: [1 h) P2 r+ S/ H; o
D.调用sendmial程序1 S& g. ^  E$ ]) @/ o
E.使用webservice! e1 J( o- d5 m! N2 c) ]0 [" G

8 l  v/ M3 J7 v& S4 E0 u' Q% M' y0 k, X; u
11.能否仅调用一个函数就关闭脚本内所有的错误报告?
: c, y1 g% X" @  W+ V/ Z7 k& `! C% j- y4 i5 U$ U7 p) h8 t
A.能
& x5 [" R7 ]( w0 U* wB.不能
1 t/ q& }& M& j/ M8 g: g6 V& A0 s# M2 M, a  M$ ]
- ]% A. Y# [8 p0 E; Z5 [
12.概要分析器(profiler)是做什么的?: v9 `# W8 v  _0 D* N) S) ^8 a
# u8 A9 u6 w6 A! z
A.创建关于脚本结构的档案& I$ k5 r7 p4 x, q+ _
B.把脚本转化成UML图: Y7 V1 C5 U0 i, U
C.精确测算脚本不同部分的运行时间
; X0 l% p3 `7 |- ]2 aD.计算脚本通过web服务器执行时的维度1 p( K2 q1 n8 g: L  K/ \/ }& m
E.扫描脚本,识别由常见错误导致的bug
2 f, r% P3 \3 K7 o
5 W- {& G; u) f( M7 Q  O% [
) N2 V3 p' g8 Q4 s' M; o13.______能帮助识别和解决bug。
4 T! D1 A2 O5 U7 s* a, B8 H9 Z9 u: V) e/ G
答案:____________, u# \( S4 }3 _9 B
. v3 I* r9 a3 h6 o& {

" L+ t% Q9 S4 t  z4 O6 r14.trigger_error()和user_error()有什么区别?
6 _5 }& w' O0 a
0 J& G- t/ F' ~7 T5 jA.trigger_error()允许脚本抛出系统级的错误
; T8 i3 Z" B# SB.user_error()允许脚本抛出系统级的错误' B# i* F1 D5 |* ~9 |0 z& a
C.user_error()不能被用在错误管理器中
. |1 ~3 D7 ^3 I, a. H% b' u, g- DD.trigger_error只在PHP5中可用9 K( E0 O, M# V
E.没有区别  z/ X. v' }0 w2 e+ `5 o

: P; l8 p/ W. m& i
1 D& C9 _2 {; |+ x6 X! `' {- _15.______函数能返回脚本里任意行中调用的函数的名称。该函数同时还经常被用在调试中,用来判断错误是如何发生的。
$ d/ _7 f! _# L% A& I" }
- @% I% A$ B  D. D! C; U8 L) e% U" kA.print_r" A! }7 a  T) |/ }$ D: [- _
B.var_dump
( S* E+ ~5 e% Y' x* Z0 r8 R7 J7 @C.stack_dump
1 `# Q2 l$ f% V3 K; r  t/ @( wD.debug_backtrace4 Z7 y& {' C5 u( S, F4 u6 B' g
E.以上都不对2 w2 f: A% a( D# @2 k9 e2 \
) M' z/ a- o7 L5 A2 w3 K  I
答案1 N9 L2 c# N$ c' X3 I4 ?

7 p+ E) @) s0 Z. N2 {% F. \1.答案是E。三元操作符把每个if语句连到一起,作为&&操作的一部分。然而本题中,$x=1这个赋值只在第三个if为false时发生。如果第一个和第二个条件都不成立,$x=1就不会执行。这题对三元操作的应用有些极端,实际应用时,需要根据可读性来决定是否需要用三元运算符(本题这种情况就最好不要用)。1 C5 l2 L8 h6 l. U- Q

: Q! v& w; F- K2.问题是由第三方数据源传输缓慢导致的,而你无法控制这个数据源。你也许能在网络连通性上做些工作(假设问题出在你这一边)。还可以对接收到的内容进行缓存,这样能减少获取重复数据的时间。因此,答案是B和E。
4 H3 w; Y% J2 O  Y6 [6 O4 l  g$ O4 H  m9 E$ K+ X
3.正确的选择是B和D。如果关闭错误报告、使用@抑错符和关闭错误日志,那么在你交付给客户的网站出现问题时,你将很难进行分析和调试。
1 b  r* V7 w6 e$ q2 Q" \/ E% i. l; q% N4 D9 K! _: I
4.这是在描述===操作符。
* Z: {6 ?( X! f5 p% m/ @8 u: b
1 A- {) p# }2 f: G" C' Z' n5.正确答案是D。PHP脚本在执行时,将首先被解析成“中间”码(也叫opcode,操作码),然后解释器执行。操作码缓存出现在这两个步骤之间,对解析器的输出进行缓存。下次执行该脚本时,将缓存的输出直接送入解释器。这样就就不需要再解析一次了。& q: y5 i+ T7 N* R8 M- Q3 z1 O6 c

2 a' f: d8 V; J5 t( u% u) K# T6.正确答案是A和D。如果RAM太小,进程间将出现资源竞争,服务器将大量使用硬盘交换。同样的,如果允许过多进程同时执行,也会使服务器频繁进行交换,导致速度下降。
. e3 W! M# |' X: }% y4 c
/ o* `- s$ L! x7.正确答案是A和C。脚本不检验datebase_query()的调用是否成功,因此将持续执行下去,最终产生错误。此外,$my_id参数没有转义——可能导致代码注入(详见第11章)。+ L, {8 w$ }& o  S2 {: E4 b

% ?7 s. s) O" l& x0 v) y" }8.答案B和D正确。出现解析错误往往表示脚本中有语法错误,自定义的错误管理器无法捕捉到它们的原因很明显:错误管理器在脚本里,而现在无法解析脚本,管理器也就无法执行。类似的,E_ERROR表示有致命的运行错误出现,比如内存耗尽。因此脚本会立刻被中断,因为解释器无法执行后面的代码。
% j9 n% i& O0 y# v+ G: D' D7 R
( W1 h9 u# K5 k9.答案是C。比较操作是一个可交换的操作(就是说结果独立于操作数之外),而赋值不是。因此,比如说,$a==10和10==$a是等效的,而$a=10和10=$a却不是,而且后者会导致一个错误,因为这不是一个合法的操作。确保常量在操作符前面,能保证你不会错误得将比较变成赋值。: j, |8 h5 a# u% g- N

% n) ~* p) p/ m! g10.答案是C。error_log函数能将信息送往一个指定的地址。尽管mail()也可以用,但error_log能自动给邮件添加标题,因此这才是最简单的方法。
+ Q. e  n# t0 ~% m9 U; m2 J( d! I$ O5 c/ k
11.答案是不能。error_reporting函数能关闭所有运行时的错误报告,但对解析时的错误无效,因为解析错误发生在脚本执行之前。* z& }# S7 H0 Q
1 w9 Q  O$ C, D" F% W
12.显然,答案是C。概要分析器(profiler)能监视脚本的运行,并记录单个部分的运行时间。它可以用来找出和解决瓶颈。
$ j$ T: G, ]# t
' n- h3 H( x. [13.这是对调试器的完美定义!你可以用调试软件监视脚本运行,同时分析系统资源消耗,从而发现和解决程序缺陷。
- F# o! ?6 J( R' k; v7 W6 i2 x" O& w* \4 |( y8 t( P% I
14.trigger_error()和user_error()之间没有区别。后者其实是前者的别名。
7 ?$ r% Z  R8 W2 x3 h. u2 u8 R1 J. ?" _# ~) S9 p  X; w
15.答案是D。题目是在描述debug_backtrace函数,它返回一个由所有在代码的特定位置调用过的函数名组成的数组。

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