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

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

作为一个开发者,无论你经验多么丰富,或者无论你多么努力,你的程序中总会有bug。这是生命中一个必然的部分,如同死亡与缴税(尽管并没有后面两个那么严重)。7 H3 ]$ P0 t+ E
要想解决bug,首先要能找到bug。事实上,许多开发者花费了无数小时茫然得盯着代码,只是因为他们没有把程序的容错能力摆在首位。忽略了这个部分,那么期望一个没有bug的程序就是——不可能的。/ v) f' ~2 d, y, C. O6 i
本章测试题将考察你对调试和性能管理相关知识的了解,以及如何用PHP做好这两件事。
" K% k7 F# b# R+ f! }8 R7 a' R4 j. t0 E8 I1 P

$ j8 m! G8 d# H$ W  }8 z问题4 J" \, p$ x9 v3 n
6 ]9 v3 b+ c3 |3 h& c4 Y
1.以下脚本如何用三元操作替代?
7 R% c) n4 R. s6 \" E

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

  K5 u5 Z8 ^& ?9 n3 I  vA.$x = ($a A. < 10 || $b > 11 || $c == 1 && $d != $c) ? 0 : 1;7 g+ c6 C1 w1 U) w( [" o, C5 r
B.$x = ($a < 10 || $b > 11 || ($c == 1 && $d != $c)) ? 0 : 1;
7 h; N8 {6 f2 `  IC.$x = (($a < 10 && $b > 11) || ($c == 1 && $d != $c)) ? 0 : 1;
5 `: f6 O% l; ~& `9 z1 ~D.$x = ($a < 10 && $b > 11 && $c == 1 && $d != $c) ? 1 : 0;
- r# M& O% O7 J6 w3 b: Y- Q) CE.以上都不对
& ?. t: \' O7 u
  N9 U7 a" W3 O0 k% Z# _/ j8 k$ O0 L; Z& J5 y& u# r% l
2.有一个脚本由于要从远程获取数据,因而运行速度很慢,以下那种方法能对其进行优化?(双选)* c4 m8 D% u5 s8 V4 S
* Y" i) L7 E/ I: M( F
A.安装操作码缓存(opcode cache)
5 f  v" `# _! L' [! F8 {- zB.优化或者升级你的网络连接
2 U) d  P! H* U  J( N7 D% JC.添置更多的硬件
: k/ g2 T3 N0 b4 iD.增加服务器的可用RAM: P# V9 F, F( ~5 f
E.使用连接缓存5 x8 F/ {  Q0 y# V5 W! k) l; ?

1 j# e) |) h# h5 ]/ V. u3 F* ^& O7 t( E$ F) O; H4 c$ j
3.架设生产环境下的服务器时,需要做哪些步骤?(双选), u7 |& a, l( t& E* m

! V5 C1 J6 \, ~% WA.关闭错误报告
0 p; ]$ E- r3 |  O; F! sB.打开错误日志( _0 E$ k$ ]4 S. Z0 u+ S
C.关闭错误日志
, X1 T8 y' ~9 z5 ]0 }# ~  U/ VD.关闭错误显示
0 o  v! s9 m9 ZE.使用@抑错符& F8 ~/ O2 v* W3 m6 D1 t  F
- H5 |- a& b/ C/ C2 D8 {

3 e: M* P; Q4 R: U0 n  U4.______操作符能对操作数的数据类型进行严格的比较?
/ Q. J" n/ P- t4 D0 P1 s# n
; i7 f- G6 A; U答案:____________
- Q7 W0 z0 S" x4 ^3 G4 e$ B/ ~# \, i) s7 w2 I) J! E6 G
8 M8 I& L0 r1 O# M0 s- y8 w3 j% `
5.操作码缓存(opcode cache)能做什么?
9 Z7 C7 X* D0 a, o' Z' O9 T
& o/ c2 Y: @( s6 }8 Q% o' x2 dA.把脚本编译成二进制对象,使它运行得更快# Y$ {7 L. Y8 [
B.代替Zend引擎加快解释器的运行: J9 U3 ^7 T9 M) k5 B
C.缓存脚本输出以提高执行效率. r+ m3 @  P0 K
D.缓存解析器产生的中间码,以提高运行效率3 b& r7 \. F3 Q; T: T
E.在内存中缓存脚本,减少从硬盘中读取的次数
" ~8 v9 M, D9 L6 E0 b  T+ [1 n

0 Z5 ?; M& [# U! D: [6.以下哪些情况容易造成系统资源枯竭?(双选)- M% j3 x+ c: ]* m
, y( {0 M- J- Q. O- ^) l
A.RAM太小# e- w: C* G5 F  w8 z$ v+ L( [! ?
B.使用了低带宽的连接
2 d' p% ^7 y" e% X" dC.虚拟内存超过2GB
) {3 O9 B5 Y) m! s# `D.允许同时运行太多的服务器进程
/ a1 L: W" G" [/ k2 }  ~E.以上都不对
4 H- P" E# ~# H# T5 o6 ]# \/ @& u" H1 v7 ?
" L) r3 f- {( c! v5 }
7.以下脚本缺了些什么?(双选) . C+ X$ U: z8 ?; 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. ?>
复制代码

1 S: j% u5 A' U) c; IA.参数出口(Parameter escapement): T- M2 Q  X5 N8 p( Y' N' m
B.输出格式化
0 l6 J7 A$ h5 S: J' g  m/ oC.错误检查
% ^- [  B( u+ N) DD.一个SQL查询$ o( g( k0 S' c+ E5 v
E.以上都不对8 @: I$ ]1 }( _; n9 F  A/ T3 F

; F4 A8 x4 x* e$ l+ r/ U) W
) y$ h5 Z. u  J8.以下那种错误类型无法被自定义的错误处理器捕捉到?(双选)
, p4 J7 d0 N4 ~; d  B3 T0 h
1 C, j* S) N) I: Q( `) EA.E_WARNING
8 b' k1 G7 O5 R7 A& rB.E_ERROR
6 ~6 X6 z- N# x' ?' y5 `C.E_USER_ERROR
5 c, v+ ]: v. d0 |8 }6 {4 M% v9 B3 |D.E_PARSE
+ c0 N3 G, j1 N+ H' v' h" QE.E_NOTICE
5 ?5 v/ Q. M6 @1 S, w( }  y6 J# ~+ q. u9 u
  K+ S" a* ?+ v' J* J8 N
9.当需要比较一个常量和一个变量时,如何才能保证不会错弄成赋值?; I0 n4 a  Q: E6 t% I

" B6 \' D8 N3 i& E3 A9 J0 m" ^A.把变量转换成int
' [2 r9 \1 J1 n5 y5 }4 qB.使用全等比较符(===)
; f  ]7 b3 ^, G2 X9 VC.确保常量是第一个操作数
2 _+ I4 O6 F$ u5 ZD.使用三元运算符7 ^- ^! |. h8 ]& I5 Z5 X
E.用括号把操作包起来
5 H' g. C5 B1 D0 n. A5 L
- i/ C& A# \0 N& z& ?) z: b  O! g1 n3 [( i6 Y& Z5 R( y5 g8 e
10.要通过邮件给系统管理员发送错误信息,以下那种方法最简便?; o- B" L+ l& W- q+ y, P* [
, D% E' G: Q; f3 J
A.创建一个连接远程SMTP服务器的函数
7 N3 _. a; q5 B& T! JB.使用mail函数1 S2 e* t7 s" [! U: p0 d, R
C.使用error_log函数
. T+ c# L& u# \. y; y% QD.调用sendmial程序" c1 q+ Z1 K2 w" u# \- P; J1 B
E.使用webservice0 j9 i4 A7 Z3 K( x8 V1 p& n3 E# S

$ P% Z& T, u0 T  ]8 L  A( b
$ @( V: O$ Z2 P5 ]5 F+ n11.能否仅调用一个函数就关闭脚本内所有的错误报告?
; R4 F3 z2 x& A$ M  `+ w0 q, ]5 T  }
A.能
7 Y: v! |2 l& ^7 p( D; K, `B.不能0 Z) K2 b3 x& I- C+ [
8 v# H+ i* a+ {9 |

, Q, v; }" u$ {, B12.概要分析器(profiler)是做什么的?
( z; t% t$ X* I9 H9 C- V1 d: b# w6 D- n3 q3 v
A.创建关于脚本结构的档案
9 ^+ ]; s; h: p0 g" M) f1 cB.把脚本转化成UML图
1 a' W, ~4 U2 Y1 iC.精确测算脚本不同部分的运行时间5 ~/ D1 x0 \( M% p0 y! D( ~1 M% U: Z
D.计算脚本通过web服务器执行时的维度
# D& \, x' n% Y6 L; L: D; DE.扫描脚本,识别由常见错误导致的bug2 p: B% G0 R' f( w6 ~' _8 V
1 t1 Q# `' y& `7 ~0 T8 E

0 m) ?. n( e8 d( s& R5 r13.______能帮助识别和解决bug。
, _) \6 K( d% O( Q6 }. p4 ]" U- ?  h
* f/ N; {8 b/ _+ w. x答案:____________. B0 f" `; e! h7 v% j% V

+ f) K9 A4 r7 |* H- ^3 |& E9 g+ U3 }) }( d. F
14.trigger_error()和user_error()有什么区别?
- r" N# B+ C$ l; b
& `' d+ B6 ~- v, N! sA.trigger_error()允许脚本抛出系统级的错误. \& M  w; \$ N
B.user_error()允许脚本抛出系统级的错误9 m5 Z" ~. H* h4 M, F; O
C.user_error()不能被用在错误管理器中
/ [8 B  H( r8 m6 q. C( ND.trigger_error只在PHP5中可用3 n% p  C& Y7 h  F8 h; J  i7 i$ V
E.没有区别
# A4 g% R% _5 x9 u7 x7 h2 E
. k! A$ `; @! v1 R, i& \( W, W0 t3 E
15.______函数能返回脚本里任意行中调用的函数的名称。该函数同时还经常被用在调试中,用来判断错误是如何发生的。/ a0 k5 \8 r. |' Q$ u

+ B! v2 r+ M; u  `4 t+ AA.print_r+ ^2 Q9 ~) Y7 x7 y3 d) k* i  C! U
B.var_dump& l/ R& v! J: Y  T; C
C.stack_dump
. u  R4 s% y0 L; @9 \7 |D.debug_backtrace
$ @+ D0 a! d% }E.以上都不对8 ?$ f( s8 n. T0 W7 v. |9 |  w
6 e  Y7 R. z3 x; y
答案
- ^& T, m- c/ t: g1 H! v7 Z
) x0 y( ]& K) q/ }+ d1.答案是E。三元操作符把每个if语句连到一起,作为&&操作的一部分。然而本题中,$x=1这个赋值只在第三个if为false时发生。如果第一个和第二个条件都不成立,$x=1就不会执行。这题对三元操作的应用有些极端,实际应用时,需要根据可读性来决定是否需要用三元运算符(本题这种情况就最好不要用)。
3 ~6 e$ Z3 `  \: O3 @8 G4 R* w- E
2.问题是由第三方数据源传输缓慢导致的,而你无法控制这个数据源。你也许能在网络连通性上做些工作(假设问题出在你这一边)。还可以对接收到的内容进行缓存,这样能减少获取重复数据的时间。因此,答案是B和E。
4 X0 r' Y: K. n: i4 j* f0 w6 ~! C' b% N& y
3.正确的选择是B和D。如果关闭错误报告、使用@抑错符和关闭错误日志,那么在你交付给客户的网站出现问题时,你将很难进行分析和调试。
9 z1 r2 K- R0 a2 _" u9 J! U
2 i$ k) |: g9 T2 v4.这是在描述===操作符。# }3 U+ Q  t- N- t" K8 n% V7 d

* B& q$ O5 v1 ?6 m% u5.正确答案是D。PHP脚本在执行时,将首先被解析成“中间”码(也叫opcode,操作码),然后解释器执行。操作码缓存出现在这两个步骤之间,对解析器的输出进行缓存。下次执行该脚本时,将缓存的输出直接送入解释器。这样就就不需要再解析一次了。1 r4 J5 \6 j9 y* x' r4 c, {6 {
, W! u  q8 p7 ]& i. e8 F7 }
6.正确答案是A和D。如果RAM太小,进程间将出现资源竞争,服务器将大量使用硬盘交换。同样的,如果允许过多进程同时执行,也会使服务器频繁进行交换,导致速度下降。' v. y: k, X! S5 p+ ?

