返回列表 发帖

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

作为一个开发者,无论你经验多么丰富,或者无论你多么努力,你的程序中总会有bug。这是生命中一个必然的部分,如同死亡与缴税(尽管并没有后面两个那么严重)。
5 Y# w& _" O3 E: v* j" O) W% z7 P要想解决bug,首先要能找到bug。事实上,许多开发者花费了无数小时茫然得盯着代码,只是因为他们没有把程序的容错能力摆在首位。忽略了这个部分,那么期望一个没有bug的程序就是——不可能的。5 X: W+ V' a* y( D+ N
本章测试题将考察你对调试和性能管理相关知识的了解,以及如何用PHP做好这两件事。
5 v( C( P# |& X- t1 n
- D3 o3 E1 o" Q) X+ E' T$ L) T1 [  e
问题4 P$ G2 j7 M+ f) K, K& v0 C3 u
+ @% y2 N9 H6 ?) p6 D' f
1.以下脚本如何用三元操作替代? / Y+ T. @' B: Q& T/ t$ 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. ?>
复制代码
9 ?/ Y3 q3 m3 E2 r" O
A.$x = ($a A. < 10 || $b > 11 || $c == 1 && $d != $c) ? 0 : 1;
& E; t: U, k* _8 H3 m5 _B.$x = ($a < 10 || $b > 11 || ($c == 1 && $d != $c)) ? 0 : 1;
: k3 z( [: T2 ?; l2 aC.$x = (($a < 10 && $b > 11) || ($c == 1 && $d != $c)) ? 0 : 1;0 O7 p( D5 L3 z5 [
D.$x = ($a < 10 && $b > 11 && $c == 1 && $d != $c) ? 1 : 0;( ]' i7 L, u, Y3 P. A! X2 s
E.以上都不对, `" T% @0 t  U" X1 T+ ]% Q, f7 e
1 H/ b9 P4 w0 K. O# J
' d. m, T1 Y) e. _2 M
2.有一个脚本由于要从远程获取数据,因而运行速度很慢,以下那种方法能对其进行优化?(双选)7 t$ w* R/ i5 s. M1 V. ?
& a: G7 d1 ^8 Z3 w3 ~5 G, F
A.安装操作码缓存(opcode cache)
; V1 g. T8 p1 cB.优化或者升级你的网络连接
5 I0 f& g+ @. W9 HC.添置更多的硬件4 Q6 D' ~1 @! r
D.增加服务器的可用RAM6 b' D5 l* `' l! M+ z" o1 c- p1 y
E.使用连接缓存
5 \1 N: P. O7 i" X/ R' ?/ r. u. n' R- I2 D

: P9 \8 }6 T% F% I; |! T3.架设生产环境下的服务器时,需要做哪些步骤?(双选)+ h5 I" G2 F0 C1 T

; S4 m$ ]3 g' s5 @5 L* KA.关闭错误报告
4 _3 p- Q0 f! t& kB.打开错误日志; V# M* K: l5 P  V) W
C.关闭错误日志
$ r4 o# v- W: J; V% i0 \/ B0 WD.关闭错误显示/ J7 P* X7 b8 ?3 w) C2 t4 f
E.使用@抑错符
, A( @2 L0 Y0 R6 D) X0 \/ b
" L- b, L! C1 [2 {9 o# k  S) a
4 m9 Y. @$ Z! I1 F4 s7 ~3 H4.______操作符能对操作数的数据类型进行严格的比较?- x' {2 u* ~; C0 h! |
) U8 x8 G+ c( d9 r; R# Q; o' y9 @
答案:____________& [2 z! N5 \' m! d- [% R! _
9 i& `1 ^" {4 E; |" s( o$ b

9 N* n4 G5 e5 ], Q  o5.操作码缓存(opcode cache)能做什么?
3 h( _6 f+ z& E7 b* Z; r
( C- ^: b# M+ O/ o/ UA.把脚本编译成二进制对象,使它运行得更快
' ^& o( l4 q. ~2 ^$ o) W3 }B.代替Zend引擎加快解释器的运行; J* A( ?/ I+ y' t
C.缓存脚本输出以提高执行效率4 f) l4 j$ L. L
D.缓存解析器产生的中间码,以提高运行效率5 X' q7 v; P/ m4 }& a, |
E.在内存中缓存脚本,减少从硬盘中读取的次数
) R. q1 V) v! ~# {8 ~* F
5 l& G+ I0 N  Q' h
  t- d) w) g# T+ Q6 r: N' y6 h6.以下哪些情况容易造成系统资源枯竭?(双选)
: h' n9 B9 ]+ p# w+ B+ o% D# E! v
A.RAM太小6 g8 P  W: m1 F4 T1 K
B.使用了低带宽的连接2 A3 o5 g  {; E
C.虚拟内存超过2GB) ?# d4 f( h% ?8 G+ P" ^% y4 D
D.允许同时运行太多的服务器进程
$ L0 \: D: m; s. A- \) @7 hE.以上都不对* b4 {9 F! [5 y: z, F: y! ]2 X

! V* Z% a: Q- V* |  B
- B/ R5 y! ^1 U0 x( m7.以下脚本缺了些什么?(双选) 7 {2 @, ^" L8 c

  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. ?>
复制代码
; O. X' b0 ]- Z9 z) @$ y# u
A.参数出口(Parameter escapement)
' d" i) I! }2 @/ o6 _2 |* cB.输出格式化
! P1 ^; _; ?. r7 x0 z- a& HC.错误检查! I$ K$ u. U  t! a
D.一个SQL查询1 D1 A8 ?7 ?! C
E.以上都不对. i/ f+ {& N* `$ A' r# @
0 u4 ~0 R- S& [  R4 b

: L/ ?( O0 K* b: M% @8.以下那种错误类型无法被自定义的错误处理器捕捉到?(双选)
5 |2 }* y! H4 t1 l. p1 U6 W- g2 u/ f) f
A.E_WARNING
% I' u, _6 r. @1 u2 Y# ^B.E_ERROR& r8 W$ K' r/ W! |% `2 E4 h) t+ d
C.E_USER_ERROR
" T$ [' `+ e$ H2 u! HD.E_PARSE5 s6 x3 R% [! c9 C% n
E.E_NOTICE9 W: m# B7 p0 A. l4 e
5 T9 f5 p' ?$ E) u/ `4 Z
- l  q; R  U8 ~; _% Y' l9 I
9.当需要比较一个常量和一个变量时,如何才能保证不会错弄成赋值?$ a4 S/ v5 `* Z0 L" Z

9 F9 v  O2 @3 u2 t1 A" `A.把变量转换成int; P3 h. ^" F+ M' q; w& \: ^) D
B.使用全等比较符(===)
; o4 \( C/ `1 J. |$ j4 hC.确保常量是第一个操作数( l- _- C/ `9 y
D.使用三元运算符
/ T- L# h. q' x( Z1 fE.用括号把操作包起来2 B- r  H" V/ L
. ^# Q% [' k/ U) k1 G0 q+ K
- }+ |$ L& f7 e! f! N9 t+ m, C4 O
10.要通过邮件给系统管理员发送错误信息,以下那种方法最简便?
1 t- u: A9 U4 D2 ]3 ^
$ X' J4 n$ d. v! ?A.创建一个连接远程SMTP服务器的函数8 o( d* `: h- t# E
B.使用mail函数5 D" }8 `$ V7 I5 H$ E7 E
C.使用error_log函数
6 G4 c/ n* U1 P0 N3 s: M# HD.调用sendmial程序: Q+ ^2 n7 O7 T& I
E.使用webservice7 n3 E, l, _" q4 R! A

* @  e' |! y0 @7 r- |2 M' D, w
' q2 r0 p& p5 {7 o6 j! B$ ?6 ~11.能否仅调用一个函数就关闭脚本内所有的错误报告?" D; w" C1 h; E3 @" x7 H: x: @0 {

8 l4 v' Q: m+ XA.能
; d8 t- h# B5 Q) ]B.不能
  }9 C: m7 R) z) f2 ~" t# q0 ^( U. {! u* A& R
) ^1 V( |) r2 ~1 W6 l: M+ o
12.概要分析器(profiler)是做什么的?
% W1 A1 ~7 m5 \0 _  c1 k) b& L+ N' P, o0 T2 R" N. I& F
A.创建关于脚本结构的档案
- y, V* H( P5 B4 KB.把脚本转化成UML图9 ?* @* y' R/ `. b. ^. g
C.精确测算脚本不同部分的运行时间
- l9 V' u: S7 H  j2 c! bD.计算脚本通过web服务器执行时的维度) I) }9 N( p( N3 q% b) y5 x8 S
E.扫描脚本,识别由常见错误导致的bug
: y" i5 b0 r% f9 j) @4 R; S
' d5 D6 C0 w6 `1 s/ Z7 {7 ~& ~' w, R2 R. v
13.______能帮助识别和解决bug。. m, p" d- x/ a) V; M4 T
( Z/ G) Y" S: R, N5 D0 ]
答案:____________3 z# g2 A# ]3 F7 \5 [% [
) |8 O" _# h$ H5 K

