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

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

作为一个开发者,无论你经验多么丰富,或者无论你多么努力,你的程序中总会有bug。这是生命中一个必然的部分,如同死亡与缴税(尽管并没有后面两个那么严重)。$ |1 R8 y2 Q* Y
要想解决bug,首先要能找到bug。事实上,许多开发者花费了无数小时茫然得盯着代码,只是因为他们没有把程序的容错能力摆在首位。忽略了这个部分,那么期望一个没有bug的程序就是——不可能的。3 ^3 P8 @8 z1 m
本章测试题将考察你对调试和性能管理相关知识的了解,以及如何用PHP做好这两件事。  t8 \3 v3 o$ y% l  V1 g8 Z

- G1 F* F1 q2 Y
! Y0 d* C7 L8 S# a) T5 K1 G6 o$ [! g+ L问题7 H4 Q7 H1 b+ s" T
2 _( Y' I0 t  j6 j! @
1.以下脚本如何用三元操作替代?
, X* F2 M. {8 X0 U

  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. ?>
复制代码
2 F+ O4 E8 s2 N9 R
A.$x = ($a A. < 10 || $b > 11 || $c == 1 && $d != $c) ? 0 : 1;4 U3 a) F6 L' f4 N$ i, L2 S( d
B.$x = ($a < 10 || $b > 11 || ($c == 1 && $d != $c)) ? 0 : 1;
( d" y. E6 r& oC.$x = (($a < 10 && $b > 11) || ($c == 1 && $d != $c)) ? 0 : 1;( s8 h% k0 L, b# ?1 ]. C& _
D.$x = ($a < 10 && $b > 11 && $c == 1 && $d != $c) ? 1 : 0;2 B+ Y5 P9 C6 J- U3 ]* T
E.以上都不对
/ Y5 }; g4 x, y' @7 J' S/ V) F
. D  v. e; r. C! }# c# D7 K- v2 {! b+ _* s
2.有一个脚本由于要从远程获取数据,因而运行速度很慢,以下那种方法能对其进行优化?(双选)( g9 c/ }# q; P! v  r

