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

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

作为一个开发者,无论你经验多么丰富,或者无论你多么努力,你的程序中总会有bug。这是生命中一个必然的部分,如同死亡与缴税(尽管并没有后面两个那么严重)。
: x2 p3 W  a( B; q要想解决bug,首先要能找到bug。事实上,许多开发者花费了无数小时茫然得盯着代码,只是因为他们没有把程序的容错能力摆在首位。忽略了这个部分,那么期望一个没有bug的程序就是——不可能的。
' S7 Q1 z# x/ }) J3 q3 _本章测试题将考察你对调试和性能管理相关知识的了解,以及如何用PHP做好这两件事。5 ^1 D4 r3 w# X8 i2 S* G6 F% B
, n( N" x/ l5 H

6 C+ S1 I  K) Q, w0 K4 O0 }问题
* m8 l4 b6 c% [8 y
+ C( u1 h# d- `. j5 t/ R1.以下脚本如何用三元操作替代?
/ a' Q) u4 ^- f! L" C5 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. ?>
复制代码
+ k) r9 ]* P. }4 |' d* q
A.$x = ($a A. < 10 || $b > 11 || $c == 1 && $d != $c) ? 0 : 1;3 T9 A- K% j: p" ~( f- p
B.$x = ($a < 10 || $b > 11 || ($c == 1 && $d != $c)) ? 0 : 1;# w0 q  k# Z; {! k! p
C.$x = (($a < 10 && $b > 11) || ($c == 1 && $d != $c)) ? 0 : 1;
! P+ V) g1 k5 e+ G% X: BD.$x = ($a < 10 && $b > 11 && $c == 1 && $d != $c) ? 1 : 0;$ o" I) ]: D9 E- _4 x; U
E.以上都不对# V, K  {  K" Q' I

6 ~7 \$ |+ A5 n1 L/ d+ w0 U( D2 }, p( w! P
2.有一个脚本由于要从远程获取数据,因而运行速度很慢,以下那种方法能对其进行优化?(双选)# m7 W( n# B1 x

8 y, h; T' k( S! x! ~: i& KA.安装操作码缓存(opcode cache)8 c) g. ^3 T5 _! u
B.优化或者升级你的网络连接
3 k' e+ e% h1 EC.添置更多的硬件
, A. H& K9 c) a/ q3 V- VD.增加服务器的可用RAM
- y! F7 }0 K- I  OE.使用连接缓存, ^# x6 h9 R  G, r* `2 _

, o3 U3 w! Z5 o. M0 v# C8 X+ j/ J3 h: D' i- a$ d9 k) e2 b
3.架设生产环境下的服务器时,需要做哪些步骤?(双选)8 A9 g! l6 Y$ v/ P; M$ p
. Z% W! A" M0 X; U9 X( P! r
A.关闭错误报告; Q. w5 `" }; c. B( U3 R: B! F; }
B.打开错误日志
* k; Q# M' C- z. e* v7 iC.关闭错误日志& D5 g# o; q/ y+ B! ~
D.关闭错误显示
7 z; |8 y7 ^2 C- b3 U. R0 j, H4 vE.使用@抑错符
3 v0 X" Z, G) p5 a! ~. M5 ^  B4 w
7 W7 \, ?9 I- K0 [  K, \$ O: f
* V( z/ Y5 o' m/ I5 w4.______操作符能对操作数的数据类型进行严格的比较?* N5 ?4 n' P* v* f& @% ^; c4 Z

+ V# Q3 q% m7 u+ B% W+ F# d4 [答案:____________
3 s0 i8 a  [+ `9 ^0 L4 U& X$ m( p. B3 @

5 G. N% x9 z9 Y3 J9 Z8 a8 k5.操作码缓存(opcode cache)能做什么?- }# |! S: H- r* t. f
7 F5 O6 K/ m$ h, j
A.把脚本编译成二进制对象,使它运行得更快* ]( I" a7 K  [$ R
B.代替Zend引擎加快解释器的运行
% T/ x- p( n; [% }C.缓存脚本输出以提高执行效率
3 v7 A) R8 h) _, k, @0 YD.缓存解析器产生的中间码,以提高运行效率3 v$ q3 M1 G9 X& ?% H" i! J
E.在内存中缓存脚本,减少从硬盘中读取的次数6 p' H( b2 I$ y$ V
1 A3 X3 h4 f7 y; K! C2 P

! l; e# o% j1 c) Y- A% K& D+ I; Q6.以下哪些情况容易造成系统资源枯竭?(双选)9 o1 w& F. j1 h% t, k

