Board logo

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

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

作为一个开发者,无论你经验多么丰富,或者无论你多么努力,你的程序中总会有bug。这是生命中一个必然的部分,如同死亡与缴税(尽管并没有后面两个那么严重)。9 G. d3 F7 e3 H. c+ S- _
要想解决bug,首先要能找到bug。事实上,许多开发者花费了无数小时茫然得盯着代码,只是因为他们没有把程序的容错能力摆在首位。忽略了这个部分,那么期望一个没有bug的程序就是——不可能的。
- t) M: R; m4 v( J% X1 Y" k本章测试题将考察你对调试和性能管理相关知识的了解,以及如何用PHP做好这两件事。- `, _" e1 g* j" ^. A

# `) z% e2 G7 Q& ~
5 R1 u2 L3 P; B1 W6 c' A问题/ `) u; P, V+ }0 r- Y  k" N

) c) o' p. k/ x6 ~6 d; M3 m, R1.以下脚本如何用三元操作替代?
. k" e% c! H4 H7 {$ ?1 [' k2 O

  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. ?>
复制代码
( p) t" w9 ^9 }$ U8 l( v* F
A.$x = ($a A. < 10 || $b > 11 || $c == 1 && $d != $c) ? 0 : 1;
# ?+ I) D' n: M/ U8 b$ A7 e( QB.$x = ($a < 10 || $b > 11 || ($c == 1 && $d != $c)) ? 0 : 1;+ C" S2 l+ F2 o5 h
C.$x = (($a < 10 && $b > 11) || ($c == 1 && $d != $c)) ? 0 : 1;
7 q$ L5 s) M) N5 P8 B$ ^$ ]D.$x = ($a < 10 && $b > 11 && $c == 1 && $d != $c) ? 1 : 0;1 w( R$ y6 e' e- ^4 K7 w
E.以上都不对, Q5 B: P$ R' l7 t; S
* X/ V; e  h! ^/ v
" v1 l* Y. i& P. c$ p  m% h( w
2.有一个脚本由于要从远程获取数据,因而运行速度很慢,以下那种方法能对其进行优化?(双选)
$ E5 C, ~  H) D7 q: Z/ o! V) i0 _5 k7 Q# S5 y' M
A.安装操作码缓存(opcode cache)3 C; D7 I& T8 o/ F- _
B.优化或者升级你的网络连接
+ u" |4 A8 c, e, {+ _C.添置更多的硬件
$ G7 {% G- V7 Z# e; nD.增加服务器的可用RAM
8 X1 F9 Y( f# ?+ H' p. O+ JE.使用连接缓存7 L) f/ H1 ?) n/ n: v
7 T# g; }4 L3 P5 `* {7 ~
% K% e& ^- e) @) ~6 T* I
3.架设生产环境下的服务器时,需要做哪些步骤?(双选)
# N& r/ p" Y* B# L+ H0 S8 y* O  A$ a
A.关闭错误报告
0 @" p3 ?* J1 vB.打开错误日志1 s! O$ K2 S2 Z  B6 {& V3 {5 o/ {
C.关闭错误日志
9 I, r' E: D& hD.关闭错误显示
$ q1 v& `( Y# h* l+ R2 }- M" `E.使用@抑错符6 R6 J1 \3 O8 a: }- B7 ~4 U  H8 n

% z5 ], b! D- T3 b5 G6 P6 q( ^) |/ ^7 k; c
4.______操作符能对操作数的数据类型进行严格的比较?% o3 x& e% K5 t# t

7 {: z, v! Y% n# L8 M* m. q$ R答案:____________  C* V1 n7 S  c* D7 q4 N

/ L. l; S) B* g$ A5 o6 K5 s1 n  x! u
5.操作码缓存(opcode cache)能做什么?. c; B, M  m% |$ V6 |

9 ~7 {8 D3 }2 z5 V- F) ~; B" A4 S( Y: oA.把脚本编译成二进制对象,使它运行得更快3 g7 S6 Y$ q7 f% D: ]* r
B.代替Zend引擎加快解释器的运行% I, e4 x, ?1 |" s+ h
C.缓存脚本输出以提高执行效率
$ j: E' f4 b, Q* X3 [2 V6 AD.缓存解析器产生的中间码,以提高运行效率
: i0 e- v' p/ [; N" V) |E.在内存中缓存脚本,减少从硬盘中读取的次数, n. E1 X1 D4 W% j0 J+ y

