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

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

作为一个开发者,无论你经验多么丰富,或者无论你多么努力,你的程序中总会有bug。这是生命中一个必然的部分,如同死亡与缴税(尽管并没有后面两个那么严重)。; U$ I# b! {0 s7 p5 I5 e" f( y
要想解决bug,首先要能找到bug。事实上,许多开发者花费了无数小时茫然得盯着代码,只是因为他们没有把程序的容错能力摆在首位。忽略了这个部分,那么期望一个没有bug的程序就是——不可能的。
8 ?7 `' b( w. F+ B本章测试题将考察你对调试和性能管理相关知识的了解,以及如何用PHP做好这两件事。
: P" l- V+ _6 y3 u, u  Z* t2 {& e& m3 E' c% J1 p2 c+ Y* g8 P
6 K  \) c" ?* R' N, ~9 c
问题# j1 W( E- M1 ~+ s* A3 B% J- \# S

$ N  I7 W) R; S) D5 L1 e+ ?* h3 k: {+ G1.以下脚本如何用三元操作替代?
5 U" R& U6 e8 ?) F6 ~9 ?: h

  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. ?>
复制代码
- h. x3 m3 x  H. p3 j- R- t, X
A.$x = ($a A. < 10 || $b > 11 || $c == 1 && $d != $c) ? 0 : 1;
* @% c1 S2 u% u1 G( fB.$x = ($a < 10 || $b > 11 || ($c == 1 && $d != $c)) ? 0 : 1;
: C. m' L5 O) _" tC.$x = (($a < 10 && $b > 11) || ($c == 1 && $d != $c)) ? 0 : 1;
$ G$ t! V0 b" }0 {6 oD.$x = ($a < 10 && $b > 11 && $c == 1 && $d != $c) ? 1 : 0;
6 |+ K* N* Q- S4 q- CE.以上都不对
- d5 Z  F; P, Q9 ^
2 ?4 n: @8 ^# Y" }1 {* G: z* D$ u, M6 l
2.有一个脚本由于要从远程获取数据,因而运行速度很慢,以下那种方法能对其进行优化?(双选)# K; O$ t% A* L# D
! g4 B% M  z* _- u3 ~
A.安装操作码缓存(opcode cache)
  B" Q/ ~* @; S  U$ r: \2 v: w1 [; IB.优化或者升级你的网络连接0 _  z; j' F0 Y' w" {0 e+ o: H
C.添置更多的硬件
1 u8 E& a, z! W# W" [4 iD.增加服务器的可用RAM
5 J: y$ r' Q, m3 G! JE.使用连接缓存; x# E- y% _# i9 M: u1 N$ }
6 w$ U2 s& Q/ d& U! A" i
! t& t& p8 p# O; Y" B0 z9 A  ]
3.架设生产环境下的服务器时,需要做哪些步骤?(双选)
, L! l4 z8 q& [* S/ T4 E! q- G( N
! l3 e% ?: H1 C- yA.关闭错误报告
+ S2 G" M; M9 N8 W7 d; A+ @B.打开错误日志$ L  q8 y4 E* i0 Y. c* n, P; b
C.关闭错误日志
& [, Y8 y( v# }D.关闭错误显示5 e( Q8 C( b, k5 B1 {4 W& m
E.使用@抑错符- g$ i2 m1 H  r' q+ c8 H
3 `. U+ @9 c, d& ]% `2 r! x
; F: I+ y/ r3 B) V0 j+ G) D) b5 K! h
4.______操作符能对操作数的数据类型进行严格的比较?9 M! B8 A  n- ~
* ^5 y! W+ N+ K. L& r0 p
答案:____________+ |6 M: |0 f+ u: Q& }2 g

2 e: s) p; c% Q1 U, g) z- y& |$ B
* p3 w0 `2 [6 h9 ]5.操作码缓存(opcode cache)能做什么?
2 N) e6 I  s* G9 B) C& d/ v1 ]2 Z& d
A.把脚本编译成二进制对象,使它运行得更快7 [$ f) l1 p: C( @' ]7 q
B.代替Zend引擎加快解释器的运行
8 b1 b  \5 |% N, jC.缓存脚本输出以提高执行效率! s) w! ]5 P, c% Y
D.缓存解析器产生的中间码,以提高运行效率4 O6 e9 f) E" g" j( I$ ]' D
E.在内存中缓存脚本,减少从硬盘中读取的次数
" d: k2 w8 D5 K
( i1 c8 y& d' G0 u/ X
+ I3 @8 f& K; \+ |$ a2 z6.以下哪些情况容易造成系统资源枯竭?(双选)
& J$ @  n, R: v+ M, c. h- h+ u! ]# W
A.RAM太小
! A' h8 d1 ^# nB.使用了低带宽的连接
3 Z7 f* ~% B; xC.虚拟内存超过2GB
, M( y  H0 A: H2 h0 fD.允许同时运行太多的服务器进程4 w/ p* @) {- C9 |& s$ p
E.以上都不对- p+ r& k& C& k) U9 P7 b% Y
/ a, e' _4 H3 H* a! k& {
: @& ]- G4 f5 [; K8 L0 q
7.以下脚本缺了些什么?(双选) 3 a3 c- c# @8 k( T

  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. ?>
复制代码
$ S5 A# b5 y+ L- W5 b
A.参数出口(Parameter escapement); p/ R0 C3 T* ?; `# j5 i
B.输出格式化! L" x1 o0 f0 J# @* l  l! T
C.错误检查$ V) C% L& F0 c7 m. k6 _* E7 D
D.一个SQL查询1 H. f) N4 T# }: h5 I. e  B
E.以上都不对: N2 `# \, `1 j4 L% V0 h+ z3 D

3 R; Q" g. e  G4 n; U) Z7 V3 @/ N9 Z
8.以下那种错误类型无法被自定义的错误处理器捕捉到?(双选)" l$ O2 J& g. W" j- @3 p& a
) R' g. `! y0 l; I9 [( X
A.E_WARNING. ~% ^8 v  ~# L9 o+ v8 \- E
B.E_ERROR# Z7 P: F4 U- _1 ^; e
C.E_USER_ERROR
; V" A/ S! M8 B/ ND.E_PARSE
3 @5 J7 R$ j7 A1 bE.E_NOTICE
# [5 Y5 `+ x1 a: @4 L: r7 Q0 u4 P. X$ O) A5 P

