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

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

作为一个开发者,无论你经验多么丰富,或者无论你多么努力,你的程序中总会有bug。这是生命中一个必然的部分,如同死亡与缴税(尽管并没有后面两个那么严重)。0 `+ m- F* J: L. @# |
要想解决bug,首先要能找到bug。事实上,许多开发者花费了无数小时茫然得盯着代码,只是因为他们没有把程序的容错能力摆在首位。忽略了这个部分,那么期望一个没有bug的程序就是——不可能的。
- d% q" _) E4 }/ A本章测试题将考察你对调试和性能管理相关知识的了解,以及如何用PHP做好这两件事。# d3 \/ i- |2 ?  p9 F
2 s& s; K, N' u

8 d$ }# w1 W5 P. j' ^# w问题
0 ^" `' }$ ^* I3 B$ i1 e" y9 g0 B) Q+ ~) P! O9 n7 o
1.以下脚本如何用三元操作替代? 0 y! l3 u7 c9 t4 a0 s$ ?9 {, p: o

  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. ?>
复制代码
  R* y2 U7 {7 `
A.$x = ($a A. < 10 || $b > 11 || $c == 1 && $d != $c) ? 0 : 1;9 q; B- Q, j$ ]" T) w
B.$x = ($a < 10 || $b > 11 || ($c == 1 && $d != $c)) ? 0 : 1;0 A* D& A. D/ [' J  M2 r" f, Y; {
C.$x = (($a < 10 && $b > 11) || ($c == 1 && $d != $c)) ? 0 : 1;
) P2 `$ x$ ?' |" qD.$x = ($a < 10 && $b > 11 && $c == 1 && $d != $c) ? 1 : 0;. O- f& o( N! d
E.以上都不对- f: }* ~$ H8 j" q$ q$ s) C# a
3 r# A- d# y7 ~9 O3 K5 i

! \0 V# v( f$ r3 }. p" ~' R2.有一个脚本由于要从远程获取数据,因而运行速度很慢,以下那种方法能对其进行优化?(双选), z+ M1 R8 P8 u4 a: \( [& k( w
/ y1 S3 w, o; M- m( W! s
A.安装操作码缓存(opcode cache)- a0 Y, k  n5 s& Z# Q, ^
B.优化或者升级你的网络连接4 M; Q2 _! r0 h! L- {& t* m
C.添置更多的硬件+ l  A& A- ^( ~: T# \0 T
D.增加服务器的可用RAM& o5 I2 u6 @; l/ ?
E.使用连接缓存/ R" S3 F* h2 ^5 C: q; v

. T$ v$ B; F$ N4 T3 F
* c$ |7 ?! {% s8 [3 R6 M. \3.架设生产环境下的服务器时,需要做哪些步骤?(双选)
3 T) ~- n% F# `/ }' \/ V+ u; z
0 X' K4 P0 n' y# W  b7 }3 OA.关闭错误报告
$ F5 v! ?, ~+ tB.打开错误日志1 e% Z6 ?0 [0 m& g# q
C.关闭错误日志
/ r, T1 n4 n# z0 GD.关闭错误显示
4 p/ O' q+ S' E8 VE.使用@抑错符+ z2 S) A0 c# R' i* L

# W' W5 \0 o( t- S! U- N& r3 l' t# y
4.______操作符能对操作数的数据类型进行严格的比较?
# N/ |; O* B. V" E) W# U+ {  `
( C) q" ]' `  G' u. K0 A7 R答案:____________5 r2 \$ n) l" l1 g4 T5 \

6 W% v! |4 d; E* }; o0 B( i+ M6 `: T; a: k& b: M0 I4 G: `  F
5.操作码缓存(opcode cache)能做什么?' T3 ]& R0 R* G
# U9 Z- x; v7 u9 G
A.把脚本编译成二进制对象,使它运行得更快
" h$ O0 n6 M( L0 @! K- F; HB.代替Zend引擎加快解释器的运行
0 k! ]& E/ Z! ?4 o/ }% @C.缓存脚本输出以提高执行效率  V. ?# z. T- t8 U: |2 Z5 E, R6 @
D.缓存解析器产生的中间码,以提高运行效率' d  P% n8 E# m6 ~; }1 j
E.在内存中缓存脚本,减少从硬盘中读取的次数
' [3 t9 Z4 p; a' L( \) K4 R& o  |8 y+ z3 d, T& J
  V# P! j0 j" M8 v6 I0 f) d
6.以下哪些情况容易造成系统资源枯竭?(双选)
1 ]" {; d# ~9 v% K8 x; {6 {" d8 S
A.RAM太小
0 a- M* ]+ y3 N% dB.使用了低带宽的连接8 ]" t% L; Q! Z) A! o
C.虚拟内存超过2GB
4 o& c* g. s% L4 B  `. c& v0 PD.允许同时运行太多的服务器进程% Q9 m: M% _& I4 I% V9 `
E.以上都不对
. f$ B- A" u4 c* `6 ]# S) F% M3 @& h5 @# E2 f

