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

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

作为一个开发者,无论你经验多么丰富,或者无论你多么努力,你的程序中总会有bug。这是生命中一个必然的部分,如同死亡与缴税(尽管并没有后面两个那么严重)。
9 b! |  _# m7 |要想解决bug,首先要能找到bug。事实上,许多开发者花费了无数小时茫然得盯着代码,只是因为他们没有把程序的容错能力摆在首位。忽略了这个部分,那么期望一个没有bug的程序就是——不可能的。
$ N7 G* u: w3 w# g' N! K& t. V本章测试题将考察你对调试和性能管理相关知识的了解,以及如何用PHP做好这两件事。) ~/ V. n9 j3 K1 F; k& H0 v
5 @2 u$ v6 o$ H( L; m* f  o
% ?% e4 h+ M( L0 D& y+ c. n% P
问题7 Y1 i$ X5 r) U$ b" O. U
/ V7 v# i; B8 I9 T' h0 N
1.以下脚本如何用三元操作替代? : v  _8 }0 Y0 Q  Q

  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. ?>
复制代码
/ e0 b; d/ W% G# m
A.$x = ($a A. < 10 || $b > 11 || $c == 1 && $d != $c) ? 0 : 1;" E. p, K0 f3 A* |
B.$x = ($a < 10 || $b > 11 || ($c == 1 && $d != $c)) ? 0 : 1;
, M# M' U6 R- s" O* O" IC.$x = (($a < 10 && $b > 11) || ($c == 1 && $d != $c)) ? 0 : 1;
) f/ f" `& n& Z  S, o9 l* K8 U% rD.$x = ($a < 10 && $b > 11 && $c == 1 && $d != $c) ? 1 : 0;
& ~6 u) b+ O3 u% Y* zE.以上都不对- s" n9 ^" V. H+ D" ]

9 j/ b+ v, R. G2 h5 a! }
1 C( i4 h: C: S6 s$ R& ^9 U: I, Q' d2.有一个脚本由于要从远程获取数据,因而运行速度很慢,以下那种方法能对其进行优化?(双选); W' b( ^! F& Y, U* w
6 g& w- U) T/ k; n9 M8 `. U( C" ]
A.安装操作码缓存(opcode cache)
/ l8 ]7 Q/ _, r( ?; k9 a' QB.优化或者升级你的网络连接
9 c- K2 z# y6 b. sC.添置更多的硬件" J0 {, |0 O/ ?1 w; K" i* ]
D.增加服务器的可用RAM! x# z7 v) _. i* J- f* z$ C
E.使用连接缓存+ w% @1 _9 W7 @) u

- X8 c; ^/ w9 W8 j# F+ u
/ v; u, J0 _0 U! i$ h+ u3.架设生产环境下的服务器时,需要做哪些步骤?(双选)7 a( \% H* M) s2 @  U  d

+ G# }* ~! y- S0 X  ~; ?9 YA.关闭错误报告
- U* Y5 X% a- S& a, UB.打开错误日志
7 L5 N' z; [' h- ]0 U( y& a' fC.关闭错误日志
+ y+ D: ?& f- z* D5 ]D.关闭错误显示6 D! K9 Q, m2 X0 ?1 N2 V
E.使用@抑错符. N" m% |6 s; m' D& M' I8 H
3 V. y/ e- C5 p8 ^
0 r2 A, Q  Q; M
4.______操作符能对操作数的数据类型进行严格的比较?
: g2 a' k" |: E/ N% U6 }
+ B9 q, ^" B4 z% m8 L# P% a" ]答案:____________
5 g6 d$ |5 Z' {1 U
4 J7 w% T$ o) h; j! S8 O# A" L  T4 r  `$ ?" ~! Y
5.操作码缓存(opcode cache)能做什么?
, U+ u: M+ |3 @' [* E+ c: F9 \( X7 I. U- X: O# U' ?7 }
A.把脚本编译成二进制对象,使它运行得更快
( v' C( J8 u* K+ ~, ]) @B.代替Zend引擎加快解释器的运行$ @7 |! z6 S% W. Y
C.缓存脚本输出以提高执行效率
2 H/ D4 z# f/ @0 I4 v! DD.缓存解析器产生的中间码,以提高运行效率
, }& Q3 n9 t0 eE.在内存中缓存脚本,减少从硬盘中读取的次数
6 w! A/ D9 T) g  i- Z/ e6 O9 O6 t
, `- {# ]* ~  T, t! g# w5 G5 g
6.以下哪些情况容易造成系统资源枯竭?(双选)9 y* Y: Z6 r: E" o
' q% A8 w! \1 G( ^8 r- W0 @
A.RAM太小
9 L7 x7 d3 J7 I% f; wB.使用了低带宽的连接
' @) P- q& L% c. W3 }C.虚拟内存超过2GB  [6 q8 X7 d/ v
D.允许同时运行太多的服务器进程
. x; Z# J/ Q% L+ O( oE.以上都不对& E' K2 @: c& f. o! B2 n8 V: e
" ]/ p' f7 x; c6 j
0 L# [7 h. n9 W
7.以下脚本缺了些什么?(双选)
" i1 O7 v5 h8 |4 W) q/ `; Y5 }+ ]

  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. ?>
