Board logo

标题: [Zend权威认证试题讲解]第十二章 -调试与性能管理 [打印本页]

作者: admin    时间: 2008-5-30 14:32     标题: [Zend权威认证试题讲解]第十二章 -调试与性能管理

作为一个开发者,无论你经验多么丰富,或者无论你多么努力,你的程序中总会有bug。这是生命中一个必然的部分,如同死亡与缴税(尽管并没有后面两个那么严重)。6 K' E: Q. A" o
要想解决bug,首先要能找到bug。事实上,许多开发者花费了无数小时茫然得盯着代码,只是因为他们没有把程序的容错能力摆在首位。忽略了这个部分,那么期望一个没有bug的程序就是——不可能的。4 ^' g  P, u) @- J, e- a: r! z  m+ n. k
本章测试题将考察你对调试和性能管理相关知识的了解,以及如何用PHP做好这两件事。! u, l- O0 T& U  I5 O
1 W! z9 g0 j8 i2 g0 O. L& J, ?

; S6 ]" o( x8 r+ w  T问题2 D0 W' f5 L: L

' e3 ^% F3 }; }8 M5 ]7 L& v# w" d1.以下脚本如何用三元操作替代? 8 ?: g; W- X- |- d. z

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

" y1 @& M! j' G+ p; k+ y" wA.$x = ($a A. < 10 || $b > 11 || $c == 1 && $d != $c) ? 0 : 1;0 y7 X: C  d% Z
B.$x = ($a < 10 || $b > 11 || ($c == 1 && $d != $c)) ? 0 : 1;" g! P: ^6 M! X# ~! W
C.$x = (($a < 10 && $b > 11) || ($c == 1 && $d != $c)) ? 0 : 1;
3 P! u: T! U$ f. a! OD.$x = ($a < 10 && $b > 11 && $c == 1 && $d != $c) ? 1 : 0;
7 g2 G* C0 x+ u9 q, NE.以上都不对2 U% x( t, e9 k0 d2 T

6 m4 R+ ?- ?$ v0 h5 |
. r0 Z% o) y6 @! J5 k( M2.有一个脚本由于要从远程获取数据,因而运行速度很慢,以下那种方法能对其进行优化?(双选)
2 u: |6 y, \$ [& @5 s8 w  v( S" P+ C* P% p
A.安装操作码缓存(opcode cache)
0 {5 _# M/ t: N* S% v# b2 BB.优化或者升级你的网络连接
7 u5 _, M3 \, k) D3 aC.添置更多的硬件+ Z6 |0 a7 I& i8 o
D.增加服务器的可用RAM' C: M/ M5 N5 w+ K) x/ o, x( i
E.使用连接缓存9 ^: _3 [5 E$ q3 A% I6 E" }" R
1 h0 F1 A: K! ?; l5 q6 {: L0 d# O

$ t, i  i3 c# `5 U' X& v9 C3.架设生产环境下的服务器时,需要做哪些步骤?(双选)
! K! N/ n/ I3 v+ d9 }+ N
! i9 R0 n  u4 }) _2 P7 x; v' CA.关闭错误报告, a8 \! q7 z, z" S' n4 n+ O1 L9 c
B.打开错误日志
3 G. r8 a3 R; _" v( G8 t; y9 lC.关闭错误日志5 ~0 g/ Q1 T! |  I( t/ E- Y1 l
D.关闭错误显示0 K& R: Y8 n# }# S, N, @" ]6 l
E.使用@抑错符) ?9 D! A; v+ M( n3 g0 C  @
1 n9 ?/ `" P0 J& G# V

+ w6 z9 e  v! [2 i7 d: K4.______操作符能对操作数的数据类型进行严格的比较?" c# }) |; Y; F

) H0 X: x) K* l3 \% f( W答案:____________
# B0 E& }9 {; i  e) `& T% r4 {
% |) ~7 `' F* e2 N4 H  @, z8 j1 o: H( _$ s
5.操作码缓存(opcode cache)能做什么?. F3 H* f; N. W; N9 S

2 p! k! ^( `! hA.把脚本编译成二进制对象,使它运行得更快
. D8 a7 p5 ]$ @2 F, r, mB.代替Zend引擎加快解释器的运行+ o* m" i3 T8 K' U1 @! U
C.缓存脚本输出以提高执行效率
/ q$ v* \: Y+ j" Z, @" rD.缓存解析器产生的中间码,以提高运行效率
, u1 k4 |; |' W  T6 j0 a0 X" l* lE.在内存中缓存脚本,减少从硬盘中读取的次数" y; G* R* R$ {. v+ o- s) i

& N: ~7 ?" X  j- q
2 Y; c7 W) h  H8 V& H0 G7 W4 ^6.以下哪些情况容易造成系统资源枯竭?(双选)
9 j# F5 Q( T2 I( d: A( A  f/ L  g6 V' [1 S* `
A.RAM太小
7 l6 }& r+ _  n9 Y* aB.使用了低带宽的连接' S/ v( O3 Z; h0 U4 [/ T: k2 L3 g
C.虚拟内存超过2GB/ @. \, E; Q9 l& b& L  w- B
D.允许同时运行太多的服务器进程
  |( V! v+ x5 O$ n7 y7 |E.以上都不对3 g4 Z9 R8 u9 j# n- K1 i
" @: n  H# D5 Y$ k; U

% I# O& m" L7 J* ^7.以下脚本缺了些什么?(双选)
$ n% T2 R' m# G( l6 I# f

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

. V6 R! Y7 A3 j3 x5 WA.参数出口(Parameter escapement)# D0 P/ o& G- n5 `
B.输出格式化
- ^9 Z% y! e2 I! L& f. E: RC.错误检查
& S2 Z: Z4 j, P5 K8 @- H' K6 |: XD.一个SQL查询
# @: @6 ]" I( F4 A% }  fE.以上都不对
4 k! z8 r2 j4 a9 t
$ V+ o8 ~! F% k# m5 i: C* }7 `9 v$ Y+ j& v( r. N' l0 m6 s3 i
8.以下那种错误类型无法被自定义的错误处理器捕捉到?(双选)
* E/ ]! Y+ x* b7 y# b
2 s. T- E7 a, A5 [. g3 t' B( cA.E_WARNING9 h1 b8 [1 W6 M; B8 I
B.E_ERROR: Z. O8 X+ {, U! t
C.E_USER_ERROR! U3 }# D6 ]& a: t+ K8 o' q# w
D.E_PARSE& H8 H" @" C( r; T7 x! J
E.E_NOTICE, J9 c7 W; \$ _+ f2 l3 d
) S, |2 H6 }( B7 ^6 V
8 r$ S- p6 v+ p2 D: g# N. |! z/ w# Y
9.当需要比较一个常量和一个变量时,如何才能保证不会错弄成赋值?& b7 L  v- w: m# J

8 M+ W! F6 P2 bA.把变量转换成int
" y+ B( ?5 T7 ]- V* j5 @! {2 G3 XB.使用全等比较符(===); T3 V$ @! w. H9 }+ ~, |4 k8 c
C.确保常量是第一个操作数
9 S' O; `* H' @4 k  e; fD.使用三元运算符
. ^! W, M( P- M7 F6 m" G6 RE.用括号把操作包起来
* y/ A1 W" V3 X1 j$ m2 ^
  o% k0 d6 i4 V  Y! Y5 j# d8 E/ v
- \6 s$ x8 Y2 g9 }10.要通过邮件给系统管理员发送错误信息,以下那种方法最简便?  ?# Z+ K9 W2 ]' L* E* G: \0 C: u
. b+ u4 o! W8 i" p. C3 J
A.创建一个连接远程SMTP服务器的函数
" M2 h  g5 S0 s9 }1 AB.使用mail函数. }9 Z0 p8 c4 |7 u
C.使用error_log函数5 h( w4 @! _% l0 b0 ^
D.调用sendmial程序* h- W1 w, e' f, O3 h
E.使用webservice
% M* [$ A  h$ N3 i/ m! J4 Q4 g1 f( |+ B4 |
& q, `7 V* t& f* S  a+ U
11.能否仅调用一个函数就关闭脚本内所有的错误报告?
7 ]; m$ g  c$ w& z
" |& @0 w: j, e, l6 X3 W% RA.能
. g0 E$ p2 a' J3 @8 zB.不能* {' s8 ]7 ^5 s; E* `

7 t( V. q: z1 P! F" k& G! W% }2 R) u& E6 i6 C  R3 p, |. Z
12.概要分析器(profiler)是做什么的?
! C0 A9 R* O8 N- y' }' k5 J4 N0 Q4 W
A.创建关于脚本结构的档案
+ B# M% D( F# K. k  t# ~/ m6 VB.把脚本转化成UML图. L- |  E) T4 e# i/ y9 S# i
C.精确测算脚本不同部分的运行时间
+ k7 l& U# T' \4 }2 uD.计算脚本通过web服务器执行时的维度- ]6 r  n  z/ ]6 }
E.扫描脚本,识别由常见错误导致的bug" L; z( u4 b  S
+ U3 s* ~% Q* k4 ]3 I

! E* k; N* }5 f* @; ^13.______能帮助识别和解决bug。
% Q' e" ^7 H: d" A) r/ a' v. ~! \7 j
答案:____________
1 ?+ T/ F5 X; j0 X5 t3 J) U% g) D- r

9 x( E9 d+ A9 N/ T0 [14.trigger_error()和user_error()有什么区别?# v7 K) b! X% n" o
! R7 f% P8 [6 [" G
A.trigger_error()允许脚本抛出系统级的错误5 T1 t2 W6 a8 {/ H
B.user_error()允许脚本抛出系统级的错误
. m( T: G; i* R6 MC.user_error()不能被用在错误管理器中
. @, c% f3 h: |  X- M# J% z. hD.trigger_error只在PHP5中可用
# \8 r. k4 s9 ~  m7 w# dE.没有区别
* c- c0 W  J9 T# f4 Y: y' }' o, ?2 s6 F, v+ J' Y( `8 F8 B

1 s, a0 x# s. \' q15.______函数能返回脚本里任意行中调用的函数的名称。该函数同时还经常被用在调试中,用来判断错误是如何发生的。$ K" z* x/ ~( _& d3 Q. l1 f

% O3 l1 Z' ~/ @7 }/ n' mA.print_r
0 R- h5 o3 K8 ?5 XB.var_dump
/ K# r2 |; `" y/ w* r$ b0 SC.stack_dump) p7 T3 y2 }  t  {/ `
D.debug_backtrace
) l4 ~( p- ]5 r# cE.以上都不对( P3 J: u. p! T1 T& e

. i! ]# ?% h3 Q$ n答案
; x' H: F" _+ {- M' {5 s
9 h% L, R$ t: N5 y0 T7 @8 b5 ?1.答案是E。三元操作符把每个if语句连到一起,作为&&操作的一部分。然而本题中,$x=1这个赋值只在第三个if为false时发生。如果第一个和第二个条件都不成立,$x=1就不会执行。这题对三元操作的应用有些极端,实际应用时,需要根据可读性来决定是否需要用三元运算符(本题这种情况就最好不要用)。+ a& I( a: H+ b/ {( y  G! g( M

$ I* {, [' E& J$ B/ \, B3 l4 Z0 O2.问题是由第三方数据源传输缓慢导致的,而你无法控制这个数据源。你也许能在网络连通性上做些工作(假设问题出在你这一边)。还可以对接收到的内容进行缓存,这样能减少获取重复数据的时间。因此,答案是B和E。
9 v* j6 U8 T& e$ ^6 l7 }
, a; f$ E2 I9 s: e; N3.正确的选择是B和D。如果关闭错误报告、使用@抑错符和关闭错误日志,那么在你交付给客户的网站出现问题时,你将很难进行分析和调试。# r% X8 X# ^, m, B7 Y, V$ q

  P6 z% f/ V5 y0 b9 h6 q4.这是在描述===操作符。3 ^5 P  z' i' ]( N: `. ^5 j
4 m1 M! F( ]* p% @' w8 r) j
5.正确答案是D。PHP脚本在执行时,将首先被解析成“中间”码(也叫opcode,操作码),然后解释器执行。操作码缓存出现在这两个步骤之间,对解析器的输出进行缓存。下次执行该脚本时,将缓存的输出直接送入解释器。这样就就不需要再解析一次了。/ M' G4 r& s5 Z3 X

& W; \& W% w1 @$ u5 P; t* R6.正确答案是A和D。如果RAM太小,进程间将出现资源竞争,服务器将大量使用硬盘交换。同样的,如果允许过多进程同时执行,也会使服务器频繁进行交换,导致速度下降。
' ?/ C8 c7 {& F6 p1 }. \6 _$ J6 A  k8 i2 M. _! X; t4 v
7.正确答案是A和C。脚本不检验datebase_query()的调用是否成功,因此将持续执行下去,最终产生错误。此外,$my_id参数没有转义——可能导致代码注入(详见第11章)。
! J8 S% }! L& @: `* o* k8 ~3 r/ G1 R4 `
8.答案B和D正确。出现解析错误往往表示脚本中有语法错误,自定义的错误管理器无法捕捉到它们的原因很明显:错误管理器在脚本里,而现在无法解析脚本,管理器也就无法执行。类似的,E_ERROR表示有致命的运行错误出现,比如内存耗尽。因此脚本会立刻被中断,因为解释器无法执行后面的代码。
- i$ M' q) }" x, v" N# x. F6 }! X2 q8 Q9 f
9.答案是C。比较操作是一个可交换的操作(就是说结果独立于操作数之外),而赋值不是。因此,比如说,$a==10和10==$a是等效的,而$a=10和10=$a却不是,而且后者会导致一个错误,因为这不是一个合法的操作。确保常量在操作符前面,能保证你不会错误得将比较变成赋值。
) B) F  H; Q1 d* E& N& Z, v# q1 t% t, a! @4 H
10.答案是C。error_log函数能将信息送往一个指定的地址。尽管mail()也可以用,但error_log能自动给邮件添加标题,因此这才是最简单的方法。- N9 i( Z. L4 w$ \

) e/ p5 @! {/ K' t" ]9 N11.答案是不能。error_reporting函数能关闭所有运行时的错误报告,但对解析时的错误无效,因为解析错误发生在脚本执行之前。
7 \! k! P) E8 g6 N# b, x( m* t
- N, t  D+ {3 O; o12.显然,答案是C。概要分析器(profiler)能监视脚本的运行,并记录单个部分的运行时间。它可以用来找出和解决瓶颈。: W: T8 z7 @$ K% w0 n
  o& g, O. ], Z, y. Y
13.这是对调试器的完美定义!你可以用调试软件监视脚本运行,同时分析系统资源消耗,从而发现和解决程序缺陷。
( Z3 Y# Q2 E  Z- \6 ^$ ?6 m
! D6 b% C5 e- l  q8 q14.trigger_error()和user_error()之间没有区别。后者其实是前者的别名。  ^3 Q+ X) `, p1 Z& i

1 y, Y/ }* i0 W7 P0 @0 M( l' k5 H* \15.答案是D。题目是在描述debug_backtrace函数,它返回一个由所有在代码的特定位置调用过的函数名组成的数组。




欢迎光临 捌玖网络工作室 (http://89w.org/) Powered by Discuz! 7.2