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

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

作为一个开发者,无论你经验多么丰富,或者无论你多么努力,你的程序中总会有bug。这是生命中一个必然的部分,如同死亡与缴税(尽管并没有后面两个那么严重)。
& Y2 O' ]5 I8 b% y! p7 d9 L要想解决bug,首先要能找到bug。事实上,许多开发者花费了无数小时茫然得盯着代码,只是因为他们没有把程序的容错能力摆在首位。忽略了这个部分,那么期望一个没有bug的程序就是——不可能的。" k; h+ |! i5 {+ M& T
本章测试题将考察你对调试和性能管理相关知识的了解,以及如何用PHP做好这两件事。( o' i# |0 l# _4 w8 q3 s
- Q( h# u, }- I! q' ?

% w+ `6 A2 D  h9 t( c问题
6 b+ R2 {  j: C0 {! G( Y# w9 m
, m/ u  N" v& O' o. y1.以下脚本如何用三元操作替代? ! s* b2 y! D- G* ?

  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. ?>
复制代码
( l9 ]6 y2 Z% D( V- N7 x5 K
A.$x = ($a A. < 10 || $b > 11 || $c == 1 && $d != $c) ? 0 : 1;
0 E# Q8 y+ I2 ~& }) _4 H# aB.$x = ($a < 10 || $b > 11 || ($c == 1 && $d != $c)) ? 0 : 1;
* \: [4 C8 n6 J. x: |C.$x = (($a < 10 && $b > 11) || ($c == 1 && $d != $c)) ? 0 : 1;, {$ i7 B  P' f
D.$x = ($a < 10 && $b > 11 && $c == 1 && $d != $c) ? 1 : 0;" Y+ \* }- @3 _* @, [! a
E.以上都不对& [4 T4 ^  z$ E1 u$ R

  W* w( F: B& `2 i! p
$ Q4 K- c1 f5 W( g' P, {2 j2.有一个脚本由于要从远程获取数据,因而运行速度很慢,以下那种方法能对其进行优化?(双选)
: n  F4 P$ U3 |* A( M- t" L" e
; ?2 Y4 q) D! D! pA.安装操作码缓存(opcode cache)1 z! Q9 B4 G% g' w4 H. @& K! j
B.优化或者升级你的网络连接9 [) z$ Q4 d4 {% g& g# ^3 D9 E, J
C.添置更多的硬件
" y: D' `6 O5 d. M$ ]1 G' PD.增加服务器的可用RAM
; l, G$ o8 M, Y$ {& s( R$ xE.使用连接缓存# i4 ^( Y" G& c; y
8 z* i* V5 I: N) i$ F! C# ]

) z% O% h5 o* V1 H" o3.架设生产环境下的服务器时,需要做哪些步骤?(双选)
4 T  n" T8 _% d5 N! B& n# Y2 b2 f8 ~9 d& N% d- p* ?9 q
A.关闭错误报告
4 n) l! `. g# H6 x% m6 e3 v6 [6 mB.打开错误日志* d) k9 q8 u$ f8 u" d; f! P
C.关闭错误日志, C, i3 ^& N3 V( |" L+ J
D.关闭错误显示8 h" |% s3 M# O
E.使用@抑错符
3 ^" {3 J* U9 Y6 a% F$ e6 r& Z' e8 z2 h/ `0 j4 J/ Q% T
& ~7 b" [" ?1 E, w+ R
4.______操作符能对操作数的数据类型进行严格的比较?
  S+ k& L, y7 C8 X4 L) O- Q
* g0 t" I. _4 L) t. d+ L答案:____________- v" w* ~! e7 Q  z7 ^: o4 ?
0 H, n5 H# [* h+ ~. b/ T) r
: N) N; J* e6 R7 }# g* Q: x
5.操作码缓存(opcode cache)能做什么?
! c. @' V9 b# J8 D; s' A' t, z; [# T0 d
A.把脚本编译成二进制对象,使它运行得更快  J- E' x1 Y! W
B.代替Zend引擎加快解释器的运行& \( \7 t1 N- a0 W
C.缓存脚本输出以提高执行效率2 }* [7 n$ k1 N, }, m9 @
D.缓存解析器产生的中间码,以提高运行效率% a$ }& j: g3 |3 [2 N5 N4 D0 x
E.在内存中缓存脚本,减少从硬盘中读取的次数3 T" a$ @# T$ A( U% C

" e& F$ b4 m8 `) _6 f
6 g3 g' v$ U: s0 v+ q7 J7 c2 q6.以下哪些情况容易造成系统资源枯竭?(双选)
' H7 T) h7 I' F3 s7 A- u; {) @1 p4 M( K8 c1 X% T3 c! w
A.RAM太小( R/ p( Y% I% Q+ [/ J, }" H6 c
B.使用了低带宽的连接
5 {3 U" A$ S. b: B1 ^2 v, Z  hC.虚拟内存超过2GB4 e. @5 J; m# o
D.允许同时运行太多的服务器进程! K4 p3 n0 T3 F9 S
E.以上都不对
& G9 m, H! l! A' j2 ]
) F1 ^; A+ m; Z9 T" g. D$ v/ \2 W* N
* L* ~. _2 \# Y( m  N7.以下脚本缺了些什么?(双选)
: e  I# `8 v* L0 ]$ I4 N

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

; \* p3 B; D/ @0 t1 X( HA.参数出口(Parameter escapement)) [9 b7 Q% ]( a& `0 n$ h! i) C1 H
B.输出格式化
# p6 ~: f! _0 h2 B5 rC.错误检查
- G$ M  M8 R% a3 a2 MD.一个SQL查询+ x5 S5 Y6 r& p' h
E.以上都不对. p+ W' Q' `" H
3 {+ h3 ~  r& \6 v# `

) _# u( @2 p( }$ p/ D5 ~% n8.以下那种错误类型无法被自定义的错误处理器捕捉到?(双选)
/ c- w- y; i( @2 f& C) H5 W$ y% r5 ]" [) z; o4 R* T
A.E_WARNING2 f9 B( X% I! T% _3 D$ E9 [5 \
B.E_ERROR
' b& G! F4 u5 s" y3 Y; uC.E_USER_ERROR3 N) s# p3 c( z, v8 s) q3 x
D.E_PARSE' F1 |" u8 |- l  C
E.E_NOTICE
% c, x& S+ P* V* G
$ ^0 ^( w  j6 A  D  y
* I7 q$ X* t* T5 ?3 |, h3 H9.当需要比较一个常量和一个变量时,如何才能保证不会错弄成赋值?
/ H; p  o4 c( C2 l9 p9 G8 j0 r8 {" y  i" T; Z
A.把变量转换成int
/ r' Z0 h* M  {: a$ ]- R6 yB.使用全等比较符(===)0 Z1 u1 b) r' Z& b* g5 ]: x
C.确保常量是第一个操作数
$ H  [  R" _( i7 F7 P) `  ?7 ]D.使用三元运算符
! z  p4 Z6 b" y1 L1 [E.用括号把操作包起来
& P' [' l& N0 z$ o6 N- a* l
  t( X4 K7 u0 A  O9 J) D& h
: D' Z9 q( |4 R4 F6 W1 s10.要通过邮件给系统管理员发送错误信息,以下那种方法最简便?+ V* h9 k: Y* R/ T: }) }3 g

! u) y' p9 ^$ C( RA.创建一个连接远程SMTP服务器的函数
3 b; n6 j4 A- z; `& L$ l8 uB.使用mail函数
/ m9 y# {) w0 X3 m* n$ }, tC.使用error_log函数
; a& D. d" T8 e- z& MD.调用sendmial程序0 s! Q8 L7 T+ z  W6 Z
E.使用webservice
5 g4 q4 Q2 S: r) D, ]& s* P- n
& I# M, e: x3 r
1 Y4 s) `7 v1 p) i- A" I$ G* }11.能否仅调用一个函数就关闭脚本内所有的错误报告?; l8 j' r/ p4 |& y( o

9 Z0 \! R7 P! O/ A8 zA.能
+ [; {/ K, R  _% @B.不能" b& X. g2 q6 |0 e( ?! P
& g5 f! q, e. `

% f% v$ s# e! ^; I& K12.概要分析器(profiler)是做什么的?. Y- V; }; H% J1 @. k! s7 P

  a$ _% O: \4 B: H! h/ O$ T0 ?( JA.创建关于脚本结构的档案
3 f/ r9 f: Q: pB.把脚本转化成UML图
4 q7 D6 e: A& U! ]7 NC.精确测算脚本不同部分的运行时间
. _" L, Q" b$ I3 k6 b# d. ]D.计算脚本通过web服务器执行时的维度
1 Z/ m- e. S& W2 Z. aE.扫描脚本,识别由常见错误导致的bug4 `! \  z( H$ N8 N+ ~0 k

8 \$ \1 g: k2 R: L, j( ]2 P6 Q
13.______能帮助识别和解决bug。
: S, G! }. C" T2 q6 [
) R, l# }/ U( \+ d7 P! {答案:____________: ]$ ]2 \4 `0 k4 h- h' a5 U

, m, Y2 a) N- A' D5 j/ v5 u+ Z8 i1 `
14.trigger_error()和user_error()有什么区别?
( R2 o% l2 Q  }/ O3 D
% n) h, U1 I, @: iA.trigger_error()允许脚本抛出系统级的错误5 L% |: [7 }9 {2 i- I: p
B.user_error()允许脚本抛出系统级的错误1 V( @% `- n) {1 k
C.user_error()不能被用在错误管理器中
0 L) @6 n& M5 R9 |, aD.trigger_error只在PHP5中可用
/ `" M0 m7 t7 f9 k/ c2 ]8 r+ pE.没有区别& j/ ~6 L1 q$ v; O

+ S/ a- h) f! H1 L
8 n7 ~( f' Y0 t! q! q15.______函数能返回脚本里任意行中调用的函数的名称。该函数同时还经常被用在调试中,用来判断错误是如何发生的。
  b/ u5 U; h/ q+ l3 x" `% E/ o2 }7 H3 @/ N
A.print_r
7 Z/ q( }; Q2 B& ^* F2 A+ QB.var_dump: q  O; J8 g# M8 |
C.stack_dump7 k1 N4 k, E' a8 W# X- T( {, ~
D.debug_backtrace
0 b1 K3 C6 ^0 eE.以上都不对2 k' o; t+ _; T  ^

' w: O& h$ {4 G" D. l答案) s" s" l5 H) |. x

" P7 }! {/ g, I' Z& B, j1.答案是E。三元操作符把每个if语句连到一起,作为&&操作的一部分。然而本题中,$x=1这个赋值只在第三个if为false时发生。如果第一个和第二个条件都不成立,$x=1就不会执行。这题对三元操作的应用有些极端,实际应用时,需要根据可读性来决定是否需要用三元运算符(本题这种情况就最好不要用)。
9 O( W4 j% e: t0 x1 N, M; S( P+ A/ L
2.问题是由第三方数据源传输缓慢导致的,而你无法控制这个数据源。你也许能在网络连通性上做些工作(假设问题出在你这一边)。还可以对接收到的内容进行缓存,这样能减少获取重复数据的时间。因此,答案是B和E。
+ o6 q/ o9 W$ z- l3 E- J' V/ U% v  s
3.正确的选择是B和D。如果关闭错误报告、使用@抑错符和关闭错误日志,那么在你交付给客户的网站出现问题时,你将很难进行分析和调试。
  ?$ N1 i, f3 N( C. ]! @. i! i& P  {& D1 L
4.这是在描述===操作符。
) G3 r& Z( D+ N5 h6 Q/ K: U
! \# R- }$ r0 e" ~+ o" X& n5.正确答案是D。PHP脚本在执行时,将首先被解析成“中间”码(也叫opcode,操作码),然后解释器执行。操作码缓存出现在这两个步骤之间,对解析器的输出进行缓存。下次执行该脚本时,将缓存的输出直接送入解释器。这样就就不需要再解析一次了。$ }; U- @! s9 n/ F& ]

* {1 S5 N& Y2 D3 x: U) S4 `6.正确答案是A和D。如果RAM太小,进程间将出现资源竞争,服务器将大量使用硬盘交换。同样的,如果允许过多进程同时执行,也会使服务器频繁进行交换,导致速度下降。9 q  Q; G- H7 K" z7 o7 n
! g  h: P, p# p8 c
7.正确答案是A和C。脚本不检验datebase_query()的调用是否成功,因此将持续执行下去,最终产生错误。此外,$my_id参数没有转义——可能导致代码注入(详见第11章)。
( M" n% b' e4 p9 P7 [$ e9 n5 e, T( N0 l
8.答案B和D正确。出现解析错误往往表示脚本中有语法错误,自定义的错误管理器无法捕捉到它们的原因很明显:错误管理器在脚本里,而现在无法解析脚本,管理器也就无法执行。类似的,E_ERROR表示有致命的运行错误出现,比如内存耗尽。因此脚本会立刻被中断,因为解释器无法执行后面的代码。5 n! W: r1 U" r1 J0 p

8 v  ]2 _" g8 u; n9.答案是C。比较操作是一个可交换的操作(就是说结果独立于操作数之外),而赋值不是。因此,比如说,$a==10和10==$a是等效的,而$a=10和10=$a却不是,而且后者会导致一个错误,因为这不是一个合法的操作。确保常量在操作符前面,能保证你不会错误得将比较变成赋值。+ A% O) t5 V# I; f5 S% g5 P. U4 w

# S4 Y1 ^. o$ }. z" _" q5 |, H10.答案是C。error_log函数能将信息送往一个指定的地址。尽管mail()也可以用,但error_log能自动给邮件添加标题,因此这才是最简单的方法。& W/ \; s% t& k
5 M! q2 j2 z7 F+ M) M
11.答案是不能。error_reporting函数能关闭所有运行时的错误报告,但对解析时的错误无效,因为解析错误发生在脚本执行之前。
/ U6 O1 q1 C7 _  u
8 l+ o/ n) t/ X& M' n" k12.显然,答案是C。概要分析器(profiler)能监视脚本的运行,并记录单个部分的运行时间。它可以用来找出和解决瓶颈。
" W: m7 W; H/ E/ t' @6 G0 ], X5 [
13.这是对调试器的完美定义!你可以用调试软件监视脚本运行,同时分析系统资源消耗,从而发现和解决程序缺陷。. E& P0 S9 s  I  n2 K& L- a. m
* T: j- }* d! K- q
14.trigger_error()和user_error()之间没有区别。后者其实是前者的别名。
& v' A) v- s  n* F
8 ?  X" i  Q  o8 x1 h0 U15.答案是D。题目是在描述debug_backtrace函数,它返回一个由所有在代码的特定位置调用过的函数名组成的数组。

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