+ ^3 ~7 O' P1 `/ M5 g* G1 ~7.以下脚本缺了些什么?(双选)
  O# l! j0 X. ?6 @/ ?* S8 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. ?>
复制代码
! ^' ]$ L+ s9 V7 N2 X
A.参数出口(Parameter escapement)  z5 L$ F! h$ k
B.输出格式化
8 V3 {9 K, q6 X5 hC.错误检查
* t! F/ Q- L" r* j, H$ y& ^D.一个SQL查询( b$ O+ u/ L# D8 H/ p$ t! j4 A
E.以上都不对+ s8 g7 e+ u, ~7 e9 X( [

1 P9 U; [* p/ f! F" D% @* G
" W: j& Z1 R% }6 J) }8.以下那种错误类型无法被自定义的错误处理器捕捉到?(双选)
# t! p1 J. H% Z9 F, M: {
, j9 j( f! @. B( M% x$ ]: pA.E_WARNING
) ^. S8 I+ q7 l  F; ?8 @B.E_ERROR
; y1 h. M/ q6 a1 t6 VC.E_USER_ERROR( g2 Y& ?4 }( G. t
D.E_PARSE5 B$ O! m# [" ]0 c
E.E_NOTICE
- o# P& t- o$ ]8 U
: i6 F. g$ e' \9 p3 S$ B. ]0 Z* P4 j. Q- Q$ a% N9 X
9.当需要比较一个常量和一个变量时,如何才能保证不会错弄成赋值?: h* _6 U. ?. l5 n7 J' E' d
# ?0 y1 P& O; [2 n& {) V
A.把变量转换成int. \5 N: D7 ?6 ]+ O" d
B.使用全等比较符(===)
1 r# Y3 D0 O! b9 ~" V. MC.确保常量是第一个操作数) {8 E4 P4 y* a$ |  I
D.使用三元运算符# \8 r  ?& m9 J
E.用括号把操作包起来
4 k& r. r* o8 s; M6 l. G. A1 Z: L# n) E5 y' j. D6 R

: z9 @4 r3 Y" w3 g2 a, o5 x- P/ u5 C10.要通过邮件给系统管理员发送错误信息,以下那种方法最简便?: Z) r/ F! j8 \0 ]0 D1 h
0 V; }: R4 e5 H! u- K# e+ W
A.创建一个连接远程SMTP服务器的函数- m2 Z$ x7 @5 [' k  a" [- Z+ E7 }
B.使用mail函数
- _6 W5 G8 c% A  I* }: DC.使用error_log函数3 e2 W9 l1 _2 p
D.调用sendmial程序5 I! D1 M3 d$ P* v! L: S
E.使用webservice* O2 d0 U! y; x* l' |. K

  R. }7 u' |; I  m3 n
6 W. x1 ^8 S4 F  U' i11.能否仅调用一个函数就关闭脚本内所有的错误报告?; N3 z/ D" C( g+ P* `0 L

4 I  g+ W( m% H8 a8 i/ E4 U* G3 C( PA.能8 q. i5 G. G7 Y
B.不能5 R: h) Z. g0 u
% V% d& i' D3 O6 E0 g

  e" r/ {: u+ r3 F" n* b. }0 U, _12.概要分析器(profiler)是做什么的?% e2 \* O! I# h

$ ]7 o" r8 T6 h- g* V  s5 a" M! PA.创建关于脚本结构的档案" _) Z! p' }3 l
B.把脚本转化成UML图
% e: S( `! e8 _9 UC.精确测算脚本不同部分的运行时间
3 E' j: x9 I# A' ED.计算脚本通过web服务器执行时的维度
& o- N" R- D8 M  c. F7 }, V9 uE.扫描脚本,识别由常见错误导致的bug6 t" s/ s" ~8 F# A" m
8 x& b( Q6 \* s5 c# u' J% F

) t- ^" e9 v6 S* M8 }( A13.______能帮助识别和解决bug。
- T, R; d- k1 O8 I
) e1 q# \; _& Q1 F7 j$ ~答案:____________! o4 p) l& Q, |$ X) }9 r

5 V3 ]3 p+ v# \1 `$ ~( B( c$ o  W, m; d* A. L, v8 T7 S+ _
14.trigger_error()和user_error()有什么区别?+ m# X/ G" ^+ V/ H" ?
7 S$ D6 w3 F- M3 U( H+ E
A.trigger_error()允许脚本抛出系统级的错误6 G& N# a# {& a, a" W! Z  Z
B.user_error()允许脚本抛出系统级的错误
8 z4 m3 E6 N% E) k: I# v; lC.user_error()不能被用在错误管理器中
& X3 P/ ]% J7 L0 Y) u9 o2 k3 gD.trigger_error只在PHP5中可用
3 V& S" T) m7 I8 {, a7 `E.没有区别
$ D4 H8 w( G" n2 D7 J
5 {  p! k' j4 |- z3 r$ e" ^- Z/ d% N+ G
15.______函数能返回脚本里任意行中调用的函数的名称。该函数同时还经常被用在调试中,用来判断错误是如何发生的。* b2 G; [1 a  \5 F5 S- `0 Q. [
: [$ s' F. a4 a  }5 u1 G
A.print_r
) t) i$ a* i1 @6 v0 gB.var_dump
% s, r# G. e, c6 U" UC.stack_dump
, z& E; O+ ^/ }& z+ p/ yD.debug_backtrace
4 d- ^# f# U6 Y: W, \% xE.以上都不对9 Q5 i/ g4 |& J* O2 ?# ]
  E# i0 R, D; w
答案
; I. q/ S2 t. k0 {) g! I
6 r3 _( H" C) B" A# T% ~. G' J4 }1.答案是E。三元操作符把每个if语句连到一起,作为&&操作的一部分。然而本题中,$x=1这个赋值只在第三个if为false时发生。如果第一个和第二个条件都不成立,$x=1就不会执行。这题对三元操作的应用有些极端,实际应用时,需要根据可读性来决定是否需要用三元运算符(本题这种情况就最好不要用)。6 R2 C- n4 M: M$ R% D" v
0 A' |$ w/ m! }* g
2.问题是由第三方数据源传输缓慢导致的,而你无法控制这个数据源。你也许能在网络连通性上做些工作(假设问题出在你这一边)。还可以对接收到的内容进行缓存,这样能减少获取重复数据的时间。因此,答案是B和E。
; @6 t: ~. C! {  a6 z) u; f8 B8 W/ x. z
3.正确的选择是B和D。如果关闭错误报告、使用@抑错符和关闭错误日志,那么在你交付给客户的网站出现问题时,你将很难进行分析和调试。6 z4 T- U- e0 b5 d6 u  R5 K) t8 t0 T
* e; H- W" t5 N3 N3 _. d
4.这是在描述===操作符。1 @1 a* `6 y" @, w( h5 y
5 |( G8 a9 \# W( N2 K* {
5.正确答案是D。PHP脚本在执行时,将首先被解析成“中间”码(也叫opcode,操作码),然后解释器执行。操作码缓存出现在这两个步骤之间,对解析器的输出进行缓存。下次执行该脚本时,将缓存的输出直接送入解释器。这样就就不需要再解析一次了。
% k* Q9 t! H. |0 U; m# l
( i( M6 P0 S  f. h$ I" f6.正确答案是A和D。如果RAM太小,进程间将出现资源竞争,服务器将大量使用硬盘交换。同样的,如果允许过多进程同时执行,也会使服务器频繁进行交换,导致速度下降。
9 `: n; S6 Y+ D2 M' X
0 N- `8 R! A* b: A" m7 O, P7 ]  Z7.正确答案是A和C。脚本不检验datebase_query()的调用是否成功,因此将持续执行下去,最终产生错误。此外,$my_id参数没有转义——可能导致代码注入(详见第11章)。/ |3 d$ _8 O) j( s; d5 W+ l' K

, Y/ R) G. P0 x8 G& ~+ g- `1 z8 x+ J; j8.答案B和D正确。出现解析错误往往表示脚本中有语法错误,自定义的错误管理器无法捕捉到它们的原因很明显:错误管理器在脚本里,而现在无法解析脚本,管理器也就无法执行。类似的,E_ERROR表示有致命的运行错误出现,比如内存耗尽。因此脚本会立刻被中断,因为解释器无法执行后面的代码。
4 T  d) l% N5 C4 n& {: @, y1 f
6 U+ x( ~7 E% y" }: [8 L! M9.答案是C。比较操作是一个可交换的操作(就是说结果独立于操作数之外),而赋值不是。因此,比如说,$a==10和10==$a是等效的,而$a=10和10=$a却不是,而且后者会导致一个错误,因为这不是一个合法的操作。确保常量在操作符前面,能保证你不会错误得将比较变成赋值。
( T' T6 |; T) m. p: a. i+ J5 K5 |2 ~  f7 n9 H8 K0 S
10.答案是C。error_log函数能将信息送往一个指定的地址。尽管mail()也可以用,但error_log能自动给邮件添加标题,因此这才是最简单的方法。
" @5 l9 Q( S! m* _" P4 D5 q  M" B6 j6 S& A0 [
11.答案是不能。error_reporting函数能关闭所有运行时的错误报告,但对解析时的错误无效,因为解析错误发生在脚本执行之前。3 p8 `) @' f  z
5 X9 I# c7 x4 g: Y* J1 ?# k' v. e
12.显然,答案是C。概要分析器(profiler)能监视脚本的运行,并记录单个部分的运行时间。它可以用来找出和解决瓶颈。8 Q' V+ H2 E, K9 k

  w- r* \- A. `* l0 j13.这是对调试器的完美定义!你可以用调试软件监视脚本运行,同时分析系统资源消耗,从而发现和解决程序缺陷。4 U- F. {; B- F; G
0 b; E9 B, e; r+ E3 f8 @5 U. H- _
14.trigger_error()和user_error()之间没有区别。后者其实是前者的别名。5 Q2 s9 z0 p& J9 X
* `" W$ i1 z5 x
15.答案是D。题目是在描述debug_backtrace函数,它返回一个由所有在代码的特定位置调用过的函数名组成的数组。

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