返回列表 发帖

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

作为一个开发者,无论你经验多么丰富,或者无论你多么努力,你的程序中总会有bug。这是生命中一个必然的部分,如同死亡与缴税(尽管并没有后面两个那么严重)。2 r. H. {, ^1 D2 D- `/ h
要想解决bug,首先要能找到bug。事实上,许多开发者花费了无数小时茫然得盯着代码,只是因为他们没有把程序的容错能力摆在首位。忽略了这个部分,那么期望一个没有bug的程序就是——不可能的。
  e; v2 c5 _& z: Y. e本章测试题将考察你对调试和性能管理相关知识的了解,以及如何用PHP做好这两件事。
$ {% x, z& v4 Y0 W3 G8 `# Y3 F+ z  S3 P& ]7 _: v6 k

! K+ o3 W! S, E8 S问题+ ^' g% q. v) i8 |: G% d; ]3 }2 v8 E/ ~
$ R% i0 {! h5 c# }8 ^6 D3 ~
1.以下脚本如何用三元操作替代?
( f4 l. i0 R& I# c

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

7 F* C9 ^! z. n7 y+ PA.$x = ($a A. < 10 || $b > 11 || $c == 1 && $d != $c) ? 0 : 1;5 n5 U+ y$ n) q
B.$x = ($a < 10 || $b > 11 || ($c == 1 && $d != $c)) ? 0 : 1;
  Z/ M6 w* }" c# yC.$x = (($a < 10 && $b > 11) || ($c == 1 && $d != $c)) ? 0 : 1;* h1 z, g) n0 Y2 Y& w( M/ t3 Q
D.$x = ($a < 10 && $b > 11 && $c == 1 && $d != $c) ? 1 : 0;
( W- E9 O! z4 T: W  E/ p* ]E.以上都不对8 k2 L+ o3 L6 \3 J; _' N
6 h6 P' Y$ a9 Z4 D  d+ \) Q8 K

0 X. `: K4 ^( P. w9 ^1 f2.有一个脚本由于要从远程获取数据,因而运行速度很慢,以下那种方法能对其进行优化?(双选); Y4 x- j( J0 d0 P
5 A8 G/ M* G& u1 e3 i8 {" X
A.安装操作码缓存(opcode cache)0 b' b. |) V4 a  k% p
B.优化或者升级你的网络连接
7 g& k, A+ F7 `3 h$ Q$ c9 ~C.添置更多的硬件
% k5 _3 U5 d( P7 Q0 B" r  n, ]D.增加服务器的可用RAM0 v6 I& p* B! [/ [- h
E.使用连接缓存0 H  N1 S% w' ]' p  ?

  p8 B0 g( Q0 U, m9 G. L) j% j) x& c: z% S
3.架设生产环境下的服务器时,需要做哪些步骤?(双选)
- u* B9 T7 b) h7 C4 P
! l: H' a) B; n. D: kA.关闭错误报告
7 z3 C0 L2 ]4 t' HB.打开错误日志
. }5 K( \: k: e  D, ^" {9 iC.关闭错误日志+ }! Y9 ^7 I! X) `, T
D.关闭错误显示
1 D1 z" q# W! TE.使用@抑错符
( P  n7 N9 ]) O& k7 u6 y7 T: m4 g) W% F* k1 i+ t