复制代码
4 p& c. a7 z6 y9 i8 ]7 ^: C% `3 ]& k. J
A.参数出口(Parameter escapement)
6 G" J- [& O9 |8 |B.输出格式化! N& Z* t8 Q+ h# R
C.错误检查
* O. N# J* y% X6 q/ D: |D.一个SQL查询
  b0 z: F: g% xE.以上都不对% z# u; u: W6 f. _! A& z' n
+ m8 G5 g4 ?, t2 ^( S

+ B# c6 z3 {$ I4 _8.以下那种错误类型无法被自定义的错误处理器捕捉到?(双选)2 Y6 L% S4 e/ f( d
- E3 B# O7 ^+ B
A.E_WARNING
" h. b; X7 Y5 ^; q4 I+ X3 oB.E_ERROR6 [& U4 V9 l- W% i/ e
C.E_USER_ERROR
2 T& |2 ~4 T, P' L) W: t% pD.E_PARSE
# Z  N# v& d  y6 ]! D- HE.E_NOTICE
3 [1 s, D& j2 H$ F: h" B, s1 v* W4 c1 N! C2 }* W% K( k- s1 L
3 l, A' c0 I+ ]0 J3 N; C* e% ~
9.当需要比较一个常量和一个变量时,如何才能保证不会错弄成赋值?/ E- J$ ^/ h" C  U/ K1 @/ b
: G$ W! W3 W( U. |, P
A.把变量转换成int. c3 L/ N& n5 w8 E7 P
B.使用全等比较符(===)
/ F- j! u, l4 B1 mC.确保常量是第一个操作数+ O; L/ ~: a1 O# h
D.使用三元运算符& S# d1 B% ]3 \& A0 a5 c& F
E.用括号把操作包起来: d7 E; s  y* _! O9 D4 d
& d0 p, A( c: m
; X+ A' e( A, w  r- Y7 \9 a
10.要通过邮件给系统管理员发送错误信息,以下那种方法最简便?
  u6 S% g% l9 E0 c5 `7 ]  }. u: v
