返回列表 发帖

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

作为一个开发者,无论你经验多么丰富,或者无论你多么努力,你的程序中总会有bug。这是生命中一个必然的部分,如同死亡与缴税(尽管并没有后面两个那么严重)。
6 e0 N1 Z8 x) j9 T要想解决bug,首先要能找到bug。事实上,许多开发者花费了无数小时茫然得盯着代码,只是因为他们没有把程序的容错能力摆在首位。忽略了这个部分,那么期望一个没有bug的程序就是——不可能的。
+ `& g* W7 o) Q5 m2 ~本章测试题将考察你对调试和性能管理相关知识的了解,以及如何用PHP做好这两件事。3 w; O% y3 d) ^1 f& K! U

7 ]* ]" E' q; j! E% i5 ?
( v& ~# q! \( h- _, h' K5 F问题
& Y" g! \, k( t& x
3 T- y: h( C. y1.以下脚本如何用三元操作替代?
2 O, ~3 {. [( ], X# `9 \

  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. ?>
复制代码
5 l& n  ^% R) o; c! ~0 t1 v( t
A.$x = ($a A. < 10 || $b > 11 || $c == 1 && $d != $c) ? 0 : 1;( j8 f8 \: r4 v# K4 p2 g0 ^
B.$x = ($a < 10 || $b > 11 || ($c == 1 && $d != $c)) ? 0 : 1;
# ~: r3 ]  v; V! ]9 uC.$x = (($a < 10 && $b > 11) || ($c == 1 && $d != $c)) ? 0 : 1;
' T) s$ u8 O# Z3 \, i7 m6 l. UD.$x = ($a < 10 && $b > 11 && $c == 1 && $d != $c) ? 1 : 0;! D" P! h- L/ J  p9 p
E.以上都不对
5 w+ g5 T5 A4 G( y- n
" q2 E! X4 m( u* R$ {% }  a3 [/ w) b
2.有一个脚本由于要从远程获取数据,因而运行速度很慢,以下那种方法能对其进行优化?(双选)8 ^& T8 p6 G6 l! j' z7 x: w
( y: j; D7 Z& q* {, N  K. `8 e
A.安装操作码缓存(opcode cache)
$ H  }: S+ ~' w; yB.优化或者升级你的网络连接2 B5 _% y: `' O8 |6 ^
C.添置更多的硬件! `1 I% a5 z1 m% W, L
D.增加服务器的可用RAM
7 \& a% ~  `, @: _. _, ]0 qE.使用连接缓存  |# \) e8 l" L. c
  w) U7 ?0 q# n' F8 R5 C- i

, l( a# c8 f; a! G3.架设生产环境下的服务器时,需要做哪些步骤?(双选)6 b( a# m: U4 f" g5 k5 e0 `8 m
5 T& `1 ], L# s7 j! P  j( }
A.关闭错误报告8 e: F/ V4 G& p( a) e7 J% L2 `% ?  T
B.打开错误日志: P/ ]) L+ K9 V9 e8 v  z- y
C.关闭错误日志
! T: O! D9 R. d+ C& y4 k0 J( \D.关闭错误显示) t  t1 ?' y" X0 f! [4 @/ b
E.使用@抑错符
; o* w4 f. t5 j6 j4 ~( Y, W
- F, X! B: l1 \* {
0 D: W7 j8 A: n4 H3 D1 ]4 I4.______操作符能对操作数的数据类型进行严格的比较?
+ P0 `% y4 L! ^
1 U% Q$ Z7 F5 m4 U答案:____________
# B4 H# l  G5 H8 j! y
- ?; J' h# G7 h' m. A8 l) o& |: F" o# o2 I& t5 q
5.操作码缓存(opcode cache)能做什么?& L; P( I: j/ y9 Q
& j) O$ W3 ~+ w
A.把脚本编译成二进制对象,使它运行得更快
' ]# t8 ?- N% lB.代替Zend引擎加快解释器的运行; Z# K2 [. i: f  z* l
C.缓存脚本输出以提高执行效率" y9 B9 s6 g: [' L' ^$ E. B
D.缓存解析器产生的中间码,以提高运行效率. v  t; u0 n; O3 L
E.在内存中缓存脚本,减少从硬盘中读取的次数4 d* p! b) l6 E' ^+ D
9 H; _* @+ @& P9 a; [5 n

- J1 t5 [$ p# |6.以下哪些情况容易造成系统资源枯竭?(双选)
2 T( J, u. f' v2 y/ T
2 X8 x2 w! {. K6 A* WA.RAM太小
* e" M, g( T8 {1 l% p8 b9 nB.使用了低带宽的连接
* M( B4 y' M; w0 b" u+ Q4 xC.虚拟内存超过2GB" g3 [4 t4 G& O" o1 h9 y
D.允许同时运行太多的服务器进程
$ K( {; g/ [$ A9 y9 ]2 Q" h( @  yE.以上都不对. e, W% E) F2 c2 V
& g5 R* O6 L& Q8 J, O6 p
2 L: s1 \& Z5 x/ w# o
7.以下脚本缺了些什么?(双选)
4 `; X. z% c  G3 X: e% M

  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. ?>
复制代码
& J! n8 w, ~' B" E$ Y1 U) ^
A.参数出口(Parameter escapement)- B: F7 x: }8 W5 I; u
B.输出格式化
) _0 K9 H6 {  _- f! W, I5 x3 B$ |, }C.错误检查6 _. s; `( o$ O9 B$ l! z
D.一个SQL查询
/ j% e- V% S" K+ DE.以上都不对
$ s1 M$ q) J$ l' R, F9 f
4 l; D4 m* b4 W! r9 A
+ s$ F# p, G! H6 Q/ r# r: }8.以下那种错误类型无法被自定义的错误处理器捕捉到?(双选)
+ K* U3 R4 e  ~5 E! d/ V' g3 D/ t* {! V) A" m
A.E_WARNING
" g. i. x" @. k) l5 hB.E_ERROR
. G$ F  r" }8 o6 ?9 ]% ~C.E_USER_ERROR
* @; J1 v9 D- _5 v+ X- eD.E_PARSE) ~- @9 ~1 `' F. X4 g
E.E_NOTICE
8 P, ]; \) ]1 S9 k5 @( v0 o- D' g5 k: v( |5 M# j/ H6 W$ a/ N, N
( ?+ V. N3 [4 k
9.当需要比较一个常量和一个变量时,如何才能保证不会错弄成赋值?: k4 n2 }! c. T. N6 f
0 ~" n& {# `1 ~+ R2 l
A.把变量转换成int4 T# ^: M. @$ I) R
B.使用全等比较符(===)& t6 I: L5 Y# x; E! v1 R
C.确保常量是第一个操作数7 _! P4 |* ?& ]1 Q
D.使用三元运算符, U  @9 i; D6 [/ z/ I
E.用括号把操作包起来
- h4 U: C" H2 G5 A
9 r: Z7 ^2 y" V% s
- s: g" P" p7 ?* ]7 g% g3 @10.要通过邮件给系统管理员发送错误信息,以下那种方法最简便?, ]5 ?+ W6 C( i1 U
, }6 ]% Q- _; b) K
A.创建一个连接远程SMTP服务器的函数7 p: e5 f% W& t( a
B.使用mail函数
$ N) R. Y6 v( l, ?! w; qC.使用error_log函数
' K; s% q( ^( @7 m" c0 AD.调用sendmial程序
, f5 h, |9 f0 v% F0 hE.使用webservice
* z, D7 v( h3 N9 k% p% \7 B- W4 m3 W
3 ^) l. j7 a6 f/ ^+ {) ^( l4 I" g, R' Y" [$ w
11.能否仅调用一个函数就关闭脚本内所有的错误报告?2 V! L# }% l$ Z% _& s/ U

  ~7 \1 p* T4 W8 iA.能0 J/ ^- i  }* @  g
B.不能. s) H9 Q% L. P% d7 k  b2 n
4 h, a6 f/ _  k8 M# _, X

7 n- T6 |1 X5 g- c5 x) ?4 a( Y12.概要分析器(profiler)是做什么的?
) q" ?  b$ e- Y0 v2 g. ]' _. `8 G1 A3 H) s
A.创建关于脚本结构的档案
# ~7 m5 p* m# Y! H+ D6 Z+ pB.把脚本转化成UML图" k3 K# w( o8 q- M5 }/ r
C.精确测算脚本不同部分的运行时间
3 r3 ^- n; i' k! HD.计算脚本通过web服务器执行时的维度7 K- ]' M5 B1 k; V
E.扫描脚本,识别由常见错误导致的bug9 C  s+ ]) z0 y. x% i# \4 d# A