" w9 U$ N. Z- r( ^4 ~4.______操作符能对操作数的数据类型进行严格的比较?
% k6 z! G% }9 t$ \. h! o, m
4 c/ Z" X; |+ T答案:____________
% _# b, _$ G& g8 z' f3 x# e/ Z+ e- z. g
( E  O2 P5 Q, b$ X+ n0 v0 H) s6 c: H) y1 v
5.操作码缓存(opcode cache)能做什么?, u7 c# M! O8 S  s; w% Z) [
2 ]9 D+ e4 ]7 @  S# [8 f- v+ q. |
A.把脚本编译成二进制对象,使它运行得更快
/ S( I! m/ q6 ]% `- Z7 {0 j( VB.代替Zend引擎加快解释器的运行
' b- K' C: W# s" T2 i, i' P' sC.缓存脚本输出以提高执行效率. u: z8 ], f6 g+ K$ l2 v0 K
D.缓存解析器产生的中间码,以提高运行效率
5 F7 O  F# e. d7 @& sE.在内存中缓存脚本,减少从硬盘中读取的次数! f, M& M% i- z

+ C7 w) r% }2 |: g- W; Q6 @7 n# o/ r) `; ~% Z. n" O
6.以下哪些情况容易造成系统资源枯竭?(双选)
5 [! p# e& p* X6 X0 O: D$ X0 t5 D5 E9 M$ S5 u1 m
A.RAM太小
) t- d* U4 I6 i1 [; C( YB.使用了低带宽的连接+ ?6 H3 p3 w6 c& _, k5 ?9 r
C.虚拟内存超过2GB+ v- H) q. O3 q0 e
D.允许同时运行太多的服务器进程
% W- v/ ?4 c2 T: L: uE.以上都不对
% x) l  d) F/ D1 c* \3 k8 {  i
- C7 K$ T; t" Q& K1 K1 B% r$ x
7.以下脚本缺了些什么?(双选) " b5 \( }8 Y* l6 s2 [& 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. ?>
复制代码
0 d6 ^1 \$ k( K
A.参数出口(Parameter escapement)4 s% E* |: z6 i: E; r' O2 Z! q- c) F
B.输出格式化
# L" ^; I9 r) a$ ~$ NC.错误检查
. u. b% p5 j8 ]' M* m/ `' i0 MD.一个SQL查询" c5 l: P1 L7 x  S6 e' x1 u
E.以上都不对
2 D2 i% N- v4 x/ e7 N0 A7 s+ e) d: e1 X9 b- q
! C, `! Q. k, u2 G4 ~
8.以下那种错误类型无法被自定义的错误处理器捕捉到?(双选)
8 P/ ^: q0 N5 Z- A
& k% W  t  P1 l, V; K: cA.E_WARNING
$ A# }: s; q* W) s8 d2 p& z' jB.E_ERROR- C/ v+ R! c$ g: J7 U# _
C.E_USER_ERROR
* K& ^1 G: H% p$ {* ?& cD.E_PARSE+ Q9 E- p9 b  j; r% {1 C8 H
E.E_NOTICE
  s6 Y9 a; i: e! m& T0 Z( b
# s# [( p% E" t* a9 G$ O1 C4 x6 T! \5 |3 s: c
9.当需要比较一个常量和一个变量时,如何才能保证不会错弄成赋值?/ z6 O: \; Q& x% ^

* B7 O0 b, O% r6 @7 G% wA.把变量转换成int* k7 E2 }& n, o" P7 l
B.使用全等比较符(===): H2 m" F9 U% n" c/ s6 G
C.确保常量是第一个操作数
# w* y3 r4 [7 i: O# sD.使用三元运算符
+ L' C/ W0 F" ]: \1 KE.用括号把操作包起来
% p- i  }, w& }, u5 I5 L8 F& D/ O4 ^4 N7 d
$ P0 {2 z0 e, {9 P3 l1 A5 i
10.要通过邮件给系统管理员发送错误信息,以下那种方法最简便?3 z1 m0 o) C& l  ?5 {; p

) F3 X3 G' l# L. kA.创建一个连接远程SMTP服务器的函数7 E2 j9 \+ W- T# o
B.使用mail函数- T7 _7 d9 q+ n" X/ \/ D; @$ a
C.使用error_log函数9 t2 w- m" b- j2 ?5 s
D.调用sendmial程序) \+ T/ G& l* p8 [! |
E.使用webservice
9 x; A' R/ a& Z; {, \
* B' G+ v' |0 l3 }1 a* R- S. m, c* E( I6 p( U
11.能否仅调用一个函数就关闭脚本内所有的错误报告?
6 b5 m3 `. T! U& n1 C, k' J1 S8 Q  z- Z1 r3 W
A.能9 c# U( Y7 z, i9 k  e4 r
B.不能, n0 d) a$ o- ]9 B8 x( N; f

3 `0 p) U! u0 X3 Y! R1 t& P7 H4 K5 i2 |/ H( @# H7 {
12.概要分析器(profiler)是做什么的?4 f# W: P( E8 w" S
- r; r  o! l8 q. @* o- X
A.创建关于脚本结构的档案
4 A$ h9 p$ g3 g0 [; z& aB.把脚本转化成UML图
2 Y8 ^* B2 B, A, B1 w% Q8 y, nC.精确测算脚本不同部分的运行时间
  f2 {& U$ a. _, w5 aD.计算脚本通过web服务器执行时的维度% |* V2 k- w4 @+ W# [% I3 w% \
E.扫描脚本,识别由常见错误导致的bug0 S. ~" J% Z0 Y+ |: ?
! Q8 c4 f, [9 C+ ]! _

. X7 f# `/ P7 B$ T7 B: D13.______能帮助识别和解决bug。- G' n9 C# u7 a0 T5 ~" F! u
  r0 P% ^, d! g+ h9 s* A1 |
答案:____________/ k) C; ]1 p. f% V" f; n- S
1 N% y$ p3 B& u, d9 c# R# w! g" B0 {
" Z: G$ X' i" O
14.trigger_error()和user_error()有什么区别?; e" Y2 C0 o# {; P! e" m) q
3 |. y; B" F  L/ s
A.trigger_error()允许脚本抛出系统级的错误0 l! R7 [6 J- [; W! }
B.user_error()允许脚本抛出系统级的错误% P4 c6 j6 x$ o; y& ?$ x
C.user_error()不能被用在错误管理器中0 H- Z; n, d7 q3 V, S. @: Q
D.trigger_error只在PHP5中可用
  g1 L# ?  H' Q1 l; aE.没有区别
% a/ s  I4 [8 q# m: w2 I/ l& h* D1 x# s# U

. H& S$ d4 M! T! b; j  K15.______函数能返回脚本里任意行中调用的函数的名称。该函数同时还经常被用在调试中,用来判断错误是如何发生的。
( l# \6 X  Z8 ^' x9 i! t/ v' O" A3 p0 n/ |/ |" M8 v2 b0 M
A.print_r
' o6 U4 A, e# H1 R- ^2 m& O' x( z- RB.var_dump5 s; b" a1 }- e% P" a9 }
C.stack_dump2 ^, g( S0 e' }1 m2 [
D.debug_backtrace
+ v8 M$ y! z4 f- X5 Z/ J0 V; UE.以上都不对
) d0 T; U  M; l3 O6 Z3 q! \$ ]) a2 c& Y& U' j
答案! d2 J6 [) e: n- l: `
' G2 [; m7 w7 |6 S8 \1 W
1.答案是E。三元操作符把每个if语句连到一起,作为&&操作的一部分。然而本题中,$x=1这个赋值只在第三个if为false时发生。如果第一个和第二个条件都不成立,$x=1就不会执行。这题对三元操作的应用有些极端,实际应用时,需要根据可读性来决定是否需要用三元运算符(本题这种情况就最好不要用)。
- d; L& f1 M# O
4 A+ t3 w4 Y0 t2 T- q  d) q3 r; r2.问题是由第三方数据源传输缓慢导致的,而你无法控制这个数据源。你也许能在网络连通性上做些工作(假设问题出在你这一边)。还可以对接收到的内容进行缓存,这样能减少获取重复数据的时间。因此,答案是B和E。: X+ ~1 Y- G4 \2 Q. K
* B1 F. @& Q& z! Q6 A+ z' z0 H0 c
3.正确的选择是B和D。如果关闭错误报告、使用@抑错符和关闭错误日志,那么在你交付给客户的网站出现问题时,你将很难进行分析和调试。& \. L! ]+ Y0 C0 y' [
3 c  n. h: d7 a0 e8 H/ ^, H( N6 B
4.这是在描述===操作符。
$ b: f+ D" b2 t) m. Q( Y
" T! G1 l/ ]! g# a5.正确答案是D。PHP脚本在执行时,将首先被解析成“中间”码(也叫opcode,操作码),然后解释器执行。操作码缓存出现在这两个步骤之间,对解析器的输出进行缓存。下次执行该脚本时,将缓存的输出直接送入解释器。这样就就不需要再解析一次了。' E0 q3 Q5 z) W5 F5 d

; \% u' Q5 ~4 a! k6.正确答案是A和D。如果RAM太小,进程间将出现资源竞争,服务器将大量使用硬盘交换。同样的,如果允许过多进程同时执行,也会使服务器频繁进行交换,导致速度下降。9 m& ]5 j5 {1 u; |7 M
# k  R2 O. ?- _; K
7.正确答案是A和C。脚本不检验datebase_query()的调用是否成功,因此将持续执行下去,最终产生错误。此外,$my_id参数没有转义——可能导致代码注入(详见第11章)。! v2 K& y' C! g; y4 q

# y& T  |( s  G4 V/ i1 H( F0 o$ w8.答案B和D正确。出现解析错误往往表示脚本中有语法错误,自定义的错误管理器无法捕捉到它们的原因很明显:错误管理器在脚本里,而现在无法解析脚本,管理器也就无法执行。类似的,E_ERROR表示有致命的运行错误出现,比如内存耗尽。因此脚本会立刻被中断,因为解释器无法执行后面的代码。
9 W  ^1 g( R8 a% ]; q7 \
8 h% `% J5 k8 T: J# g$ k9 B/ {8 P6 o) F9.答案是C。比较操作是一个可交换的操作(就是说结果独立于操作数之外),而赋值不是。因此,比如说,$a==10和10==$a是等效的,而$a=10和10=$a却不是,而且后者会导致一个错误,因为这不是一个合法的操作。确保常量在操作符前面,能保证你不会错误得将比较变成赋值。, v3 v; [0 o+ E0 A9 x

/ L0 j$ Y+ F. B+ z1 @$ M2 x10.答案是C。error_log函数能将信息送往一个指定的地址。尽管mail()也可以用,但error_log能自动给邮件添加标题,因此这才是最简单的方法。% `) G' d+ a% c! Z
$ k6 o: W% ]6 ]( d; J
11.答案是不能。error_reporting函数能关闭所有运行时的错误报告,但对解析时的错误无效,因为解析错误发生在脚本执行之前。5 r# b/ t5 s3 H8 c" s
* F2 q8 p; b/ B, p
12.显然,答案是C。概要分析器(profiler)能监视脚本的运行,并记录单个部分的运行时间。它可以用来找出和解决瓶颈。
2 A8 }% k8 |; [+ ^' i
* C5 x8 Z& {  M& _* g5 C13.这是对调试器的完美定义!你可以用调试软件监视脚本运行,同时分析系统资源消耗,从而发现和解决程序缺陷。
4 h+ H1 v5 n* C: ^7 T& I5 z9 K
# M- V6 `9 r# `4 ^9 h9 O, Y14.trigger_error()和user_error()之间没有区别。后者其实是前者的别名。8 F( g. _: X: A6 a' m

' C1 r* {3 L# F& V$ F9 r15.答案是D。题目是在描述debug_backtrace函数,它返回一个由所有在代码的特定位置调用过的函数名组成的数组。

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