0 E! j; Q; }3 Q/ n$ F. b7.正确答案是A和C。脚本不检验datebase_query()的调用是否成功,因此将持续执行下去,最终产生错误。此外,$my_id参数没有转义——可能导致代码注入(详见第11章)。
4 i& Y7 K! Y) O2 r! ?5 C/ s& a9 N/ r( D. h" B3 q& W
8.答案B和D正确。出现解析错误往往表示脚本中有语法错误,自定义的错误管理器无法捕捉到它们的原因很明显:错误管理器在脚本里,而现在无法解析脚本,管理器也就无法执行。类似的,E_ERROR表示有致命的运行错误出现,比如内存耗尽。因此脚本会立刻被中断,因为解释器无法执行后面的代码。
9 K/ |( g+ q. L* E% `. X7 I2 s7 X) U
( G' \) N0 n. }9.答案是C。比较操作是一个可交换的操作(就是说结果独立于操作数之外),而赋值不是。因此,比如说,$a==10和10==$a是等效的,而$a=10和10=$a却不是,而且后者会导致一个错误,因为这不是一个合法的操作。确保常量在操作符前面,能保证你不会错误得将比较变成赋值。9 V- P0 [5 [. R) v( p

6 K9 }2 B* u% @+ c" m/ @1 [' E10.答案是C。error_log函数能将信息送往一个指定的地址。尽管mail()也可以用,但error_log能自动给邮件添加标题,因此这才是最简单的方法。
* x: T5 _8 M4 d, u) ^7 H
1 ^. U$ \9 l9 d11.答案是不能。error_reporting函数能关闭所有运行时的错误报告,但对解析时的错误无效,因为解析错误发生在脚本执行之前。
% P) i6 f. A: g/ R- A- j5 |% T% D8 u8 f3 o
12.显然,答案是C。概要分析器(profiler)能监视脚本的运行,并记录单个部分的运行时间。它可以用来找出和解决瓶颈。
1 }) e. {  o/ C" e, a1 w( b# ]. F& z4 w6 _% @3 y
13.这是对调试器的完美定义!你可以用调试软件监视脚本运行,同时分析系统资源消耗,从而发现和解决程序缺陷。2 e4 f* S1 Q2 s
+ ~% D* T7 o" u- }
14.trigger_error()和user_error()之间没有区别。后者其实是前者的别名。4 G+ e! b% `' m  y

. G8 o, u. j" I# P  p1 y. c15.答案是D。题目是在描述debug_backtrace函数,它返回一个由所有在代码的特定位置调用过的函数名组成的数组。

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