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

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

作为一个开发者,无论你经验多么丰富,或者无论你多么努力,你的程序中总会有bug。这是生命中一个必然的部分,如同死亡与缴税(尽管并没有后面两个那么严重)。( {$ b+ F, }& z7 V
要想解决bug,首先要能找到bug。事实上,许多开发者花费了无数小时茫然得盯着代码,只是因为他们没有把程序的容错能力摆在首位。忽略了这个部分,那么期望一个没有bug的程序就是——不可能的。( c! S. ~; W" q: ~% `5 m' x
本章测试题将考察你对调试和性能管理相关知识的了解,以及如何用PHP做好这两件事。- x5 m! O8 m0 I4 F5 J* y, E; O

% y0 m$ R- `* a5 E/ |
5 |- ]) [" j- W3 q. q问题
' N- `4 T8 c# t4 \7 w1 c
% k) G0 w+ Z# @/ r$ i9 {# k1.以下脚本如何用三元操作替代? " A7 |/ F8 }. B- \/ l$ y, m' _7 O& s

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

( a5 r2 m& l! }A.$x = ($a A. < 10 || $b > 11 || $c == 1 && $d != $c) ? 0 : 1;
# y$ z! g" }. M' PB.$x = ($a < 10 || $b > 11 || ($c == 1 && $d != $c)) ? 0 : 1;
' A2 _. M: d" N, vC.$x = (($a < 10 && $b > 11) || ($c == 1 && $d != $c)) ? 0 : 1;
, S, x  T3 V9 AD.$x = ($a < 10 && $b > 11 && $c == 1 && $d != $c) ? 1 : 0;+ h9 a- ]8 d, ?/ |) G
E.以上都不对
. H$ O) w3 W+ C& @# m% ]$ q1 B
) t1 G; {3 I1 I4 |
. e/ x& Q3 y. {5 P' i% G# r5 ^" k2.有一个脚本由于要从远程获取数据,因而运行速度很慢,以下那种方法能对其进行优化?(双选)
( c) B  \5 F  v+ V6 M+ B: q
1 ~  g5 d; e; c7 o8 hA.安装操作码缓存(opcode cache)/ S* ]& v2 K. m
B.优化或者升级你的网络连接- G" C  T3 B; X4 \; y
C.添置更多的硬件
1 u" ?2 R1 l* H8 TD.增加服务器的可用RAM
4 X7 R% H& A7 X' i, n" A: @E.使用连接缓存" l6 F" p6 v$ J  d) F
0 N  e. Q+ b% p' j+ B
3 c! R* o" O- f+ N1 M" u) J3 s$ q
3.架设生产环境下的服务器时,需要做哪些步骤?(双选)1 ~8 o% [. e0 q2 \2 G( K# h; ^

& o- Q/ C9 G$ `3 |$ p) y9 HA.关闭错误报告; Q. G$ Z9 Z4 e3 F6 B  |
B.打开错误日志
0 L4 j/ \( f8 g$ r& R) \; Z) Y0 P+ _& uC.关闭错误日志! E  `8 `+ h+ p# t
D.关闭错误显示
+ q6 h2 O. w$ Q7 IE.使用@抑错符
. `1 b7 T+ Q5 Z" p$ s- u) `# o4 I) N4 k& O" U

3 Q% }; |4 U7 c  ~9 E. e4.______操作符能对操作数的数据类型进行严格的比较?
2 W2 V5 B% j/ n9 t- P) ?. U4 B: q
, q; h) F2 K1 l答案:____________
6 P' K8 i# l2 t7 E' G) }; Q; o( C; y5 S. v% {- `

2 z1 j, F5 F7 X5 ]% p5 i( V2 I5.操作码缓存(opcode cache)能做什么?
$ V+ d# l! Y9 j1 f+ i2 H+ L- S( [4 p7 y6 d; `
A.把脚本编译成二进制对象,使它运行得更快& W. `: W( c6 |! u( y1 {! ^
B.代替Zend引擎加快解释器的运行
" J1 e& V; }; ~C.缓存脚本输出以提高执行效率
% ~! V+ h& N# i- r$ s5 S% rD.缓存解析器产生的中间码,以提高运行效率
) Y9 V1 N4 i" s/ t' A  i% O) pE.在内存中缓存脚本,减少从硬盘中读取的次数) y5 P: @6 c7 n8 ?! S
' ~; ]4 W. @1 e% T  W9 k* s( d2 ]
; ?% ?. @3 A+ Q1 Y! {( m
6.以下哪些情况容易造成系统资源枯竭?(双选)* ^7 Q" K7 a# V* J; `" o/ e  _0 y# |
. E3 P/ `4 W7 b5 q% e# y3 _1 i; E
A.RAM太小
$ c+ y: I& M0 o7 G, FB.使用了低带宽的连接$ [+ G+ R' S' J5 ?1 f: B; r; N) q
C.虚拟内存超过2GB
: F2 K" B# W0 M# b2 }/ o+ ]9 ND.允许同时运行太多的服务器进程
6 {, d3 j$ ^, I6 b# ?+ AE.以上都不对
6 K- c$ X: {, R/ R/ |& D, l" |( G
* O. b! _: U# z/ E! N' z
, G! O* b; N2 r- V$ [/ N7.以下脚本缺了些什么?(双选) : s" {) o& y& |  y/ w, h  y

  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. ?>
复制代码
' D/ P0 h% J, ~! T) D, i3 x
A.参数出口(Parameter escapement)
( h+ M1 s- r; J  ^8 DB.输出格式化' N0 W' |6 ^' Q4 o( h" U7 v& I& D& V
C.错误检查6 U2 R4 f2 _! h3 c7 }7 P/ c+ k. I
D.一个SQL查询& ~$ B1 i/ Z: o3 |& n7 L* H3 i
E.以上都不对
; o  V& g; g3 `$ ~# H" E1 Q$ D* T2 B2 U5 |  u6 z
7 V: U" c& X0 V! ~
8.以下那种错误类型无法被自定义的错误处理器捕捉到?(双选)& w/ S6 O; o6 I$ J% p

% `# n. q' H0 d! s& ?. rA.E_WARNING
. n% N7 C- Y3 \! [8 B/ [) L$ ]B.E_ERROR
3 h  a& S+ B' U" G* ?2 ]( X, eC.E_USER_ERROR
% @! P5 F& W( I' KD.E_PARSE
+ Z; q( N8 [6 C* {9 l/ Q, fE.E_NOTICE
( X, K4 F- V* r' s3 I3 O; W. l# E1 c0 g& U0 h7 i

+ z9 o9 T+ Y/ I; ?4 o/ b/ b9.当需要比较一个常量和一个变量时,如何才能保证不会错弄成赋值?* N, O  j' Z: v

5 t, U8 u0 d8 iA.把变量转换成int9 O6 G5 v( X1 j8 l; S7 S8 _& O) {
B.使用全等比较符(===)
* H7 [7 d/ c: V* EC.确保常量是第一个操作数
2 I2 n2 B1 i1 h# k2 \7 t. BD.使用三元运算符
, S  Z! V) f" e+ D9 n8 r9 TE.用括号把操作包起来! O6 Y1 K: _2 \) D  w
7 t# s/ u- t2 g& N' ^2 b

& F7 T4 }  }- q4 u10.要通过邮件给系统管理员发送错误信息,以下那种方法最简便?5 w+ R, x& J7 \3 Z

4 M% R( \+ ~6 P# S. UA.创建一个连接远程SMTP服务器的函数
3 q" m2 }1 P+ W# m$ I) gB.使用mail函数4 r: Q2 y; I0 L& }2 O3 j3 u
C.使用error_log函数
) E8 G/ V; a# a, g4 ?2 Z/ l+ wD.调用sendmial程序+ {/ k% P1 H/ M; O0 S& t+ f# T+ i8 i
E.使用webservice; \+ b9 k! v* M+ s
$ |! ?( T0 f* z0 C

- {* P' F& f2 u3 N11.能否仅调用一个函数就关闭脚本内所有的错误报告?2 T( v( ]! V2 Y  z2 X3 ^

6 U& Z/ [' f7 b# b& A, [; YA.能" m7 p$ m* A1 q' c
B.不能
, J' L- l- Y% \5 f: T" s# G2 b  r* o% \  V; {3 M6 M
- Y0 _- g# L% D
12.概要分析器(profiler)是做什么的?
( t: {2 V/ ~2 i( D
/ W( k+ b+ g& l) b" ]2 M9 FA.创建关于脚本结构的档案
- B2 f% s6 ~, Y3 p+ L/ UB.把脚本转化成UML图
) Q* U! z- L( n1 e& O3 ?" xC.精确测算脚本不同部分的运行时间8 k& S6 a% k. G; |7 x2 B( E, q
D.计算脚本通过web服务器执行时的维度
+ Y6 L# R! e+ W0 hE.扫描脚本,识别由常见错误导致的bug
. h. ~, H) @6 `; y" b4 X! W
1 O& w6 X/ @- M' d0 ]" r" k8 @6 ?* }+ U/ u
13.______能帮助识别和解决bug。& }5 |* ]1 ], w" ?4 H2 f