4 E; L3 O5 w3 M  c. l& b& W- N
8 y+ [( r& F% ]' x6.以下哪些情况容易造成系统资源枯竭?(双选)  {- D% u- A% N6 ]/ X* s

$ z+ t4 B4 J8 [, F3 w# VA.RAM太小
; Y( `5 b; G, ?! g4 a8 lB.使用了低带宽的连接
# h3 O+ n3 d, d# [) h/ UC.虚拟内存超过2GB
1 i- l! c( L/ K5 b8 ^% TD.允许同时运行太多的服务器进程% Z; `/ h9 V, ~& a* E1 \
E.以上都不对3 n$ V/ R/ ?+ ?1 b
% Z- {$ L* z' O& {
. r( H6 L2 L+ Z. S6 p
7.以下脚本缺了些什么?(双选)
2 i6 X6 r+ T1 H

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

! h5 z# J: U1 ?7 YA.参数出口(Parameter escapement)
9 ~% I7 P" J: Z5 ^B.输出格式化  w" |+ x5 S% M, `( ]9 F* q- s
C.错误检查; T+ O$ g; ]; s' K; A9 a% D5 x
D.一个SQL查询
3 ]" z; V5 [$ N1 H5 k) y$ bE.以上都不对
' z7 {% v7 G. j( S) r; {
7 U8 M& K, z7 H4 m4 A/ k
8 e2 P; S# e0 {* n3 \4 H5 j, v* `6 Q8.以下那种错误类型无法被自定义的错误处理器捕捉到?(双选)
5 I  S, C% [% E4 K; u; r% _$ y% p( _
A.E_WARNING' I& M: R8 h1 g
B.E_ERROR' S9 R: b/ O+ z: i
C.E_USER_ERROR. d+ c1 }- @( A. b: p7 v
D.E_PARSE
- q# A6 ?1 n2 T1 \% Z1 n& UE.E_NOTICE& U- q; X9 O3 x5 P+ g1 _# n# r) d! z

. r8 C/ Y3 b4 d* U. d8 Z* f( D7 l) A3 R. q& c
9.当需要比较一个常量和一个变量时,如何才能保证不会错弄成赋值?$ M5 B7 f" c0 V/ k, W8 W% D+ a
' r, z" n' v2 W
A.把变量转换成int4 j1 K3 Y4 p( y8 R, c  s
B.使用全等比较符(===)
& |* G' K: Z# f9 L2 G) F: q: eC.确保常量是第一个操作数
' S- g3 ]: q) o( i0 T/ kD.使用三元运算符5 a1 Z1 l% C' D# y! [
E.用括号把操作包起来( `4 w3 B$ n0 F% A! G5 a/ g

% q' l- E& q" K! Q! W$ T7 M+ o/ [0 T% p2 `, S: T: f
10.要通过邮件给系统管理员发送错误信息,以下那种方法最简便?/ h7 ?& J: e& f4 h# N. J' ?) L

" C; r" z9 y: N4 \) jA.创建一个连接远程SMTP服务器的函数
, {1 F( g( M  z. E; J  A1 ~B.使用mail函数6 T& x" f, f4 n3 O8 o  }3 T* _# R3 z
C.使用error_log函数" B! p  ]: O5 [+ A3 N7 h' m5 J4 v
D.调用sendmial程序$ E8 `& S; Y( d# j/ y
E.使用webservice
1 D% m3 s4 N  j) |5 @
1 n/ m: U' q- q9 l; z% G( I' f, p, l: l5 n6 G- R
11.能否仅调用一个函数就关闭脚本内所有的错误报告?! i+ I  M7 O' X, Z+ C0 D2 L
- [5 y( S4 w" a7 b
A.能( y- O! |; V7 i
B.不能  s8 h- c; G6 x

3 X( z- I1 I$ U/ J/ I  E
' Q& c4 y0 Y6 v! M/ m% ?# b2 w8 V, N12.概要分析器(profiler)是做什么的?
: }% F% z/ T6 R: Z2 I- Z, |4 W" V4 L! i# F, }
A.创建关于脚本结构的档案* |0 v; F# a0 H
B.把脚本转化成UML图' \0 p# x) ]% t* H* e  g$ q; B$ n
C.精确测算脚本不同部分的运行时间: P3 y* I: L: B) g( X/ u. N
D.计算脚本通过web服务器执行时的维度
* L: i! c1 r9 x  d+ o, UE.扫描脚本,识别由常见错误导致的bug8 o( g5 d7 q: d& M
$ S; A8 w% ?$ z) Y8 Y" y

1 |) W! J( g0 f& v; Z13.______能帮助识别和解决bug。
  u6 P) u  l" W* Y- B) @. B/ F
7 D5 }5 h# ]5 o  c答案:____________
4 P/ h. f4 @5 \/ ?7 X, D) [
( X- J  \! a( v+ g. y% `3 v* Y% W. R' b
14.trigger_error()和user_error()有什么区别?
: |9 ]# h! J: z+ e/ J6 G- T
- v7 F9 f& t( m7 V3 `* K% OA.trigger_error()允许脚本抛出系统级的错误, \& i3 ?9 u2 r, M6 V, m) A
B.user_error()允许脚本抛出系统级的错误$ I4 ?& g  f0 N
C.user_error()不能被用在错误管理器中
4 B. K% [5 D; J; [4 `D.trigger_error只在PHP5中可用* o5 M. H- K% y$ Y
E.没有区别
6 k; @" i! k9 g% n
, `$ L5 y( p* j
8 N) V! r  z2 n( f15.______函数能返回脚本里任意行中调用的函数的名称。该函数同时还经常被用在调试中,用来判断错误是如何发生的。
) a# W$ `" g( O1 f( Z2 L) r6 k2 t0 K1 p, E, O( y
A.print_r
0 L+ F8 d7 ?. l  a' @1 xB.var_dump
+ A  `$ O; @, q4 R: o" O& zC.stack_dump
9 l( t! ~' e4 fD.debug_backtrace
8 |: C$ V' ~0 ]8 `$ V8 D5 B7 A& V$ \E.以上都不对/ K' L0 w+ [5 M, ~- R

! V7 Z/ P' E" D+ N5 E% h7 I" h答案
6 M2 \; n) ?9 ]& N4 a1 b% i- W% u+ ^5 n% c$ k
1.答案是E。三元操作符把每个if语句连到一起,作为&&操作的一部分。然而本题中,$x=1这个赋值只在第三个if为false时发生。如果第一个和第二个条件都不成立,$x=1就不会执行。这题对三元操作的应用有些极端,实际应用时,需要根据可读性来决定是否需要用三元运算符(本题这种情况就最好不要用)。  y- t4 Y0 Q- Y# Y$ t

! j: g- k. Q2 y% L2 L( Z2.问题是由第三方数据源传输缓慢导致的,而你无法控制这个数据源。你也许能在网络连通性上做些工作(假设问题出在你这一边)。还可以对接收到的内容进行缓存,这样能减少获取重复数据的时间。因此,答案是B和E。
" j" E1 b/ s' p9 s- c: X' o
; ~+ D' \1 X% n3 X3.正确的选择是B和D。如果关闭错误报告、使用@抑错符和关闭错误日志,那么在你交付给客户的网站出现问题时,你将很难进行分析和调试。) W; ]3 i  W# J; u9 O$ h
& [( C% ?4 p! F* D1 o% x, f# y
4.这是在描述===操作符。
( ?6 Q5 {+ Q. \# q- z
& y4 q, h- `* b0 y8 F4 g5.正确答案是D。PHP脚本在执行时,将首先被解析成“中间”码(也叫opcode,操作码),然后解释器执行。操作码缓存出现在这两个步骤之间,对解析器的输出进行缓存。下次执行该脚本时,将缓存的输出直接送入解释器。这样就就不需要再解析一次了。
# `3 }5 t  [: G" K' u
8 M9 C2 X" t! F6.正确答案是A和D。如果RAM太小,进程间将出现资源竞争,服务器将大量使用硬盘交换。同样的,如果允许过多进程同时执行,也会使服务器频繁进行交换,导致速度下降。3 o- w9 q' r: r
0 ?. f, ^: [; j9 z6 }
7.正确答案是A和C。脚本不检验datebase_query()的调用是否成功,因此将持续执行下去,最终产生错误。此外,$my_id参数没有转义——可能导致代码注入(详见第11章)。
: f$ w& C2 O) w- j/ I/ X
/ X4 s0 f8 r. q8.答案B和D正确。出现解析错误往往表示脚本中有语法错误,自定义的错误管理器无法捕捉到它们的原因很明显:错误管理器在脚本里,而现在无法解析脚本,管理器也就无法执行。类似的,E_ERROR表示有致命的运行错误出现,比如内存耗尽。因此脚本会立刻被中断,因为解释器无法执行后面的代码。6 C) a7 [+ B9 s. f+ L
4 |- _& ^$ \- G4 w, L9 |  U* O
9.答案是C。比较操作是一个可交换的操作(就是说结果独立于操作数之外),而赋值不是。因此,比如说,$a==10和10==$a是等效的,而$a=10和10=$a却不是,而且后者会导致一个错误,因为这不是一个合法的操作。确保常量在操作符前面,能保证你不会错误得将比较变成赋值。
4 E3 e& j( _, Y! l1 }
0 m0 e( P2 P' I9 N- p5 l. ~10.答案是C。error_log函数能将信息送往一个指定的地址。尽管mail()也可以用,但error_log能自动给邮件添加标题,因此这才是最简单的方法。
# h" X& J  h! P* V
9 W( U! K3 `, c11.答案是不能。error_reporting函数能关闭所有运行时的错误报告,但对解析时的错误无效,因为解析错误发生在脚本执行之前。6 s1 G& E& _  S/ h" }

/ d1 E+ C( w/ v' a# V1 s5 _: L12.显然,答案是C。概要分析器(profiler)能监视脚本的运行,并记录单个部分的运行时间。它可以用来找出和解决瓶颈。  R2 z( u( i" ^: K5 t' E4 `

( `7 M) s+ b0 [- ]13.这是对调试器的完美定义!你可以用调试软件监视脚本运行,同时分析系统资源消耗,从而发现和解决程序缺陷。7 k' t7 u# O  p- w. h
) E- G8 S3 Z: b' p6 F5 E
14.trigger_error()和user_error()之间没有区别。后者其实是前者的别名。) G4 Q4 o3 Q8 F. b6 f
0 H0 Q/ f4 j( N" P; ^3 i
15.答案是D。题目是在描述debug_backtrace函数,它返回一个由所有在代码的特定位置调用过的函数名组成的数组。




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