( x  r5 Y8 W: _% f  J% Y14.trigger_error()和user_error()有什么区别?
9 y) c) @8 M  }5 f) I  e% m  P
' @( Z* |3 A$ `% u  F9 m# @+ YA.trigger_error()允许脚本抛出系统级的错误! m+ |) `1 s; w" H1 M. E% T# O
B.user_error()允许脚本抛出系统级的错误
1 X. Q. j6 |# ]% ?+ S' A& XC.user_error()不能被用在错误管理器中
( T; {/ t9 A0 kD.trigger_error只在PHP5中可用" w0 I  V2 a& m+ z# N6 l
E.没有区别: }$ J1 u; S: l. b. J

& n3 ]5 a5 j4 O; S  D# o
# u) c' g* k9 G1 ?5 H6 i15.______函数能返回脚本里任意行中调用的函数的名称。该函数同时还经常被用在调试中,用来判断错误是如何发生的。
9 W  v: p. P% d9 ?: z2 f. X) o4 s
% P: j+ k$ c+ j; r" b+ w) O3 QA.print_r6 |4 ?2 m9 |" ?2 _+ O0 W0 B
B.var_dump) K; o  p& Y$ \8 R0 W$ H
C.stack_dump5 d6 m" @7 b+ m' H
D.debug_backtrace
# Y1 E7 G9 \) J; P) Q6 ME.以上都不对- u+ I# V$ ]1 W6 j) o
2 ]1 v3 V& p/ M4 b& S% h
答案
9 r1 Q7 c7 F0 k3 b/ i& r; }# H9 Q, H4 O7 l
1.答案是E。三元操作符把每个if语句连到一起,作为&&操作的一部分。然而本题中,$x=1这个赋值只在第三个if为false时发生。如果第一个和第二个条件都不成立,$x=1就不会执行。这题对三元操作的应用有些极端,实际应用时,需要根据可读性来决定是否需要用三元运算符(本题这种情况就最好不要用)。
% u2 h; W2 d+ q* ~+ T6 y4 k7 \9 X* s1 o
2.问题是由第三方数据源传输缓慢导致的,而你无法控制这个数据源。你也许能在网络连通性上做些工作(假设问题出在你这一边)。还可以对接收到的内容进行缓存,这样能减少获取重复数据的时间。因此,答案是B和E。  {# q: }+ t9 T0 U$ B+ o7 k' X

  A5 V7 _. \, `' t6 }. ~4 \# |3.正确的选择是B和D。如果关闭错误报告、使用@抑错符和关闭错误日志,那么在你交付给客户的网站出现问题时,你将很难进行分析和调试。4 n8 O& L" m% H6 I: g+ B1 Q6 S
7 f& t! P9 t$ y6 ]9 f
4.这是在描述===操作符。/ c7 z0 N# T2 \6 j; y6 e) {# g( k( ]) N
' ]9 G: N* i. n8 `9 @7 k
5.正确答案是D。PHP脚本在执行时,将首先被解析成“中间”码(也叫opcode,操作码),然后解释器执行。操作码缓存出现在这两个步骤之间,对解析器的输出进行缓存。下次执行该脚本时,将缓存的输出直接送入解释器。这样就就不需要再解析一次了。
0 O" K& b% m, E" Q7 i
. K) z4 J! q! j9 E  N5 K6.正确答案是A和D。如果RAM太小,进程间将出现资源竞争,服务器将大量使用硬盘交换。同样的,如果允许过多进程同时执行,也会使服务器频繁进行交换,导致速度下降。. k$ k. M" V3 U1 B6 q3 `
/ T5 C7 ]# v# R. }1 E! I" {# g( K
7.正确答案是A和C。脚本不检验datebase_query()的调用是否成功,因此将持续执行下去,最终产生错误。此外,$my_id参数没有转义——可能导致代码注入(详见第11章)。  y9 Q' D  r: P0 M' c

