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

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

作为一个开发者,无论你经验多么丰富,或者无论你多么努力,你的程序中总会有bug。这是生命中一个必然的部分,如同死亡与缴税(尽管并没有后面两个那么严重)。
, u5 K0 v" p* @; P8 p要想解决bug,首先要能找到bug。事实上,许多开发者花费了无数小时茫然得盯着代码,只是因为他们没有把程序的容错能力摆在首位。忽略了这个部分,那么期望一个没有bug的程序就是——不可能的。9 Y* I! W" }  p2 D1 |1 B
本章测试题将考察你对调试和性能管理相关知识的了解,以及如何用PHP做好这两件事。+ e$ Z" [0 C% T* Z% w5 U
5 j/ A' s  H& z0 h8 w; E

$ D8 d" k/ ?. v! l3 x! G问题
- V. }$ D, V: a3 Y/ k. Q3 N" w3 e! D, H0 L- i
1.以下脚本如何用三元操作替代?
, t+ b, r1 l6 A  _

  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 ~. g* h/ c/ }
A.$x = ($a A. < 10 || $b > 11 || $c == 1 && $d != $c) ? 0 : 1;; N$ W* ^' `" i
B.$x = ($a < 10 || $b > 11 || ($c == 1 && $d != $c)) ? 0 : 1;1 F1 a+ t. t- o: P, T
C.$x = (($a < 10 && $b > 11) || ($c == 1 && $d != $c)) ? 0 : 1;% X, f8 l  n4 M& Y" _, e1 y0 w& d
D.$x = ($a < 10 && $b > 11 && $c == 1 && $d != $c) ? 1 : 0;
1 b+ T; Y+ m$ T7 a( y5 O( IE.以上都不对
. i' D' S1 [1 Y8 Y1 k, O, c4 k' K6 [
! E! ], ~$ g% |  z
2.有一个脚本由于要从远程获取数据,因而运行速度很慢,以下那种方法能对其进行优化?(双选)
' @5 n1 ]7 H# W) @( d# w& Z3 ^3 H4 s& C9 C2 h5 }% N! w
A.安装操作码缓存(opcode cache)7 j3 C5 |3 v$ {$ I7 j
B.优化或者升级你的网络连接: w3 c: \4 S% Y' V! [
C.添置更多的硬件1 y. l& @' b- b: v; `
D.增加服务器的可用RAM
  [4 z: b1 j- ?9 c2 G9 mE.使用连接缓存# F7 Y7 }2 q! w* e+ T- |
9 `6 i9 R$ c2 ^
6 F- I& q+ H# L4 o! H
3.架设生产环境下的服务器时,需要做哪些步骤?(双选)* O4 ]: W2 g2 c: H0 [- s& y
  Y6 o0 P& J9 N: M
A.关闭错误报告
1 K: _5 ?# U) d. v) u: _B.打开错误日志
$ E  ]9 R; c  w  p* s, j! ~! m! fC.关闭错误日志  o8 z1 Y% q, K+ S: G/ e
D.关闭错误显示
6 e- d, {* R9 [' K4 r) VE.使用@抑错符
7 b4 l' S! c* t, c
. W7 z: m8 n- j6 o9 D
7 j3 r! H% T4 p8 _" e, }7 Y4.______操作符能对操作数的数据类型进行严格的比较?, m# Q1 k' _/ _" q

/ Y/ @1 w! f) ?答案:____________! P/ w8 D* c2 a8 N7 E, q

$ `6 k2 i$ Z5 n# _+ K! u
) \/ ^' r% z" D  H! U* E5.操作码缓存(opcode cache)能做什么?1 g  a3 B. y" t
; e3 `+ a, U  E2 x
A.把脚本编译成二进制对象,使它运行得更快
3 F0 k0 ^) k2 [& n. _$ r" \B.代替Zend引擎加快解释器的运行
6 P: m5 E* G' L/ J, v% P/ b  s  [C.缓存脚本输出以提高执行效率
7 Q  U3 x/ T- [* Y  Z. D0 G* }D.缓存解析器产生的中间码,以提高运行效率
- [1 o4 h$ t& e" f, M* wE.在内存中缓存脚本,减少从硬盘中读取的次数
. y; N" P* U! [0 I7 s4 q6 ~# p; A/ e; {3 Q
& P& ^2 g; \7 c% T
6.以下哪些情况容易造成系统资源枯竭?(双选)
' A$ C8 W8 R2 l+ ?/ g  K  q: v
% u4 ~0 A' L; N" w, |: b* u+ qA.RAM太小2 S: m) y7 ~9 h
B.使用了低带宽的连接/ h+ f: c" v& w4 l5 A7 D, y) g+ Q
C.虚拟内存超过2GB5 }& i3 B# k0 R. c" ^( D
D.允许同时运行太多的服务器进程
: T* X4 _6 X: g9 x. RE.以上都不对$ z% {* y, n3 M5 E- F

. I2 G3 q1 q3 @, C8 X+ d3 s. X  [: B& y1 ]
7.以下脚本缺了些什么?(双选) - z: g+ n, p- f" B" J# J

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

& C# m" ?/ Z+ sA.参数出口(Parameter escapement). C. A/ {- Q+ n8 i- f
B.输出格式化
: p) _3 r! |! |C.错误检查) n/ ~$ E; q3 t2 E* \0 V! s
D.一个SQL查询
4 v, R2 b+ i% N; K: zE.以上都不对7 A) _5 \* E6 t  V2 H

; H$ Y3 o$ M! z8 m% o5 M
& `- U% n( w9 W1 J) k4 f( \8.以下那种错误类型无法被自定义的错误处理器捕捉到?(双选)
9 T+ X* R) M" _2 M
+ R1 |5 N8 b1 \7 v/ G" o7 g3 yA.E_WARNING/ N' o2 @: ]5 i) g
B.E_ERROR+ Y# j( b: P* ]- R( C; k
C.E_USER_ERROR& t7 x  h4 @8 v- A
D.E_PARSE2 {7 \  R" D, T- d# D) U
E.E_NOTICE
$ B/ }. a* M9 n1 N% M! x* r) ~
: w" v+ z4 s& {
, N- T6 k- [) t' L9.当需要比较一个常量和一个变量时,如何才能保证不会错弄成赋值?
; u8 M3 h" U+ Z5 C, S- y, ^; S0 R: H* S* ?4 V7 J
A.把变量转换成int
. ]* ?% A, ?5 }. s$ j/ B6 ?3 OB.使用全等比较符(===)
% X7 F9 m* r, \7 i; r# Z( H5 WC.确保常量是第一个操作数
9 Y; d' ?4 J5 Z& g; qD.使用三元运算符2 O7 H2 Z8 _1 d* V
E.用括号把操作包起来
( i5 h$ c1 i" a) U& d- u) \: S' Y0 K8 v# ~  B2 C
( Z3 p5 M0 f7 J& N9 z
10.要通过邮件给系统管理员发送错误信息,以下那种方法最简便?
& b# z4 U  q) O6 q) C8 k) Q' B5 }
0 I$ @+ E/ G' t: W: P. k; q! m& E. WA.创建一个连接远程SMTP服务器的函数
3 r6 a0 J- L9 {2 ?! V  m) ]B.使用mail函数
' R, h: L0 w1 `& A+ L7 t. F0 I" g. @C.使用error_log函数
3 ?( _! {" U# D) C0 d- L# HD.调用sendmial程序: k/ {- B. f3 Y$ y$ F
E.使用webservice/ x- g4 \/ w: f' P7 @: @) c
' C6 B& Z$ S& r. s

8 B9 ]  C( I1 y; e6 l11.能否仅调用一个函数就关闭脚本内所有的错误报告?
) O" {4 S8 C, E9 x/ u* A
' p4 @1 n$ s5 fA.能
" o; ~* B& }& B7 BB.不能6 U" T6 p/ a* T) p  W' H

5 s. q% ^7 A7 K; `- x; e
* d1 r. x/ R# q12.概要分析器(profiler)是做什么的?% x+ S1 ?; p  r* b- S% f5 H% N3 c
" {$ @' Y% e9 G- v& V/ \- ]5 L+ @5 A
A.创建关于脚本结构的档案; H, E+ `5 W; y2 }  `9 ]
B.把脚本转化成UML图( g  L: i' H: c
C.精确测算脚本不同部分的运行时间7 S& O5 R9 q6 x9 I6 v1 [5 D! [- M0 I
D.计算脚本通过web服务器执行时的维度
& b' O! Y; M! ?0 F) G8 C3 HE.扫描脚本,识别由常见错误导致的bug# {  D( u3 Q8 a

+ }& o" l# h. m  K6 v  v; P0 ?% \8 l
13.______能帮助识别和解决bug。
4 V3 C9 h/ I2 r3 I# D1 a, ]
. ?+ ?) C. M- M3 K1 ^6 d答案:____________5 o: I4 o4 Z7 J( \" l2 n9 Y

# B9 B; H/ h& S& l( t( h
$ J" z/ M# D# |7 w- T14.trigger_error()和user_error()有什么区别?8 ?9 T! K( o. O% G$ y
" t8 z6 ], o4 @. r; Z0 _* n
A.trigger_error()允许脚本抛出系统级的错误
& b& o- a. \0 a$ {2 j6 b/ H, H3 oB.user_error()允许脚本抛出系统级的错误' r, ~8 P2 f" b% d9 ]8 o& d
C.user_error()不能被用在错误管理器中
2 F& e, _6 ]* O4 yD.trigger_error只在PHP5中可用
* E4 D/ S1 e- zE.没有区别- I# y1 p+ P$ S2 h% A8 d) i8 Q

/ j& ]. R6 q) H, F
1 {$ M! Q8 t9 c- ~/ z15.______函数能返回脚本里任意行中调用的函数的名称。该函数同时还经常被用在调试中,用来判断错误是如何发生的。
8 p! Z4 f- b) c4 `+ S
. V% w3 e6 E( I; OA.print_r! j$ w: c7 c: t4 T7 N8 V' e
B.var_dump
8 \- t# m8 u5 h& tC.stack_dump' t% i* m* x; W9 k+ |
D.debug_backtrace" b9 E2 [' P+ e. c2 Z) r+ ~) T- h
E.以上都不对
+ S; v! G, N# C! D$ K, D. k' K6 K: p) y/ w/ ?7 t
答案
0 S9 O& J6 |7 _* [
: F! ^& p+ M- F: @1.答案是E。三元操作符把每个if语句连到一起,作为&&操作的一部分。然而本题中,$x=1这个赋值只在第三个if为false时发生。如果第一个和第二个条件都不成立,$x=1就不会执行。这题对三元操作的应用有些极端,实际应用时,需要根据可读性来决定是否需要用三元运算符(本题这种情况就最好不要用)。6 q( ~% w; Y, D2 |+ V* I

1 \* `, s  G9 s% r3 k* ?5 W( }2.问题是由第三方数据源传输缓慢导致的,而你无法控制这个数据源。你也许能在网络连通性上做些工作(假设问题出在你这一边)。还可以对接收到的内容进行缓存,这样能减少获取重复数据的时间。因此,答案是B和E。
  T* c; s# K7 U8 e) ?
0 N  D  j5 @( J2 e: R( W/ y3.正确的选择是B和D。如果关闭错误报告、使用@抑错符和关闭错误日志,那么在你交付给客户的网站出现问题时,你将很难进行分析和调试。
  ~; @. Z" M1 I1 D& ?
" z8 P1 k* m: P( M* ?4.这是在描述===操作符。6 x4 T$ ^6 W/ y& K7 }9 X* b

7 O5 `( X2 l, V. u, e* i6 p8 n0 T5.正确答案是D。PHP脚本在执行时,将首先被解析成“中间”码(也叫opcode,操作码),然后解释器执行。操作码缓存出现在这两个步骤之间,对解析器的输出进行缓存。下次执行该脚本时,将缓存的输出直接送入解释器。这样就就不需要再解析一次了。
6 D$ W* F" v' C' [9 g$ R! A/ L& c- e8 w* ~9 G3 L
6.正确答案是A和D。如果RAM太小,进程间将出现资源竞争,服务器将大量使用硬盘交换。同样的,如果允许过多进程同时执行,也会使服务器频繁进行交换,导致速度下降。
" X9 v+ J; Q5 [! V( I: b( T( \" N+ I- r- ]1 L
7.正确答案是A和C。脚本不检验datebase_query()的调用是否成功,因此将持续执行下去,最终产生错误。此外,$my_id参数没有转义——可能导致代码注入(详见第11章)。+ }. H; k$ I8 e0 \' n# r, A, V) m/ `
: V. g; ^8 ^* K3 Y
8.答案B和D正确。出现解析错误往往表示脚本中有语法错误,自定义的错误管理器无法捕捉到它们的原因很明显:错误管理器在脚本里,而现在无法解析脚本,管理器也就无法执行。类似的,E_ERROR表示有致命的运行错误出现,比如内存耗尽。因此脚本会立刻被中断,因为解释器无法执行后面的代码。
- F1 E' b9 }5 d* @
' R# L& y/ e5 {. |: m3 U# e9.答案是C。比较操作是一个可交换的操作(就是说结果独立于操作数之外),而赋值不是。因此,比如说,$a==10和10==$a是等效的,而$a=10和10=$a却不是,而且后者会导致一个错误,因为这不是一个合法的操作。确保常量在操作符前面,能保证你不会错误得将比较变成赋值。- F4 l* Y" ^. t/ X) s4 E

( j7 h* Q4 F2 i10.答案是C。error_log函数能将信息送往一个指定的地址。尽管mail()也可以用,但error_log能自动给邮件添加标题,因此这才是最简单的方法。) c! R5 ~0 G0 \6 X

, a9 o$ h# a0 O: `9 P. Y11.答案是不能。error_reporting函数能关闭所有运行时的错误报告,但对解析时的错误无效,因为解析错误发生在脚本执行之前。" [6 U& V0 Y( n( [& p

8 t; _; U- b# |5 V, e0 X$ o7 g12.显然,答案是C。概要分析器(profiler)能监视脚本的运行,并记录单个部分的运行时间。它可以用来找出和解决瓶颈。( M2 d3 F* n3 p) ~3 o
  i3 g7 k3 {) [# B' Y% U1 n/ H6 c
13.这是对调试器的完美定义!你可以用调试软件监视脚本运行,同时分析系统资源消耗,从而发现和解决程序缺陷。  B9 Z0 G! T8 ~/ |# \, L% ]. ~4 f2 B
. K2 p# U% U, d1 b6 F: \) y0 Z. M
14.trigger_error()和user_error()之间没有区别。后者其实是前者的别名。
/ o6 p! n# l4 J3 J$ J7 v1 t$ X8 n; O4 P$ @/ u8 ?* e% @" L! x
15.答案是D。题目是在描述debug_backtrace函数,它返回一个由所有在代码的特定位置调用过的函数名组成的数组。

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