% ?+ b9 q+ _( I3 ^% I: B8 CA.RAM太小0 t/ q) k0 A: S+ a
B.使用了低带宽的连接# }1 g9 |; e/ Q' ^( f* ]5 H
C.虚拟内存超过2GB+ m/ j) a( V. z7 i, J. k
D.允许同时运行太多的服务器进程5 t" |+ ^9 w" [% m
E.以上都不对* Y1 k" P1 w; p/ \6 f
2 D4 R+ u/ r' X9 \1 d) ~( I4 a
# L! c1 Z4 ?5 G9 p6 Y
7.以下脚本缺了些什么?(双选) & f, h# B7 s# e( n3 W& R4 z9 F

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

, x8 I- R* |+ m: f3 J* \A.参数出口(Parameter escapement)
* i' g1 V5 G. AB.输出格式化% o& F& s) K5 x2 A" v; S$ ^
C.错误检查
! w5 ^7 y# a  Z) A5 j1 G; D# I/ y: SD.一个SQL查询
* z. }+ v0 I2 r  eE.以上都不对: [% K4 D9 @) F8 J
& }4 ~  H9 z% z& Q  E5 P. h0 @
3 }- E) ]" o. T3 B- @
8.以下那种错误类型无法被自定义的错误处理器捕捉到?(双选)2 G5 w% Y' D3 M5 q
) n9 L+ d1 b8 O7 O6 R0 B5 O
A.E_WARNING
4 U8 B- R+ b* z; g8 q/ UB.E_ERROR
- }0 f3 ^" ]" E6 w$ Q# tC.E_USER_ERROR
8 e1 E$ a! t8 p/ f7 R* f+ h- ]) pD.E_PARSE
! @% t+ H1 P. \/ ]1 tE.E_NOTICE+ R; I  j& O( y4 n5 \: F

, ?2 F3 o  h+ c2 d1 {! U" A  Z3 ?4 d8 ~2 c) z( O6 @2 ?; }: x
9.当需要比较一个常量和一个变量时,如何才能保证不会错弄成赋值?- C3 V( V7 P% M
3 ?  u* e5 L0 X% ]+ t# }# P: r. f3 \$ s' ~
A.把变量转换成int# e0 Z7 I, `6 `
B.使用全等比较符(===)
$ d: l+ D+ G. `, zC.确保常量是第一个操作数* ~; `6 W3 z; H: F+ L: W
D.使用三元运算符
: S' J5 D( I; R% ^  d" EE.用括号把操作包起来( h$ ?; o* g/ e+ J5 T' T; p
8 n* ~# p# \, Q
  A) |" J2 [7 a# |8 k, A+ c
10.要通过邮件给系统管理员发送错误信息,以下那种方法最简便?
/ F! U: c7 t# h- I, g- b7 U
# v$ I" P! _% T" b1 t2 WA.创建一个连接远程SMTP服务器的函数
+ d% v) F& U7 Z1 ~& k; VB.使用mail函数
$ c' v. J6 H; y" {$ Z/ gC.使用error_log函数! y- X  t# F! m( P) Q
D.调用sendmial程序! m+ U4 ?' c# }$ R. l
E.使用webservice# ~* v5 E. L$ [1 G1 ]' \+ T
7 }5 w7 P' I5 Q+ s