, }: y- _& z2 \. V  {  t8.答案B和D正确。出现解析错误往往表示脚本中有语法错误,自定义的错误管理器无法捕捉到它们的原因很明显:错误管理器在脚本里,而现在无法解析脚本,管理器也就无法执行。类似的,E_ERROR表示有致命的运行错误出现,比如内存耗尽。因此脚本会立刻被中断,因为解释器无法执行后面的代码。
% x( c* n2 R7 x& }" U6 y) I: O; n: S& t2 H
9.答案是C。比较操作是一个可交换的操作(就是说结果独立于操作数之外),而赋值不是。因此,比如说,$a==10和10==$a是等效的,而$a=10和10=$a却不是,而且后者会导致一个错误,因为这不是一个合法的操作。确保常量在操作符前面,能保证你不会错误得将比较变成赋值。
! O# c( B; a; W, H; k% I2 q+ U: J2 Q9 r+ p- s% Y' G% s3 T8 b& C9 d
10.答案是C。error_log函数能将信息送往一个指定的地址。尽管mail()也可以用,但error_log能自动给邮件添加标题,因此这才是最简单的方法。
0 M, {& R, r" G/ P3 v; e  `/ r/ V' T3 N+ E2 P; |) x
11.答案是不能。error_reporting函数能关闭所有运行时的错误报告,但对解析时的错误无效,因为解析错误发生在脚本执行之前。7 ~1 `/ K0 v! x/ l3 D7 U, r8 a

8 N" p9 v) B$ L$ V8 A- Z$ Y% N12.显然,答案是C。概要分析器(profiler)能监视脚本的运行,并记录单个部分的运行时间。它可以用来找出和解决瓶颈。# H4 W+ R- ?) N4 n7 [
0 @% C, h8 B: p3 p& V" \
13.这是对调试器的完美定义!你可以用调试软件监视脚本运行,同时分析系统资源消耗,从而发现和解决程序缺陷。
! c3 P; ?! p" [3 q+ X
2 L6 r: j7 a+ K14.trigger_error()和user_error()之间没有区别。后者其实是前者的别名。" M: N" l2 a" l, m" v
( ?7 h& L- _0 y0 [
15.答案是D。题目是在描述debug_backtrace函数,它返回一个由所有在代码的特定位置调用过的函数名组成的数组。

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