' X: v( i* |, A% RA.安装操作码缓存(opcode cache)
% s$ |3 j( ]; D" G0 F# |: yB.优化或者升级你的网络连接
$ F' S. g, J9 e/ OC.添置更多的硬件
/ p/ p; m$ [7 `1 M8 C2 j3 }& aD.增加服务器的可用RAM$ c& K! n6 o  _1 @- {- q
E.使用连接缓存# z# h) Q$ _4 k/ {

0 E) z1 d1 ?. o$ {7 [1 y3 l& P
5 C  G& W- A0 M  H4 _9 j! a4 S( K' B3.架设生产环境下的服务器时,需要做哪些步骤?(双选)
6 [7 x9 m' u, b! `; ~( W5 b9 U8 Y  v; v
A.关闭错误报告
& @7 Y1 U$ Y3 a, rB.打开错误日志% U( ^: y$ h+ ?: B
C.关闭错误日志* @( `0 f9 @/ f( W- |% o) _1 G
D.关闭错误显示
$ A0 o6 t: Z  G9 P2 k7 RE.使用@抑错符
6 p$ g" r) F( U& h/ y: D. l3 s& G6 t$ f' z8 q
7 ~& _9 s% A9 l) E2 W6 U) }- o) I
4.______操作符能对操作数的数据类型进行严格的比较?
/ ]1 i3 ~+ K6 Z* \# b+ ?4 L# s' V/ J2 H0 U1 c# h/ b0 L
答案:____________9 ~' X; x3 T: H
. z0 Y3 I" `/ d. ]1 H" \" C

2 A: s0 l( P' A" i4 w% a* v5.操作码缓存(opcode cache)能做什么?
7 o+ H3 q# L% L- b3 o# Q" M3 z) Y! z- V% \- }4 b7 {
A.把脚本编译成二进制对象,使它运行得更快
0 d! \  {& J8 k5 j. `* D! Y7 MB.代替Zend引擎加快解释器的运行
2 z, E5 E; E1 B! z$ F' x) LC.缓存脚本输出以提高执行效率
/ B' t% q; O. i, @; T0 XD.缓存解析器产生的中间码,以提高运行效率
# Q$ s. Z9 L. ^9 d# m1 ?; o0 HE.在内存中缓存脚本,减少从硬盘中读取的次数. u& Z9 P: e/ P# ^: j2 N& O! i

0 G+ J) |. O5 }% }. Z& w: \+ Y
% P+ `3 M% o4 Y, M6.以下哪些情况容易造成系统资源枯竭?(双选)" _$ K  K  B# w4 ?* n( u

" n2 ]. w' u2 J  [# H; gA.RAM太小0 W8 Q; W1 C2 W; S0 i$ v8 D
B.使用了低带宽的连接2 d3 h- n- c1 u) i
C.虚拟内存超过2GB3 p1 V# N( O* W( N! s: k" T/ t
D.允许同时运行太多的服务器进程$ P" ^5 D" U% s/ l
E.以上都不对0 x3 X! e" W# \% `/ ~7 I

6 H2 T( `3 |  X; O5 y, i8 N! K, J$ V0 @+ x
7.以下脚本缺了些什么?(双选) & a) x- _. w' m0 M, s

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

) {6 d8 F% R4 P; ^7 T; A8 FA.参数出口(Parameter escapement), `( Z% j3 x7 S& Q2 u* w
B.输出格式化
( G( Y- S, |6 O3 xC.错误检查
' Y' Q8 r4 X1 K$ G' [) xD.一个SQL查询
8 N& M2 v: T2 I+ I/ aE.以上都不对
; e* _) h( S6 D7 X1 a( m3 `( c. L! u# @2 C0 y* N% R( ^! J8 |
3 t1 v! a, w! v/ J9 S+ R
8.以下那种错误类型无法被自定义的错误处理器捕捉到?(双选)
& @/ T3 ^0 {; E  A# M1 c2 |9 H  u4 r* R9 M# u: C0 |
A.E_WARNING3 _* e1 j. a) U! j$ L1 L
B.E_ERROR
# N! N/ i8 \( K7 U5 |/ B' q4 TC.E_USER_ERROR' w. ]+ L( d  k! ]. J( y. f
D.E_PARSE( w$ _; p3 t0 Y, P# O$ G- S- c/ ]- F
E.E_NOTICE+ B' a* y- c0 q3 k# R
2 @# j+ r) X7 P/ v+ @& u2 a5 |
5 n( o1 M( c  B' e7 o; m
9.当需要比较一个常量和一个变量时,如何才能保证不会错弄成赋值?1 q& f6 z0 J0 F
. A- G; b' |7 m" o
A.把变量转换成int
  z7 Y* l* V$ y2 r9 _- ?6 J' f6 YB.使用全等比较符(===)9 T. X% `  b0 V8 ~
C.确保常量是第一个操作数7 r0 J. T- v  U5 I5 ^4 `! h
D.使用三元运算符  B" n# k4 A% r2 t
E.用括号把操作包起来. J( u9 D/ I5 Y! J. S

: f% U; Q' U, h- w4 O* ^0 i3 C2 t9 h8 p& g, m3 L- ]. G
10.要通过邮件给系统管理员发送错误信息,以下那种方法最简便?
* T- _- e, ^$ |1 x: T9 h
& F7 H  W- e! SA.创建一个连接远程SMTP服务器的函数0 d3 d# g) j& [
B.使用mail函数1 K8 f2 G5 B1 R( c2 A
C.使用error_log函数
3 m0 C# V1 n$ `9 c4 JD.调用sendmial程序
( y1 \2 M/ e) t" {E.使用webservice) X+ e4 p# M+ w; _5 `' h, v
7 S! ?) l" c' ~! y: y) `
% O7 H) ]- E; n6 \1 w
11.能否仅调用一个函数就关闭脚本内所有的错误报告?+ H6 G+ Y6 U' l& f

- Y$ q  z$ W* Y. p* ^$ c$ EA.能
8 f5 o$ o* ]% ?6 \" `B.不能1 o  F( s6 M5 @4 _$ h# I' H, i

' I' V+ V5 p3 ]4 e- u9 |! a2 k# q9 u
12.概要分析器(profiler)是做什么的?. H1 S1 X2 w. B. A% ]5 j1 x

: w5 q- r" `1 C# L) P0 VA.创建关于脚本结构的档案2 O- p0 ]- G) U  y
B.把脚本转化成UML图, Q5 s9 v. |  l7 e, Z  I
C.精确测算脚本不同部分的运行时间$ B/ q% s+ S& x6 V6 r
D.计算脚本通过web服务器执行时的维度6 l) ?$ v+ z9 h' f1 D4 S% P% f
E.扫描脚本,识别由常见错误导致的bug3 i+ n- ^* @: T' J
' j* F4 M6 w5 D" B* o

' o4 P! h- j8 Y# w/ N* w3 `/ g13.______能帮助识别和解决bug。4 @& x3 ?- F: h3 S9 @4 |/ C

& _2 L7 h( T. `$ c% j1 T( q# X答案:____________
5 @. j& D* S$ d7 Q* y0 r% `3 f! v
/ V! L0 O& ^, x
  X" f: V; I. j0 s4 n# S1 K14.trigger_error()和user_error()有什么区别?5 B3 A8 ?/ ~# l5 i4 R
/ |: B9 Y- d4 X2 y  T# U+ a: L
A.trigger_error()允许脚本抛出系统级的错误
, T' z, b* `( {' LB.user_error()允许脚本抛出系统级的错误
% C2 }9 b( K" t5 }9 }C.user_error()不能被用在错误管理器中$ e+ T# K7 {" `! S0 ~
D.trigger_error只在PHP5中可用9 O$ K+ ?/ j: L- [! q1 `& h: \% t1 i
E.没有区别
5 A! g& x! Z( [6 g' \8 e
- E6 I: R$ M# D/ L$ j- h5 S  F$ h" _# Y8 {) t% ~  E) V' {, L& l
15.______函数能返回脚本里任意行中调用的函数的名称。该函数同时还经常被用在调试中,用来判断错误是如何发生的。
1 u# d' Z2 O# g  I7 `! `% D
  ~3 n4 q! |$ c$ T& OA.print_r: R$ G; i1 k; ^) _& R+ K% ~" ~
B.var_dump
- d( ~: Q: t" X0 x3 F1 ^# hC.stack_dump/ Q: ~0 t: v2 t( {+ @; {
D.debug_backtrace
. L5 z0 f& v# ~' h6 @# g/ ?8 gE.以上都不对3 _' D3 }& t2 v) x4 t/ Y9 V8 o! W. S
, U, ]3 x9 R1 {" [0 n* }7 v5 p! K
答案
3 e3 e- O; G8 ]0 z/ j2 W) Q
. V9 I3 n: s6 u( B- @( D- f1.答案是E。三元操作符把每个if语句连到一起,作为&&操作的一部分。然而本题中,$x=1这个赋值只在第三个if为false时发生。如果第一个和第二个条件都不成立,$x=1就不会执行。这题对三元操作的应用有些极端,实际应用时,需要根据可读性来决定是否需要用三元运算符(本题这种情况就最好不要用)。9 `5 b' W6 k2 Q4 w' z
1 o/ w% T. I/ s
2.问题是由第三方数据源传输缓慢导致的,而你无法控制这个数据源。你也许能在网络连通性上做些工作(假设问题出在你这一边)。还可以对接收到的内容进行缓存,这样能减少获取重复数据的时间。因此,答案是B和E。* u- |: J3 X; ^9 R

0 q9 N+ G; o# N$ t3.正确的选择是B和D。如果关闭错误报告、使用@抑错符和关闭错误日志,那么在你交付给客户的网站出现问题时,你将很难进行分析和调试。
8 y8 g  x6 P# g" p" s- J& v5 p* u8 u+ Q/ v
4.这是在描述===操作符。# s: G  r3 o* _  }% Q0 R% C

. f) n' T* _8 J7 }! y$ d5.正确答案是D。PHP脚本在执行时,将首先被解析成“中间”码(也叫opcode,操作码),然后解释器执行。操作码缓存出现在这两个步骤之间,对解析器的输出进行缓存。下次执行该脚本时,将缓存的输出直接送入解释器。这样就就不需要再解析一次了。
8 f. ^/ A1 B2 E6 s4 o. v
- G! k9 ]/ O' y1 J6.正确答案是A和D。如果RAM太小,进程间将出现资源竞争,服务器将大量使用硬盘交换。同样的,如果允许过多进程同时执行,也会使服务器频繁进行交换,导致速度下降。
7 t: w; Q# O: S. G6 ]6 P! X3 L2 @: y4 g* r2 J9 }6 O
7.正确答案是A和C。脚本不检验datebase_query()的调用是否成功,因此将持续执行下去,最终产生错误。此外,$my_id参数没有转义——可能导致代码注入(详见第11章)。+ X, R9 i! j3 C) j' v* m
7 O  D9 ^( R" H; o# g- Y6 E' _8 n
8.答案B和D正确。出现解析错误往往表示脚本中有语法错误,自定义的错误管理器无法捕捉到它们的原因很明显:错误管理器在脚本里,而现在无法解析脚本,管理器也就无法执行。类似的,E_ERROR表示有致命的运行错误出现,比如内存耗尽。因此脚本会立刻被中断,因为解释器无法执行后面的代码。& ^0 d: q% a, P' R/ v
2 N5 Z$ p' Y) o5 N2 s
9.答案是C。比较操作是一个可交换的操作(就是说结果独立于操作数之外),而赋值不是。因此,比如说,$a==10和10==$a是等效的,而$a=10和10=$a却不是,而且后者会导致一个错误,因为这不是一个合法的操作。确保常量在操作符前面,能保证你不会错误得将比较变成赋值。
6 r4 N/ N" Y& E4 H! ^" a1 F- Y) p! C6 y
10.答案是C。error_log函数能将信息送往一个指定的地址。尽管mail()也可以用,但error_log能自动给邮件添加标题,因此这才是最简单的方法。1 l3 {6 E9 {. k4 m& [

8 q! @4 D. `8 A3 r/ a) p) g11.答案是不能。error_reporting函数能关闭所有运行时的错误报告,但对解析时的错误无效,因为解析错误发生在脚本执行之前。+ ?: S# J, o: X6 Y9 r

/ b$ _& Q- r: ^9 J. o$ k12.显然,答案是C。概要分析器(profiler)能监视脚本的运行,并记录单个部分的运行时间。它可以用来找出和解决瓶颈。
, W! R# A0 a8 l0 f+ e1 c
- C  M* X" r/ P6 a0 B13.这是对调试器的完美定义!你可以用调试软件监视脚本运行,同时分析系统资源消耗,从而发现和解决程序缺陷。
5 P& |' d, a0 D3 Q$ G9 h" I; `& b8 z* S& T
14.trigger_error()和user_error()之间没有区别。后者其实是前者的别名。$ h5 y* I8 C) l5 `6 m: z

: ^% x' S; Z1 M% q+ O7 M15.答案是D。题目是在描述debug_backtrace函数,它返回一个由所有在代码的特定位置调用过的函数名组成的数组。

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