& W$ }3 C/ c. ?$ B
, B2 g" e0 K! A5 R! z& b6 X( @- n13.______能帮助识别和解决bug。& \" u1 f8 ^, {' G# i

; w9 h5 _; U7 j* r答案:____________+ X( H. P3 j  A; ]- ^4 u" Q3 v

5 F1 \% G2 o  U* y3 u- ?% h, b6 W7 Z: z. k1 \5 Z
14.trigger_error()和user_error()有什么区别?7 L' b# n5 [- E) l8 y5 C+ ^4 W

" {2 O# a" v. C5 z% @/ ~) k( LA.trigger_error()允许脚本抛出系统级的错误
( Z3 Q1 k! S0 O! K: B1 \B.user_error()允许脚本抛出系统级的错误
5 c; l+ G8 F: x3 u9 c; ?C.user_error()不能被用在错误管理器中
1 T) b+ w& [* s/ ?, n8 QD.trigger_error只在PHP5中可用6 V9 V+ X% ?" o8 U' E; a
E.没有区别) u$ X) T% E+ H, K+ j

! r0 y3 k: A, p+ _5 @5 A* |* c4 @, R& a5 I1 x. {
15.______函数能返回脚本里任意行中调用的函数的名称。该函数同时还经常被用在调试中,用来判断错误是如何发生的。9 @8 B& O! A: F% V8 [3 w* D
' A% g7 g, q) @$ h; l* `2 l, C: T
A.print_r
7 C$ ?6 I) }/ o) t; ]. AB.var_dump
6 Q$ a) o' I6 j- h+ {! s1 q8 MC.stack_dump
' t8 ]# A& Q$ {% o1 `# [/ M6 D! ED.debug_backtrace* }( F5 d" A, I2 O) X* ^9 R& X0 A" x
E.以上都不对
! N1 u1 t$ @9 R6 H" g: a1 x" l' }* m, P5 k2 J& t6 w- n' P) q' \. `
答案0 G3 l  x( N& u9 G
/ R) ^! c. P7 r* u
1.答案是E。三元操作符把每个if语句连到一起,作为&&操作的一部分。然而本题中,$x=1这个赋值只在第三个if为false时发生。如果第一个和第二个条件都不成立,$x=1就不会执行。这题对三元操作的应用有些极端,实际应用时,需要根据可读性来决定是否需要用三元运算符(本题这种情况就最好不要用)。) q, e- [- R% V# U) i& L

' U8 k/ K. L( |( X2.问题是由第三方数据源传输缓慢导致的,而你无法控制这个数据源。你也许能在网络连通性上做些工作(假设问题出在你这一边)。还可以对接收到的内容进行缓存,这样能减少获取重复数据的时间。因此,答案是B和E。5 ~2 W% u0 O  u  J+ g- k/ [

1 u; U: N4 T/ Q: _" m0 P: a8 [3.正确的选择是B和D。如果关闭错误报告、使用@抑错符和关闭错误日志,那么在你交付给客户的网站出现问题时,你将很难进行分析和调试。; @) Q% i1 H: G8 T2 O
* K) m1 _0 d$ m7 V, t1 ^
4.这是在描述===操作符。
& q! ?; U5 i+ {. L
, n$ Q2 O5 g3 s, R  K' h5.正确答案是D。PHP脚本在执行时,将首先被解析成“中间”码(也叫opcode,操作码),然后解释器执行。操作码缓存出现在这两个步骤之间,对解析器的输出进行缓存。下次执行该脚本时,将缓存的输出直接送入解释器。这样就就不需要再解析一次了。
1 [& O( w1 [1 h: l; h
" o, O0 I6 q! \6.正确答案是A和D。如果RAM太小,进程间将出现资源竞争,服务器将大量使用硬盘交换。同样的,如果允许过多进程同时执行,也会使服务器频繁进行交换,导致速度下降。
/ L) Z6 d* Y5 k  V  [
" Y( O0 b- c8 z. U7.正确答案是A和C。脚本不检验datebase_query()的调用是否成功,因此将持续执行下去,最终产生错误。此外,$my_id参数没有转义——可能导致代码注入(详见第11章)。4 f3 C3 T, K/ c: y; [

* s& r5 d6 K+ X) E( Q0 ~8.答案B和D正确。出现解析错误往往表示脚本中有语法错误,自定义的错误管理器无法捕捉到它们的原因很明显:错误管理器在脚本里,而现在无法解析脚本,管理器也就无法执行。类似的,E_ERROR表示有致命的运行错误出现,比如内存耗尽。因此脚本会立刻被中断,因为解释器无法执行后面的代码。
& n" P- u% v; K5 E; f6 |6 n7 {) ^- Y1 j6 K
9.答案是C。比较操作是一个可交换的操作(就是说结果独立于操作数之外),而赋值不是。因此,比如说,$a==10和10==$a是等效的,而$a=10和10=$a却不是,而且后者会导致一个错误,因为这不是一个合法的操作。确保常量在操作符前面,能保证你不会错误得将比较变成赋值。
( F# e3 \! B- [2 \$ `7 N( }
! V& P: q: s( y8 l- n- D6 d10.答案是C。error_log函数能将信息送往一个指定的地址。尽管mail()也可以用,但error_log能自动给邮件添加标题,因此这才是最简单的方法。
9 v$ g6 m1 Q. N7 t! q! r, T4 g6 e9 \
11.答案是不能。error_reporting函数能关闭所有运行时的错误报告,但对解析时的错误无效,因为解析错误发生在脚本执行之前。6 r1 W( ]8 @9 j* m
3 L  X* z+ T6 t' E1 U& k
12.显然,答案是C。概要分析器(profiler)能监视脚本的运行,并记录单个部分的运行时间。它可以用来找出和解决瓶颈。* L+ X1 W" O% z/ S% N  M8 T

4 I* a4 S1 h. E' k( h" {13.这是对调试器的完美定义!你可以用调试软件监视脚本运行,同时分析系统资源消耗,从而发现和解决程序缺陷。
2 V$ X" C3 h7 M/ l8 d" }
. d, c7 p3 m% o* |" ?! n14.trigger_error()和user_error()之间没有区别。后者其实是前者的别名。, ?! m1 b7 K0 F% `. I- G
- n' e" Z, T3 q/ A0 ^7 Z6 P
15.答案是D。题目是在描述debug_backtrace函数,它返回一个由所有在代码的特定位置调用过的函数名组成的数组。

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