- U* w$ p7 `2 z6 P7 H4 d* _答案:____________. g( @* b1 f3 U3 h: B, i6 g
1 ~0 S( @1 }5 y; ?( l' i! p8 h- g

- g; f: F( N9 c% P6 `, {14.trigger_error()和user_error()有什么区别?9 a* k& V+ E: y2 j3 e
. Y4 L/ p' P: j5 N# X
A.trigger_error()允许脚本抛出系统级的错误* `6 a8 K/ d' N* F, L
B.user_error()允许脚本抛出系统级的错误
: ~& A9 ^. V5 c0 g. s+ CC.user_error()不能被用在错误管理器中: K4 r, @$ h! g- Y
D.trigger_error只在PHP5中可用9 W, P/ E. _$ H# l# E" v, B
E.没有区别
+ M) e0 \$ f' b- O8 V  S* f/ }/ g6 t7 U5 X4 U

- Q5 }$ K9 A/ J6 ^15.______函数能返回脚本里任意行中调用的函数的名称。该函数同时还经常被用在调试中,用来判断错误是如何发生的。
) T/ m% C. K2 Z' q/ K' L% E6 P
: u, _) W! e' _% A8 rA.print_r" p7 r/ k. C5 y3 N  n  @8 ~
B.var_dump
2 D( |* `$ E% }  Y, fC.stack_dump4 u$ |6 t9 g7 `- G2 |
D.debug_backtrace
8 Z. g( L: t) j, h9 ^7 N1 ^E.以上都不对8 k- B) v6 I0 }/ }3 @) k# m% V
2 K# S* |& y0 c$ J0 C) g
答案
1 r8 S' p  Q! d( D3 [8 j* x
4 C7 q, b+ e  W4 D6 \1.答案是E。三元操作符把每个if语句连到一起,作为&&操作的一部分。然而本题中,$x=1这个赋值只在第三个if为false时发生。如果第一个和第二个条件都不成立,$x=1就不会执行。这题对三元操作的应用有些极端,实际应用时,需要根据可读性来决定是否需要用三元运算符(本题这种情况就最好不要用)。* q# {/ I/ E# A6 U  G/ S
  ~3 l1 R$ Z& U
2.问题是由第三方数据源传输缓慢导致的,而你无法控制这个数据源。你也许能在网络连通性上做些工作(假设问题出在你这一边)。还可以对接收到的内容进行缓存,这样能减少获取重复数据的时间。因此,答案是B和E。+ a' B- g% r4 X& H, p& x5 r1 e- L
, R" e! o1 M3 r- x9 d+ G
3.正确的选择是B和D。如果关闭错误报告、使用@抑错符和关闭错误日志,那么在你交付给客户的网站出现问题时,你将很难进行分析和调试。9 E! Q: U: @( U( y4 b  a( ~! Z3 j

9 t! g/ P$ u: M1 ^' w9 V7 J( \4.这是在描述===操作符。
# m3 E" a4 v5 O8 n- o
- v1 f  q. w2 Z$ E: B5.正确答案是D。PHP脚本在执行时,将首先被解析成“中间”码(也叫opcode,操作码),然后解释器执行。操作码缓存出现在这两个步骤之间,对解析器的输出进行缓存。下次执行该脚本时,将缓存的输出直接送入解释器。这样就就不需要再解析一次了。
: k5 B! F! L  u9 e
* Y/ Q( a0 I" \6.正确答案是A和D。如果RAM太小,进程间将出现资源竞争,服务器将大量使用硬盘交换。同样的,如果允许过多进程同时执行,也会使服务器频繁进行交换,导致速度下降。7 m1 j! z  L: F0 H# a' o
6 d3 ^0 ]# j! ^$ S1 e
7.正确答案是A和C。脚本不检验datebase_query()的调用是否成功,因此将持续执行下去,最终产生错误。此外,$my_id参数没有转义——可能导致代码注入(详见第11章)。
  x0 v) S3 v$ I/ L5 u9 ]$ ^7 ?% W- Q
8.答案B和D正确。出现解析错误往往表示脚本中有语法错误,自定义的错误管理器无法捕捉到它们的原因很明显:错误管理器在脚本里,而现在无法解析脚本,管理器也就无法执行。类似的,E_ERROR表示有致命的运行错误出现,比如内存耗尽。因此脚本会立刻被中断,因为解释器无法执行后面的代码。; _) W5 M$ _2 q! b# C, y
% N/ L# D6 o/ |+ d
9.答案是C。比较操作是一个可交换的操作(就是说结果独立于操作数之外),而赋值不是。因此,比如说,$a==10和10==$a是等效的,而$a=10和10=$a却不是,而且后者会导致一个错误,因为这不是一个合法的操作。确保常量在操作符前面,能保证你不会错误得将比较变成赋值。
- I) e% C) |5 [! g  u% X- Z$ W* l# J/ a% ]% n7 J
10.答案是C。error_log函数能将信息送往一个指定的地址。尽管mail()也可以用,但error_log能自动给邮件添加标题,因此这才是最简单的方法。
7 C* y% |, q# O& L% }6 l) O1 p" t. C; a
11.答案是不能。error_reporting函数能关闭所有运行时的错误报告,但对解析时的错误无效,因为解析错误发生在脚本执行之前。. E' j3 \# b4 {% ^

% ^, |) A1 U+ x! }) t12.显然,答案是C。概要分析器(profiler)能监视脚本的运行,并记录单个部分的运行时间。它可以用来找出和解决瓶颈。
% Y* u! h; p1 ^: k$ X0 R& J$ O3 {# r* x) s9 s
13.这是对调试器的完美定义!你可以用调试软件监视脚本运行,同时分析系统资源消耗,从而发现和解决程序缺陷。% t, [' Y2 Y; s2 L
) f7 I0 ]. V3 Y, o8 v
14.trigger_error()和user_error()之间没有区别。后者其实是前者的别名。
* ^' ?) i5 s0 U/ `$ x
% R( x5 q$ H- q0 E15.答案是D。题目是在描述debug_backtrace函数,它返回一个由所有在代码的特定位置调用过的函数名组成的数组。

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