! s  m0 W% Q: O9.当需要比较一个常量和一个变量时,如何才能保证不会错弄成赋值?
9 d2 q: I6 ]) L% j
$ ]4 a5 c1 W5 l1 [! K. CA.把变量转换成int
! q# b0 ~5 g1 bB.使用全等比较符(===)6 Z; D; F2 z7 x4 `4 W0 u1 b
C.确保常量是第一个操作数
6 D2 ?" o" ?* Z* J) pD.使用三元运算符9 o$ A' W6 G; U5 E3 E; G9 i
E.用括号把操作包起来: x1 A, G( l3 ~/ U( o9 z4 i

1 d; e. E5 Y# a1 d0 m% \( O! e: F; n8 Q# w- @& J& k! c7 w3 i
10.要通过邮件给系统管理员发送错误信息,以下那种方法最简便?; L4 \, G9 S  }1 W% f  }( b2 [1 c

9 V" n; j; z2 A- W2 D* K% Z2 J4 pA.创建一个连接远程SMTP服务器的函数" J4 ^9 ]5 i- ^5 Y6 f9 K0 K
B.使用mail函数
! K$ c! N0 v+ R& xC.使用error_log函数
( g: D4 E" S0 I# ~1 R1 S5 UD.调用sendmial程序+ ^4 s/ y9 o! D
E.使用webservice
9 x) [/ n6 N7 s! n
$ h4 ]: ?$ \" j: E! j% O
" A! @9 [& f9 X; T6 E8 g8 P' o" a11.能否仅调用一个函数就关闭脚本内所有的错误报告?
. B. B* ~; P3 Z8 J4 I2 G
" K( X8 v. V7 O5 WA.能' o  ?1 r- o7 p! [7 r: J
B.不能7 D+ e- D& ~( @, R3 a

. T+ c( R1 N4 h7 N' j0 }' b! A. h) V4 E+ `
12.概要分析器(profiler)是做什么的?
1 G) A' W$ M8 z& y0 u5 ?/ x. z. T. P/ K; @7 L
A.创建关于脚本结构的档案( Z0 H% b) @6 z3 I0 ?, n
B.把脚本转化成UML图$ |. X8 I9 d3 `6 A1 ~: x
C.精确测算脚本不同部分的运行时间
7 l1 [% h! ~2 M: J; ^D.计算脚本通过web服务器执行时的维度
' Z$ y+ Y- O& b3 ^0 ]E.扫描脚本,识别由常见错误导致的bug
5 a; y0 \/ S3 h7 y' g6 f, b$ d
& @9 \% W, w7 j$ Y, r* V( R3 x' @% @6 B
13.______能帮助识别和解决bug。
. L' x, b' |( ~- I
! `- w+ c; v" r: G1 h答案:____________
% k$ N, @+ z2 l1 m. G0 _# I, c
* k5 C$ Y( N( _$ t9 n
+ g4 W' j$ ^+ G2 ^" R7 E$ P/ V14.trigger_error()和user_error()有什么区别?+ {# N5 c7 h0 j5 [

; }0 E, V; Q; u7 D* P2 r5 H3 m% AA.trigger_error()允许脚本抛出系统级的错误
+ r7 S" }% R* f" U' d; HB.user_error()允许脚本抛出系统级的错误" S/ o1 n) l! N9 R, J, s
C.user_error()不能被用在错误管理器中$ v8 `  s! B; w( N
D.trigger_error只在PHP5中可用
% F  X! b# ?7 G- c  HE.没有区别( |4 V7 {! s' v! M3 F) P

1 H( U6 L3 M/ F3 V2 F
* ]$ }) _4 J2 t% U15.______函数能返回脚本里任意行中调用的函数的名称。该函数同时还经常被用在调试中,用来判断错误是如何发生的。
  h/ j! B( f% @3 [- v. u/ u- Z8 z
A.print_r
+ B0 u0 R  m5 YB.var_dump
0 C* Z3 H/ g$ {* l! @% L0 lC.stack_dump+ ?* y4 N" Y: N- ^& Z1 B  P
D.debug_backtrace
& M- x  T0 _0 ]E.以上都不对, m. d1 U- N* s3 d  k
4 ^+ ~% D5 f+ c3 k+ M
答案5 J) \: f+ i# |* T

: D6 |- ?% d( u; k) f1.答案是E。三元操作符把每个if语句连到一起,作为&&操作的一部分。然而本题中,$x=1这个赋值只在第三个if为false时发生。如果第一个和第二个条件都不成立,$x=1就不会执行。这题对三元操作的应用有些极端,实际应用时,需要根据可读性来决定是否需要用三元运算符(本题这种情况就最好不要用)。# w* E, x1 X4 \

9 I  d+ D& t; N+ U- {2.问题是由第三方数据源传输缓慢导致的,而你无法控制这个数据源。你也许能在网络连通性上做些工作(假设问题出在你这一边)。还可以对接收到的内容进行缓存,这样能减少获取重复数据的时间。因此,答案是B和E。1 P7 B; E. z: Y  p! g4 Z/ _, [

" |8 T( c1 g$ z3.正确的选择是B和D。如果关闭错误报告、使用@抑错符和关闭错误日志,那么在你交付给客户的网站出现问题时,你将很难进行分析和调试。: A# O. P! S( ?7 a: }) `- f

3 a) E# B0 |; ]+ V- n6 r4.这是在描述===操作符。
! s2 ]0 M, _  j! f, R0 t" e8 J/ g9 V
0 A% @/ x! p& v& Q/ t: ~+ T5 Q5.正确答案是D。PHP脚本在执行时,将首先被解析成“中间”码(也叫opcode,操作码),然后解释器执行。操作码缓存出现在这两个步骤之间,对解析器的输出进行缓存。下次执行该脚本时,将缓存的输出直接送入解释器。这样就就不需要再解析一次了。
% ~( ~: g$ B; x  t% ]2 F* n! C+ g3 u
6.正确答案是A和D。如果RAM太小,进程间将出现资源竞争,服务器将大量使用硬盘交换。同样的,如果允许过多进程同时执行,也会使服务器频繁进行交换,导致速度下降。( E0 s3 M* ^# {; y0 x+ d

. t1 `4 G$ F1 n# m( `; a1 @! M7.正确答案是A和C。脚本不检验datebase_query()的调用是否成功,因此将持续执行下去,最终产生错误。此外,$my_id参数没有转义——可能导致代码注入(详见第11章)。
. R+ H& R0 c$ b4 l# x) i- t& D3 ?9 z+ g3 b4 T) {1 x/ ]
8.答案B和D正确。出现解析错误往往表示脚本中有语法错误,自定义的错误管理器无法捕捉到它们的原因很明显:错误管理器在脚本里,而现在无法解析脚本,管理器也就无法执行。类似的,E_ERROR表示有致命的运行错误出现,比如内存耗尽。因此脚本会立刻被中断,因为解释器无法执行后面的代码。) H* t# r( H! V2 H/ ~
, ]7 t' [6 H+ `0 I
9.答案是C。比较操作是一个可交换的操作(就是说结果独立于操作数之外),而赋值不是。因此,比如说,$a==10和10==$a是等效的,而$a=10和10=$a却不是,而且后者会导致一个错误,因为这不是一个合法的操作。确保常量在操作符前面,能保证你不会错误得将比较变成赋值。" s1 r) }! ^; [: t: W/ B

4 ]5 j4 B% f" e" h$ t8 b10.答案是C。error_log函数能将信息送往一个指定的地址。尽管mail()也可以用,但error_log能自动给邮件添加标题,因此这才是最简单的方法。: ~) C% [9 T0 U4 d$ X& V
, p+ j1 h! G1 q% a, a$ B
11.答案是不能。error_reporting函数能关闭所有运行时的错误报告,但对解析时的错误无效,因为解析错误发生在脚本执行之前。) z0 T2 Q- k5 n$ c/ }; x, H, Z
" A" G' `6 D. y/ A- y: Z
12.显然,答案是C。概要分析器(profiler)能监视脚本的运行,并记录单个部分的运行时间。它可以用来找出和解决瓶颈。
: @2 ]$ l$ C4 T, S  k7 Q) v9 v7 a$ ?4 Z! R& M
13.这是对调试器的完美定义!你可以用调试软件监视脚本运行,同时分析系统资源消耗,从而发现和解决程序缺陷。7 {! U- _) q+ s' `" ]
& M+ |8 d4 i* ^1 }0 Y" u- p
14.trigger_error()和user_error()之间没有区别。后者其实是前者的别名。
& d( l+ E" g5 l/ O7 q* _8 _% N
, ]4 S6 f/ k$ M+ m' b, F7 j1 t15.答案是D。题目是在描述debug_backtrace函数,它返回一个由所有在代码的特定位置调用过的函数名组成的数组。

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