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

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

作为一个开发者,无论你经验多么丰富,或者无论你多么努力,你的程序中总会有bug。这是生命中一个必然的部分,如同死亡与缴税(尽管并没有后面两个那么严重)。
  C4 m: u' n6 D  Q; I# E- o: P要想解决bug,首先要能找到bug。事实上,许多开发者花费了无数小时茫然得盯着代码,只是因为他们没有把程序的容错能力摆在首位。忽略了这个部分,那么期望一个没有bug的程序就是——不可能的。
& q; `, ^1 a2 {, `5 b本章测试题将考察你对调试和性能管理相关知识的了解,以及如何用PHP做好这两件事。' z, h( l2 x& s' h8 e
9 q# K" _( B2 R/ z/ P3 j% x

# y6 o$ ^9 L  ?( Z' a6 Y问题
# j! A+ U) Q8 O% k# E1 z/ L2 u2 o. S! {% y! Y3 q0 Z
1.以下脚本如何用三元操作替代? # m( F) h% {, d2 N1 z1 K

  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. ?>
复制代码
, t$ L* i! F) `1 Q
A.$x = ($a A. < 10 || $b > 11 || $c == 1 && $d != $c) ? 0 : 1;6 Q$ {4 v- k+ z7 a
B.$x = ($a < 10 || $b > 11 || ($c == 1 && $d != $c)) ? 0 : 1;3 G0 s: D$ ^; A* [( @, }3 T/ j4 E
C.$x = (($a < 10 && $b > 11) || ($c == 1 && $d != $c)) ? 0 : 1;
# I1 ]' E. e3 j$ N! SD.$x = ($a < 10 && $b > 11 && $c == 1 && $d != $c) ? 1 : 0;
; `1 @% Y. X$ [" ~/ m+ N; [E.以上都不对
: Q& S: g' ?$ |9 S0 ]+ }# t) H- i4 n- M$ G, p

6 Q( S0 }% s; l1 ^7 D9 T$ ~  e2.有一个脚本由于要从远程获取数据,因而运行速度很慢,以下那种方法能对其进行优化?(双选)
% o9 c! x2 n0 Y: I' r3 n) i8 ~1 J) [( E
A.安装操作码缓存(opcode cache)) L  s  n& [6 ^( s4 o
B.优化或者升级你的网络连接
' Y3 [+ }0 }( }( NC.添置更多的硬件
) G1 k/ C9 r' G4 zD.增加服务器的可用RAM0 ?) Z) P2 Z4 y$ |
E.使用连接缓存" G6 E, s, D" Z5 v
! S* N/ t- W7 J3 p: W
$ a" U3 P0 v) l4 F( D
3.架设生产环境下的服务器时,需要做哪些步骤?(双选)6 s; X5 R( {* ~4 }: n) ]; `

8 e5 I# a: _' D* B( vA.关闭错误报告2 d! T& N; o$ G' H% l3 F: O
B.打开错误日志1 V5 t" ?+ a& l. r7 R- \/ B
C.关闭错误日志0 a8 c. V; V& U+ |
D.关闭错误显示" u* W1 A% S4 r! g/ d
E.使用@抑错符- I/ j1 m# @! V; \$ `3 b3 R# _
9 M4 _$ m$ @: l0 Z) F  n. R  Z
( f5 I4 T; u! q9 f
4.______操作符能对操作数的数据类型进行严格的比较?
6 T+ x! T$ X7 {# }4 D' ^+ `1 @; V4 N8 V' `! w
答案:____________
$ c0 _$ r0 [! v. H2 p) A# z
/ g/ X6 L' z- \
( g5 _- C9 Z) H5 {$ u! U; N- Z3 m5.操作码缓存(opcode cache)能做什么?
; c- X' A+ f7 y5 M! q( F- B# ^+ e" j4 V4 }) V
A.把脚本编译成二进制对象,使它运行得更快
7 W! u8 N' X- F3 r) f4 LB.代替Zend引擎加快解释器的运行
0 ?# }$ p$ {0 o7 QC.缓存脚本输出以提高执行效率1 E8 [7 w3 ]2 z) a
D.缓存解析器产生的中间码,以提高运行效率2 [# p: S1 k' y. r9 z- G- ~
E.在内存中缓存脚本,减少从硬盘中读取的次数
# h( h6 \8 e2 Y; [. _5 M0 b3 N1 s8 m; i3 X4 v/ K2 ?! K
) H  k! i5 Y8 ^. y6 @: m- h
6.以下哪些情况容易造成系统资源枯竭?(双选)
) [9 e: N& H3 y/ i. c' r4 m. V" ?0 s
A.RAM太小
3 x0 j$ d* s" p: V" |( G8 kB.使用了低带宽的连接  D& K% D- P) e4 ?# ?; ]
C.虚拟内存超过2GB
# N9 e" T0 u& VD.允许同时运行太多的服务器进程: D5 {: {5 H+ I" Z6 e! X3 G
E.以上都不对
& ?- p- g$ u9 Y) q" B0 t) x. |- S' p' L+ F* }. H

" w- w$ Y. R9 J% m, }7 ^2 X( B7.以下脚本缺了些什么?(双选) 6 p* l* Q- r' ?

  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" U& d3 [- W6 i
A.参数出口(Parameter escapement)
" m, U, @7 G# n9 e+ f* u  ?B.输出格式化
+ S4 _4 Q9 t/ r& U$ p% ^C.错误检查/ a( v3 H5 ^1 v# ]" X( ?9 j
D.一个SQL查询. {! t0 E. _8 N/ j! x* L+ T
E.以上都不对
# M% H$ G' z) h! i" F1 j" n/ {
/ x  E* s8 r8 c) `! V2 n: |
* J8 T* k4 Y6 t5 D0 L$ E8.以下那种错误类型无法被自定义的错误处理器捕捉到?(双选)
* Z3 B0 g+ n' S* {2 Z& `
( t6 |# G' [1 P( r1 N; rA.E_WARNING
) G* _# F2 V" Q8 V( kB.E_ERROR
/ u# m; @: r+ @C.E_USER_ERROR
. @  u( _. p/ G9 t* t; n  ID.E_PARSE
' M, \9 d% F0 d  KE.E_NOTICE$ \* z/ ^. W/ Y& b) ~4 R1 C

3 _1 J2 n3 G0 ~9 @/ T5 p5 T( U; l4 y/ V  m% J2 \, r2 g
9.当需要比较一个常量和一个变量时,如何才能保证不会错弄成赋值?
  ?7 Z4 ]* ^" m9 j( i0 \0 t8 |8 v, B6 P- M$ d9 \: _6 C
A.把变量转换成int+ |" `* q# m$ I) Z+ m% m. f! k
B.使用全等比较符(===)
, m1 b5 t2 Q! w. }, s7 AC.确保常量是第一个操作数
2 Z& m" F; c" CD.使用三元运算符
" Z9 L  B/ ?8 J) SE.用括号把操作包起来
- p' {$ s8 Z; O  N
8 }( H2 ?+ C' ?' i" k5 b( k* E3 ]' |, c: ~9 ^
10.要通过邮件给系统管理员发送错误信息,以下那种方法最简便?
$ u) ^2 m% ?3 M* X9 ]
3 p+ A! s/ y$ E6 S$ FA.创建一个连接远程SMTP服务器的函数' d/ ]& P! }7 P! L* y* D" Q' z
B.使用mail函数, a6 T8 e, I4 k
C.使用error_log函数
, m# G& @- m7 `D.调用sendmial程序% L. Q& `, B/ k$ y4 \
E.使用webservice
- b" p( {- H' Z: L3 |  R# E# s
* g0 {$ D" q6 `5 t
2 R$ T7 {6 }; \# q2 N11.能否仅调用一个函数就关闭脚本内所有的错误报告?$ G8 M+ }9 p  S7 W+ i
  |% b! @7 E, d/ ?2 c
A.能
/ T" k3 Z7 X  S2 X+ NB.不能
' W6 z" E$ M) r! n' ~
/ t  @2 W9 e9 F) X6 E$ O6 ^0 J  |' s
12.概要分析器(profiler)是做什么的?
& b7 f/ p/ }3 X/ o
- @. t" E# Z( o4 jA.创建关于脚本结构的档案
( \# q2 b2 b. _# ^) O  [B.把脚本转化成UML图# p1 z- H- N- U$ S
C.精确测算脚本不同部分的运行时间4 P) p! M0 y- b1 J; I
D.计算脚本通过web服务器执行时的维度
8 y1 M+ x& l1 L4 q6 fE.扫描脚本,识别由常见错误导致的bug9 t3 c$ q' s5 l8 {" d$ M% m
7 M( {3 \. ~; z1 T

& ^- T2 ~4 x9 _! d1 X# @' Q13.______能帮助识别和解决bug。/ p0 {8 u- W6 B, r% U- ?

( U1 j* x- \/ D! q& R+ Q, I答案:____________
8 A6 g+ Z+ D) Z9 V7 R4 P2 d- N4 ^
3 G/ s9 P8 W. I( V8 y& \; J0 n0 \1 D# \2 C
14.trigger_error()和user_error()有什么区别?: V# O/ j2 E' ]% U$ e

* n* ~. V, y8 w$ R3 A% U4 UA.trigger_error()允许脚本抛出系统级的错误* w3 G) d/ \. p, f: ]* b
B.user_error()允许脚本抛出系统级的错误5 @$ a* w8 e& v6 X. h
C.user_error()不能被用在错误管理器中+ m! N* T$ j3 w9 M* z; A
D.trigger_error只在PHP5中可用+ s; O; l5 N) U: g7 r5 [
E.没有区别" _2 ?" T* u2 e

- x, ^. \& O% I9 o7 ?: G# b4 T' G0 V* X6 C
15.______函数能返回脚本里任意行中调用的函数的名称。该函数同时还经常被用在调试中,用来判断错误是如何发生的。, `/ ?0 W5 ^4 E+ Y9 V% t2 C
# J* K3 c& t: T: C1 I
A.print_r7 P, X7 S# X* w, S
B.var_dump) h0 k4 @# I/ n+ `- ]: S  |3 g1 w
C.stack_dump
) }, R$ E9 L  @' xD.debug_backtrace
5 U: y- {9 Z8 Q( {, b% D/ [) y; ^: [; PE.以上都不对
5 o1 x5 Q. D4 Z( {( |8 Y% J* U; |+ H, E" W3 w
答案
' s5 X! S8 R( x4 |
2 C5 \) R; X0 F# B. x1.答案是E。三元操作符把每个if语句连到一起,作为&&操作的一部分。然而本题中,$x=1这个赋值只在第三个if为false时发生。如果第一个和第二个条件都不成立,$x=1就不会执行。这题对三元操作的应用有些极端,实际应用时,需要根据可读性来决定是否需要用三元运算符(本题这种情况就最好不要用)。7 H' y: l5 ]5 B* n
) F- t+ Q/ m# j. s2 i
2.问题是由第三方数据源传输缓慢导致的,而你无法控制这个数据源。你也许能在网络连通性上做些工作(假设问题出在你这一边)。还可以对接收到的内容进行缓存,这样能减少获取重复数据的时间。因此,答案是B和E。
9 u, o- @! K/ R  A% H2 [+ T  ?* v- r: L; b! _* Q0 l
3.正确的选择是B和D。如果关闭错误报告、使用@抑错符和关闭错误日志,那么在你交付给客户的网站出现问题时,你将很难进行分析和调试。
* q/ F& {% K8 n
* ^7 e# B+ O- z) e4.这是在描述===操作符。
3 X% ~8 C5 Q" t' N0 q6 h1 q; r- ?4 F) J# f, W
5.正确答案是D。PHP脚本在执行时,将首先被解析成“中间”码(也叫opcode,操作码),然后解释器执行。操作码缓存出现在这两个步骤之间,对解析器的输出进行缓存。下次执行该脚本时,将缓存的输出直接送入解释器。这样就就不需要再解析一次了。
$ w" v2 Q/ w0 I2 @) ~6 e$ j; w3 y, [
6.正确答案是A和D。如果RAM太小,进程间将出现资源竞争,服务器将大量使用硬盘交换。同样的,如果允许过多进程同时执行,也会使服务器频繁进行交换,导致速度下降。
: ~" a7 y: y, f$ E* N, ~# E
. ]. z7 x! G/ z+ h2 ~7.正确答案是A和C。脚本不检验datebase_query()的调用是否成功,因此将持续执行下去,最终产生错误。此外,$my_id参数没有转义——可能导致代码注入(详见第11章)。
' V7 L% h1 r, k( P& H+ @
8 ^% B4 I1 r# K& m  J6 O; \* H8.答案B和D正确。出现解析错误往往表示脚本中有语法错误,自定义的错误管理器无法捕捉到它们的原因很明显:错误管理器在脚本里,而现在无法解析脚本,管理器也就无法执行。类似的,E_ERROR表示有致命的运行错误出现,比如内存耗尽。因此脚本会立刻被中断,因为解释器无法执行后面的代码。
' b5 C1 L  R, p+ Y4 d8 w
( s: [8 O  I: q9.答案是C。比较操作是一个可交换的操作(就是说结果独立于操作数之外),而赋值不是。因此,比如说,$a==10和10==$a是等效的,而$a=10和10=$a却不是,而且后者会导致一个错误,因为这不是一个合法的操作。确保常量在操作符前面,能保证你不会错误得将比较变成赋值。
6 S# X  W3 ]" Q" O% y9 l: z  n1 y+ w3 X4 M/ S( h
10.答案是C。error_log函数能将信息送往一个指定的地址。尽管mail()也可以用,但error_log能自动给邮件添加标题,因此这才是最简单的方法。8 L9 p) i+ Z( n' U

8 f3 [5 b; a; R5 F' ]! A11.答案是不能。error_reporting函数能关闭所有运行时的错误报告,但对解析时的错误无效,因为解析错误发生在脚本执行之前。
3 I- ~# ]$ g) h. [4 D6 a: a7 B4 a' Q; G" e2 u$ x! `
12.显然,答案是C。概要分析器(profiler)能监视脚本的运行,并记录单个部分的运行时间。它可以用来找出和解决瓶颈。
) Z) E: i) i# H( V) z! S: W6 I( z5 G8 K  }: f' l
13.这是对调试器的完美定义!你可以用调试软件监视脚本运行,同时分析系统资源消耗,从而发现和解决程序缺陷。& t' p0 H$ ^7 v8 H4 T9 r1 t

2 X0 O& h$ d9 s5 q, K- B14.trigger_error()和user_error()之间没有区别。后者其实是前者的别名。- t/ M9 h" s& y7 ^# _4 g' b2 m

$ [# I2 N* a5 X  Q15.答案是D。题目是在描述debug_backtrace函数,它返回一个由所有在代码的特定位置调用过的函数名组成的数组。

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