: r* o5 J% N% u11.能否仅调用一个函数就关闭脚本内所有的错误报告?  R, ^/ ?" S) [% H
) J3 n$ |0 x( [* z  |- }3 a
A.能& F. E' @0 {4 O
B.不能+ ^0 z0 B  ~1 Z4 G1 Z  d$ ^

% z+ p  ]5 Z8 v/ h: D' M0 X
3 E* k: r5 ?: `" I! @" ?12.概要分析器(profiler)是做什么的?* z8 U. F0 {  E: I! U6 W: A$ [

! {2 q8 `! ?( s. I5 Y. E: c7 FA.创建关于脚本结构的档案3 z" ?9 I; z* w. w! B, V# b. {
B.把脚本转化成UML图
9 j3 W/ j$ v2 Y; [" {! E! w1 ^C.精确测算脚本不同部分的运行时间
3 f  k( A' J% B! I7 p4 L5 ID.计算脚本通过web服务器执行时的维度- _- K) X4 X) k' x& x
E.扫描脚本,识别由常见错误导致的bug$ f( G# w9 t5 Z. X, `

8 _* n" w8 s$ \4 W0 u* Y
( j8 {  H8 r/ [" i! X13.______能帮助识别和解决bug。
/ W% R3 v. M) r6 F
# h) v( W* T4 E4 n答案:____________
$ L- i2 M& T+ o/ X# \" G% P! E' j- @
- g2 c3 g) m4 X0 |2 O8 x( Z- P* y  Q- z# J
14.trigger_error()和user_error()有什么区别?3 w8 U7 T" }. M6 L  U, k9 s
, r# s  [3 B8 l; Q. @0 c
A.trigger_error()允许脚本抛出系统级的错误8 j( i5 s9 _& {# @7 o
B.user_error()允许脚本抛出系统级的错误
" F  v0 `$ M! f7 _C.user_error()不能被用在错误管理器中
0 G* u6 |- _+ x' mD.trigger_error只在PHP5中可用
$ a" v0 d) v9 {0 V! }( Q1 ]E.没有区别0 h2 V- r( P+ a7 \- b3 e: l5 _

: l: c, k8 ]5 b# u4 O
1 @! j6 m  L, R. {" l; Z% k15.______函数能返回脚本里任意行中调用的函数的名称。该函数同时还经常被用在调试中,用来判断错误是如何发生的。  J/ ?- d  c1 o5 T

( S  h, B& a5 t  A3 j7 u7 T  O* XA.print_r1 X: p% D  ]6 v. f- h# g4 l
B.var_dump
  ?7 u/ I5 ]: U) Z9 j. n# A4 n6 rC.stack_dump$ g1 S( q1 x% E
D.debug_backtrace; _, u( f! t. R8 y9 w
E.以上都不对
, l: d9 C  D  f3 G, z' g5 a1 P: ^* b
答案
. J. g1 C3 U, I. d! x/ S7 ^! P' j9 R
- `0 w$ S/ E2 Y1.答案是E。三元操作符把每个if语句连到一起,作为&&操作的一部分。然而本题中,$x=1这个赋值只在第三个if为false时发生。如果第一个和第二个条件都不成立,$x=1就不会执行。这题对三元操作的应用有些极端,实际应用时,需要根据可读性来决定是否需要用三元运算符(本题这种情况就最好不要用)。+ z& G5 d. b1 V) u
- Z+ z# d' s8 `$ Q- W, F: }
2.问题是由第三方数据源传输缓慢导致的,而你无法控制这个数据源。你也许能在网络连通性上做些工作(假设问题出在你这一边)。还可以对接收到的内容进行缓存,这样能减少获取重复数据的时间。因此,答案是B和E。
" w$ L% F% Q* w* S' W* R% U
3 V- d5 g  q9 ?' S, \8 ^% f( @! }4 o3.正确的选择是B和D。如果关闭错误报告、使用@抑错符和关闭错误日志,那么在你交付给客户的网站出现问题时,你将很难进行分析和调试。4 r$ P+ P, V4 S, N
) t: I$ Y7 B: k! a$ y; `/ P+ y. b2 }
4.这是在描述===操作符。5 i) F/ b5 J! @: S0 q2 n
, p: @# R6 F! }' R
5.正确答案是D。PHP脚本在执行时,将首先被解析成“中间”码(也叫opcode,操作码),然后解释器执行。操作码缓存出现在这两个步骤之间,对解析器的输出进行缓存。下次执行该脚本时,将缓存的输出直接送入解释器。这样就就不需要再解析一次了。
, _9 N) A0 E0 P. g; |0 j! M# }* s. C' r* x  O0 U8 j8 l
6.正确答案是A和D。如果RAM太小,进程间将出现资源竞争,服务器将大量使用硬盘交换。同样的,如果允许过多进程同时执行,也会使服务器频繁进行交换,导致速度下降。, A4 f- q$ `7 Y* y) z
" l3 R7 m# e+ u0 H  V+ m
7.正确答案是A和C。脚本不检验datebase_query()的调用是否成功,因此将持续执行下去,最终产生错误。此外,$my_id参数没有转义——可能导致代码注入(详见第11章)。
8 B0 ^7 z. e, A
# k! d8 J0 d6 d3 s8.答案B和D正确。出现解析错误往往表示脚本中有语法错误,自定义的错误管理器无法捕捉到它们的原因很明显:错误管理器在脚本里,而现在无法解析脚本,管理器也就无法执行。类似的,E_ERROR表示有致命的运行错误出现,比如内存耗尽。因此脚本会立刻被中断,因为解释器无法执行后面的代码。5 z$ K2 b+ [; f
7 B$ r1 B- X- i6 ?
9.答案是C。比较操作是一个可交换的操作(就是说结果独立于操作数之外),而赋值不是。因此,比如说,$a==10和10==$a是等效的,而$a=10和10=$a却不是,而且后者会导致一个错误,因为这不是一个合法的操作。确保常量在操作符前面,能保证你不会错误得将比较变成赋值。
4 e& J' N" M5 Z7 G3 w
/ Z/ K. L6 ?) B2 r! r( F, g10.答案是C。error_log函数能将信息送往一个指定的地址。尽管mail()也可以用,但error_log能自动给邮件添加标题,因此这才是最简单的方法。
/ L/ b, E; @$ o2 s+ X
: k1 {) P: }4 X  r! E11.答案是不能。error_reporting函数能关闭所有运行时的错误报告,但对解析时的错误无效,因为解析错误发生在脚本执行之前。) E, n; [; v4 T0 s% t- s

7 g/ ?" g, G9 M% q12.显然,答案是C。概要分析器(profiler)能监视脚本的运行,并记录单个部分的运行时间。它可以用来找出和解决瓶颈。* z, D& }7 A5 i* h  J

9 S$ y3 W5 u$ R2 I& E* q13.这是对调试器的完美定义!你可以用调试软件监视脚本运行,同时分析系统资源消耗,从而发现和解决程序缺陷。
5 y- U& |$ r" w& I, k
2 X  T# u' \& h7 r4 w# N14.trigger_error()和user_error()之间没有区别。后者其实是前者的别名。$ S( k8 ~( b- v, |% K; J0 \+ n& p
/ T, Q' S* _# Y5 Z/ F: c
15.答案是D。题目是在描述debug_backtrace函数,它返回一个由所有在代码的特定位置调用过的函数名组成的数组。

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