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

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

作为一个开发者,无论你经验多么丰富,或者无论你多么努力,你的程序中总会有bug。这是生命中一个必然的部分,如同死亡与缴税(尽管并没有后面两个那么严重)。' }) m5 O( g" S! H8 j. d3 S$ z0 r
要想解决bug,首先要能找到bug。事实上,许多开发者花费了无数小时茫然得盯着代码,只是因为他们没有把程序的容错能力摆在首位。忽略了这个部分,那么期望一个没有bug的程序就是——不可能的。
. @7 O7 ^0 X5 y/ }8 U本章测试题将考察你对调试和性能管理相关知识的了解,以及如何用PHP做好这两件事。: R1 {6 Z/ r/ M6 E) H9 \  W' k

7 g! C0 _% c: f! y& U1 T2 d2 m; i. t7 \8 b/ _9 B2 A/ U. C
问题$ K7 _9 l& n5 J$ O, d

& J. U6 V# E0 \, I) ]- W; b- d1.以下脚本如何用三元操作替代? ) f: r* _! [" u

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

  b4 B. O( o3 z5 }A.$x = ($a A. < 10 || $b > 11 || $c == 1 && $d != $c) ? 0 : 1;
! I7 O+ P( }9 n6 H, ]1 ]/ UB.$x = ($a < 10 || $b > 11 || ($c == 1 && $d != $c)) ? 0 : 1;1 E4 n) Q5 e% S5 x4 j( Q6 R6 z7 y' }
C.$x = (($a < 10 && $b > 11) || ($c == 1 && $d != $c)) ? 0 : 1;
7 B" O# [9 o! h7 h4 PD.$x = ($a < 10 && $b > 11 && $c == 1 && $d != $c) ? 1 : 0;
( p: |$ [' [5 `, p% ?1 I$ W/ w0 cE.以上都不对
$ f- M9 I/ A+ x1 e8 c1 I' C: n2 Q; |" X- C1 ]" U

( p3 ]. v# w) a  C& W6 j2 o: v) a2.有一个脚本由于要从远程获取数据,因而运行速度很慢,以下那种方法能对其进行优化?(双选)) X  g- Q4 z# H" g2 t

, {5 ?, x: e  [A.安装操作码缓存(opcode cache)
) D& h+ X. T5 [& @  H4 `B.优化或者升级你的网络连接. Q0 e) j( X0 o# j! Q
C.添置更多的硬件) G1 W; D9 ]: B! [2 ^9 Y! c
D.增加服务器的可用RAM
) B7 s6 j5 ^( L8 D% a) wE.使用连接缓存
$ P- D% `% m6 f* f& d) }( g
. M; I* k; f; g% y$ V6 F5 A
2 I$ C) Q# Q9 I" l0 o. x3.架设生产环境下的服务器时,需要做哪些步骤?(双选)& k' p( d. r! d8 \2 J: D! ~
6 W+ G. A! q: e( K5 r! m
A.关闭错误报告3 y3 D: F0 o6 w. A! \
B.打开错误日志; U) p( M2 s/ U% I
C.关闭错误日志
  }4 K% X; R: R# z+ Z- tD.关闭错误显示$ ]/ {* l) [2 v8 E% i
E.使用@抑错符
+ J4 x5 O0 r# c. W. g# |7 h& L0 x: R0 _* Q
4 o  f" w6 ]3 W8 S' s6 M! v
4.______操作符能对操作数的数据类型进行严格的比较?
0 d0 g8 A% ?6 K# i. m" S$ [0 ]* e% e6 f0 O. W" C
答案:____________+ \9 e+ i* F1 r" y: C- c4 j
6 Z0 N+ f; W3 |3 I7 {1 J
2 I6 s4 @( ~# _. A" b
5.操作码缓存(opcode cache)能做什么?
  n4 _4 u( t1 D( P) S4 N
0 l5 l$ F  z6 K/ C1 JA.把脚本编译成二进制对象,使它运行得更快
3 _1 m! I' I) I2 k: }1 {4 w3 Z" sB.代替Zend引擎加快解释器的运行
- z( u4 t# x8 g, T) a+ V! jC.缓存脚本输出以提高执行效率( v# c( ]" j0 L  g
D.缓存解析器产生的中间码,以提高运行效率" f6 N( j& ]- _/ R! P9 |
E.在内存中缓存脚本,减少从硬盘中读取的次数+ n$ S/ i3 F% o+ z2 S
/ D; x# w8 `  `. \8 s
: f( a  b$ a( U: x
6.以下哪些情况容易造成系统资源枯竭?(双选)
( R( W: x: Z4 O( H1 F0 n
0 M8 k) F" K  [* P% n/ I, h+ S' SA.RAM太小
, v+ T7 ~: F3 W0 j; GB.使用了低带宽的连接: U9 i  p5 M1 `
C.虚拟内存超过2GB
1 D8 w' E/ H- ^- g/ ]! v7 WD.允许同时运行太多的服务器进程) G! h6 c* z( W- `) v/ G; |
E.以上都不对" O0 D6 [! K1 C# Z9 I0 ~. x
. Y1 l6 ?, E6 U( i
2 _0 m4 o0 [. ~- K. }) [- T0 O: E
7.以下脚本缺了些什么?(双选) - [9 L5 }4 X' ^7 q: l

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

' i9 O$ V6 o3 w/ YA.参数出口(Parameter escapement), ]3 ~8 M. y) G7 \( g* N* d
B.输出格式化, a9 |7 D3 C1 o4 c
C.错误检查
% n- Z7 H; e8 n( X( r) {D.一个SQL查询
6 y; a" f# f' p* A# xE.以上都不对
% A% w  V& `1 C+ N) d: n
3 ?4 I- r" L! T& [8 Z; I/ F, S
$ T) k3 g8 z' \0 u' Z$ K) ~! D8.以下那种错误类型无法被自定义的错误处理器捕捉到?(双选)
) h+ f9 E) u2 Z0 n4 |! e; O; w
" a0 X/ I, I& Q; o2 R# H6 zA.E_WARNING
$ B0 X$ j4 i9 x+ i1 JB.E_ERROR  {) p  e' X+ ?& U; z$ O9 l& M
C.E_USER_ERROR
" g9 O2 s1 u. r6 v& f7 c9 WD.E_PARSE" d, m2 J9 G" M4 g
E.E_NOTICE+ ]) A; k  h8 T

- \  `& q5 d9 V" G% ?, U
8 b& Z! E- B7 b6 @/ L& ^4 B/ ~9.当需要比较一个常量和一个变量时,如何才能保证不会错弄成赋值?7 ?/ Z1 c2 v* f* }# Y

/ ?- W: b( z1 G& t) aA.把变量转换成int
9 R5 }- ?9 c5 A3 r5 e" e4 z4 }B.使用全等比较符(===)% z2 D4 n7 N9 ^* }
C.确保常量是第一个操作数/ `8 {# N2 B* K3 l! p
D.使用三元运算符
% i  W" E0 v* w& A( pE.用括号把操作包起来
9 P& ^. G6 r# T9 G
5 Z8 I! ?0 X6 U& \: B4 g2 I5 y" u: Z4 j8 U, g' K
10.要通过邮件给系统管理员发送错误信息,以下那种方法最简便?5 F5 M; }$ `7 M0 M5 t" p/ p: d

) j" ]3 \' Z8 |" s9 T4 C. uA.创建一个连接远程SMTP服务器的函数' P6 s% Q# m: [, v- a
B.使用mail函数! u: N. k& l! X7 N  O
C.使用error_log函数
, |% `& z7 K# g: m+ E5 BD.调用sendmial程序/ J* d# e" |! ~% x- K' e. I
E.使用webservice
6 L/ h7 u& @2 B5 i$ ^  B7 m2 p7 |" \
7 l/ ?6 I# A( E0 u1 s1 W
: a" v: i( H) P, u* U11.能否仅调用一个函数就关闭脚本内所有的错误报告?
: |. @# E4 s  P% I
  w! y) F* v5 U3 h/ r, @0 C8 KA.能
" u* g6 V9 z" f. Z- WB.不能2 }) b5 V$ R" J2 W  c' _3 r

( X: M) V5 c3 V# c! g
/ v$ Y+ p5 z$ y' N. W# i5 h12.概要分析器(profiler)是做什么的?
* Y' {6 W% T, ?) [, D/ T# D9 P% w% h* H! f
A.创建关于脚本结构的档案* h+ e& ^7 l, B9 p9 K
B.把脚本转化成UML图8 X+ j& _% |$ F4 c$ K% l$ f& J
C.精确测算脚本不同部分的运行时间
9 @' m/ _+ Q  A- D. mD.计算脚本通过web服务器执行时的维度; l# |4 e( Q; B4 H
E.扫描脚本,识别由常见错误导致的bug& v& m, j) {# E+ H# }/ a9 h

1 B/ D) f  E0 @! |( ?) Z9 h2 ?
+ P5 B. d- q' Y$ B13.______能帮助识别和解决bug。  `! Z6 y/ w  F" o5 y6 x
+ T3 w# B0 Y: e! [" V
答案:____________' C  k: E$ _6 Z( n) K4 x
( J6 L7 m7 \5 \" B. E

/ x$ Q6 Z- J8 e( H; \2 Q14.trigger_error()和user_error()有什么区别?
* z0 J# G/ l+ B+ o0 B3 v
4 Z3 A! o, b( n* T% ^% w6 C* Z; @A.trigger_error()允许脚本抛出系统级的错误3 ?7 \9 T) @. }6 H# }6 @
B.user_error()允许脚本抛出系统级的错误0 _6 c5 D4 ^1 z! M: d" k" X
C.user_error()不能被用在错误管理器中4 `1 }/ A2 k) n/ s( h
D.trigger_error只在PHP5中可用
5 E. c3 ], I) L& LE.没有区别& l. U. T6 A! Z5 p* x

! X8 F6 ]# P" D! r0 y
* K8 o" F$ w' E% w" S. U+ s15.______函数能返回脚本里任意行中调用的函数的名称。该函数同时还经常被用在调试中,用来判断错误是如何发生的。
' ]. ]- r4 A; K7 I5 D+ m0 |+ z4 P* b& K* y. z
A.print_r
+ r" K8 o3 i, z* v1 @1 `6 cB.var_dump
9 I; y4 ~' v% y6 l- ?C.stack_dump
5 ~! n8 K3 U% k5 vD.debug_backtrace
! D' X2 l  y* d# U+ _0 X# _E.以上都不对
1 O& G1 O2 ], X$ L+ P) {
0 b( Y9 r$ Q' J  U* j( C5 a' L答案/ [8 Z2 |5 A- ?, `" J& m

" n  n& I  n: \/ H4 w! \( I9 A1.答案是E。三元操作符把每个if语句连到一起,作为&&操作的一部分。然而本题中,$x=1这个赋值只在第三个if为false时发生。如果第一个和第二个条件都不成立,$x=1就不会执行。这题对三元操作的应用有些极端,实际应用时,需要根据可读性来决定是否需要用三元运算符(本题这种情况就最好不要用)。& U# A6 x7 K* L$ u' g& i
4 s* u. S1 |) g# ?1 X
2.问题是由第三方数据源传输缓慢导致的,而你无法控制这个数据源。你也许能在网络连通性上做些工作(假设问题出在你这一边)。还可以对接收到的内容进行缓存,这样能减少获取重复数据的时间。因此,答案是B和E。
; T9 D- E* k" ~" Z8 z4 y7 v& P. b" r" y, }2 x0 ~2 {
3.正确的选择是B和D。如果关闭错误报告、使用@抑错符和关闭错误日志,那么在你交付给客户的网站出现问题时,你将很难进行分析和调试。" P  ~# S) y6 ^! A( a2 J  h, o1 t

/ O3 A, W6 s# i) Y4.这是在描述===操作符。1 t9 @1 _0 e3 I9 U! S8 F0 ?

5 `5 Q' s$ h9 \; z- y7 Z* D9 D5.正确答案是D。PHP脚本在执行时,将首先被解析成“中间”码(也叫opcode,操作码),然后解释器执行。操作码缓存出现在这两个步骤之间,对解析器的输出进行缓存。下次执行该脚本时,将缓存的输出直接送入解释器。这样就就不需要再解析一次了。1 q7 `. m- K- `, |6 n7 X

! u, x. o+ @' l6.正确答案是A和D。如果RAM太小,进程间将出现资源竞争,服务器将大量使用硬盘交换。同样的,如果允许过多进程同时执行,也会使服务器频繁进行交换,导致速度下降。' Z+ b% e& a2 N6 H/ N3 _
& D* Z' r% P9 I
7.正确答案是A和C。脚本不检验datebase_query()的调用是否成功,因此将持续执行下去,最终产生错误。此外,$my_id参数没有转义——可能导致代码注入(详见第11章)。
! M; D& \) ]1 a: i
5 Q9 E; Q$ T) ?+ |  x* {8.答案B和D正确。出现解析错误往往表示脚本中有语法错误,自定义的错误管理器无法捕捉到它们的原因很明显:错误管理器在脚本里,而现在无法解析脚本,管理器也就无法执行。类似的,E_ERROR表示有致命的运行错误出现,比如内存耗尽。因此脚本会立刻被中断,因为解释器无法执行后面的代码。
0 ^' n. h( O4 G0 t: _8 |  k. H$ H! E! w# U. z; `$ H, V' M6 b
9.答案是C。比较操作是一个可交换的操作(就是说结果独立于操作数之外),而赋值不是。因此,比如说,$a==10和10==$a是等效的,而$a=10和10=$a却不是,而且后者会导致一个错误,因为这不是一个合法的操作。确保常量在操作符前面,能保证你不会错误得将比较变成赋值。
% d" j6 \& |" M# E) G; u/ k3 \2 ^/ B  {6 p0 K0 l  J+ o
10.答案是C。error_log函数能将信息送往一个指定的地址。尽管mail()也可以用,但error_log能自动给邮件添加标题,因此这才是最简单的方法。( v4 z' G! X4 ^5 S, d% z$ ~" \

+ T: T1 B& z+ C* D9 F11.答案是不能。error_reporting函数能关闭所有运行时的错误报告,但对解析时的错误无效,因为解析错误发生在脚本执行之前。
7 [8 Z& {8 m3 ~4 j8 O! M, Q  H
5 P* C7 W0 X7 Y/ I7 q12.显然,答案是C。概要分析器(profiler)能监视脚本的运行,并记录单个部分的运行时间。它可以用来找出和解决瓶颈。
2 O. n! R4 ~6 ^: C: |: |
$ ^- A% S1 W/ q3 J13.这是对调试器的完美定义!你可以用调试软件监视脚本运行,同时分析系统资源消耗,从而发现和解决程序缺陷。+ M9 g6 a- U" j% H/ F2 J
# x* P7 A/ P1 B3 A
14.trigger_error()和user_error()之间没有区别。后者其实是前者的别名。3 s5 @' ^3 o0 b8 d7 X% T$ ]# Y& l
+ U; c& W. n0 M3 z+ [. c( Z
15.答案是D。题目是在描述debug_backtrace函数,它返回一个由所有在代码的特定位置调用过的函数名组成的数组。

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