/ l0 ?! ?! O; jA.创建一个连接远程SMTP服务器的函数
+ U, i" ?' K: d( B1 A$ z# V% z2 A& SB.使用mail函数
1 ~4 B1 S* [! x1 D$ j6 ]* z4 }C.使用error_log函数8 X6 j+ }! F$ S1 C- D
D.调用sendmial程序% N/ o3 T! t& T
E.使用webservice
* i1 }& `) [  A! H" Z. I) ]5 ~/ Y' w8 z) X0 o: F: [
3 A4 e) w8 K/ I4 Z7 C$ E3 F
11.能否仅调用一个函数就关闭脚本内所有的错误报告?
6 _; e; ~# w! Y  f
' q3 _* x1 d* B/ B4 t! e+ @/ pA.能* ^; z9 H# M0 N1 g: o
B.不能
' h( h3 f& r- |# B$ u* E; x- ?' |1 b. c' c* E

% g  h4 h) e1 a+ n12.概要分析器(profiler)是做什么的?/ i" K6 A& I6 |/ K; x7 I
; G" i  z, m8 C: Y* \
A.创建关于脚本结构的档案6 N- l. |) D% n
B.把脚本转化成UML图
! R0 k) i% U9 X9 `; s0 ^C.精确测算脚本不同部分的运行时间
2 G# F8 n  B* ?/ [D.计算脚本通过web服务器执行时的维度- }; Z  \" Q$ x4 G9 y
E.扫描脚本,识别由常见错误导致的bug
. \* Y4 A6 @! P6 K( G. J2 I* \: g# j" _& n  X; Y4 S/ b

4 `% `( a/ q6 Q2 d3 Z' O4 p1 ]13.______能帮助识别和解决bug。
6 m( E6 ~( G3 }* U' `2 e# A# ^) P- {7 e
答案:____________0 E6 r/ u4 k/ |6 Y+ H( o

( O. _6 x5 m4 F/ H8 o& F6 d( ^0 ~  r! c' j
14.trigger_error()和user_error()有什么区别?
9 E8 E, M8 \! f& T# X$ m2 v8 P' B8 p$ }
A.trigger_error()允许脚本抛出系统级的错误
! y0 n! K( ^9 K+ w0 iB.user_error()允许脚本抛出系统级的错误- y- _6 K' C% @* _, r" ?
C.user_error()不能被用在错误管理器中: L% `3 n: k! u2 \& r3 n) X0 _7 H
D.trigger_error只在PHP5中可用- J. C6 w. V% h$ s0 k
E.没有区别
5 G9 |& v6 ^* q
0 f3 s; _  R! i5 D' w  U$ g4 D: p8 H& e( I- G1 S% }/ t
15.______函数能返回脚本里任意行中调用的函数的名称。该函数同时还经常被用在调试中,用来判断错误是如何发生的。
# {# t0 v/ n0 f, a( C! J& N4 N/ @: K: k, B
2 C+ t* c! K& ?A.print_r
( _9 j6 D6 R/ f0 ]( R4 \8 _. k% H# PB.var_dump
8 a* e8 \- A% L, U  x* N/ fC.stack_dump
# s4 ]2 O9 v( k# GD.debug_backtrace4 f( N8 C* ^2 M! @  `$ x
E.以上都不对
3 U$ l7 Y9 F+ q
( U) Q* U) f& B% i! \8 ^4 V答案9 y* |  a' ?" ?! w! ~9 z$ {8 ~# Y) b1 D
$ L" x) a: m+ i' C% K! L  Y
1.答案是E。三元操作符把每个if语句连到一起,作为&&操作的一部分。然而本题中,$x=1这个赋值只在第三个if为false时发生。如果第一个和第二个条件都不成立,$x=1就不会执行。这题对三元操作的应用有些极端,实际应用时,需要根据可读性来决定是否需要用三元运算符(本题这种情况就最好不要用)。
! T2 ?2 g$ s. Z' i( q$ n/ d4 `
$ p. a: v; o& w* P% O. M$ |, h& V0 i2.问题是由第三方数据源传输缓慢导致的,而你无法控制这个数据源。你也许能在网络连通性上做些工作(假设问题出在你这一边)。还可以对接收到的内容进行缓存,这样能减少获取重复数据的时间。因此,答案是B和E。7 D5 q) g/ L/ }. Z- Z/ c
3 g1 C9 l" ~6 m" S
3.正确的选择是B和D。如果关闭错误报告、使用@抑错符和关闭错误日志,那么在你交付给客户的网站出现问题时,你将很难进行分析和调试。- o& l3 {7 g& Z1 k

) L9 `  S. [$ e& t. }4.这是在描述===操作符。
# P5 \: ^; T0 s. ~; s" w' n2 }- m/ W$ m5 j3 n: `* {  ?
5.正确答案是D。PHP脚本在执行时,将首先被解析成“中间”码(也叫opcode,操作码),然后解释器执行。操作码缓存出现在这两个步骤之间,对解析器的输出进行缓存。下次执行该脚本时,将缓存的输出直接送入解释器。这样就就不需要再解析一次了。
7 a# c) x" z1 n7 C
  q5 k4 [6 G" Y) b6 l$ c0 p6.正确答案是A和D。如果RAM太小,进程间将出现资源竞争,服务器将大量使用硬盘交换。同样的,如果允许过多进程同时执行,也会使服务器频繁进行交换,导致速度下降。
% Z  B( {7 m: ^9 z/ c; r
! j9 g, c' s2 x( P9 c3 e7.正确答案是A和C。脚本不检验datebase_query()的调用是否成功,因此将持续执行下去,最终产生错误。此外,$my_id参数没有转义——可能导致代码注入(详见第11章)。3 i9 {. z8 T4 m& h7 i0 S
  Q% k/ @. d$ O$ h8 a5 a# ]1 [6 q
8.答案B和D正确。出现解析错误往往表示脚本中有语法错误,自定义的错误管理器无法捕捉到它们的原因很明显:错误管理器在脚本里,而现在无法解析脚本,管理器也就无法执行。类似的,E_ERROR表示有致命的运行错误出现,比如内存耗尽。因此脚本会立刻被中断,因为解释器无法执行后面的代码。0 b8 W$ p# b1 \) Y
3 a* I# m; `, x* q* T- [1 ?0 @
9.答案是C。比较操作是一个可交换的操作(就是说结果独立于操作数之外),而赋值不是。因此,比如说,$a==10和10==$a是等效的,而$a=10和10=$a却不是,而且后者会导致一个错误,因为这不是一个合法的操作。确保常量在操作符前面,能保证你不会错误得将比较变成赋值。9 @' d' g' c9 G9 v. C
; m6 ?5 `( W: I' j  a0 y
10.答案是C。error_log函数能将信息送往一个指定的地址。尽管mail()也可以用,但error_log能自动给邮件添加标题,因此这才是最简单的方法。* z! I' y  Q0 e2 P7 s# [
1 B" e' I( B/ V( R. J
11.答案是不能。error_reporting函数能关闭所有运行时的错误报告,但对解析时的错误无效,因为解析错误发生在脚本执行之前。" p" ]0 [$ A5 _7 w

9 e7 `7 n4 m- A& c6 Z/ o9 L12.显然,答案是C。概要分析器(profiler)能监视脚本的运行,并记录单个部分的运行时间。它可以用来找出和解决瓶颈。
  ~/ [8 O2 @% j4 \* F6 L
! ?7 T- n9 Z5 \+ \. B9 n4 G( U- ?13.这是对调试器的完美定义!你可以用调试软件监视脚本运行,同时分析系统资源消耗,从而发现和解决程序缺陷。4 v, g1 g; S. ?5 [8 w/ \4 K

2 ?( t: y4 X$ a& ?14.trigger_error()和user_error()之间没有区别。后者其实是前者的别名。
& b! P) ~  M2 E# g6 g' B5 K- ]0 z" x& ]8 x: K. L' ]" Y( ]
15.答案是D。题目是在描述debug_backtrace函数,它返回一个由所有在代码的特定位置调用过的函数名组成的数组。

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