返回列表 发帖

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

作为一个开发者,无论你经验多么丰富,或者无论你多么努力,你的程序中总会有bug。这是生命中一个必然的部分,如同死亡与缴税(尽管并没有后面两个那么严重)。
- D1 Y+ m4 e% k. k要想解决bug,首先要能找到bug。事实上,许多开发者花费了无数小时茫然得盯着代码,只是因为他们没有把程序的容错能力摆在首位。忽略了这个部分,那么期望一个没有bug的程序就是——不可能的。9 F. R9 T# T: c8 {
本章测试题将考察你对调试和性能管理相关知识的了解,以及如何用PHP做好这两件事。+ q( A, r% A; r0 ^( H! c( \
% T! I. U9 G! V( J0 h* v
: C9 j/ }! R( |  N) }
问题' ~' H( z4 L7 W/ z
3 ~  C1 V0 u% k5 D* M
1.以下脚本如何用三元操作替代? 1 [# l/ a1 N" I5 A4 I

  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. ?>
复制代码
! T6 s7 G# y' c
A.$x = ($a A. < 10 || $b > 11 || $c == 1 && $d != $c) ? 0 : 1;
" {, N" t- Z+ Y- w. l5 [7 KB.$x = ($a < 10 || $b > 11 || ($c == 1 && $d != $c)) ? 0 : 1;# x% |+ M8 S4 s- B! F+ a
C.$x = (($a < 10 && $b > 11) || ($c == 1 && $d != $c)) ? 0 : 1;
" @3 F! ?* {+ [0 }0 ^4 yD.$x = ($a < 10 && $b > 11 && $c == 1 && $d != $c) ? 1 : 0;0 h* S* s: {$ X* |- x; q- M* g0 S
E.以上都不对7 p, [- E0 ], E; T& s

3 S. U8 x; G( J: ?/ q' v. t0 o' j3 t5 n2 k+ Q
2.有一个脚本由于要从远程获取数据,因而运行速度很慢,以下那种方法能对其进行优化?(双选)
+ e, p3 \# V# b5 Y' F9 A8 D3 r
, U$ S1 m: r1 e1 yA.安装操作码缓存(opcode cache)
; l! T( `+ G% O" {3 d/ QB.优化或者升级你的网络连接3 `, U2 e! c6 Y# S6 l
C.添置更多的硬件
. X! s. Y8 r8 V1 i% uD.增加服务器的可用RAM0 {' n3 f5 ?5 ^8 m( r2 A
E.使用连接缓存
  W1 _* G1 r/ r1 j4 Z
) V# A1 m' g9 S* |' q* J
: l8 n7 ]" Z: s2 C3 ^" x% D$ _' a3.架设生产环境下的服务器时,需要做哪些步骤?(双选)# V) }( t6 E( [4 O; R! v

- I, d# }6 J8 a7 C+ W" y" cA.关闭错误报告" Y2 J' t7 H; `: J
B.打开错误日志. ]6 A/ G3 |7 r) U* x
C.关闭错误日志7 Q( N# F9 F2 Q' B
D.关闭错误显示
& \( s) k9 J, E! bE.使用@抑错符
0 L: n- t; S& C% u7 [$ v- C8 e# C. p% U/ F
- Q! {; q' ~& m$ L
4.______操作符能对操作数的数据类型进行严格的比较?
: i( R! |9 \, K/ w: S; {9 t# P8 o+ r$ ^, j
答案:____________
: S9 s% L# I& R. S, Y. Z1 m2 {0 D0 U8 a0 f8 l

/ w% T) r6 i3 p! S6 c4 H5.操作码缓存(opcode cache)能做什么?% h, m, [8 i  h0 q7 ]9 s
7 |3 L1 k0 D/ \0 k( N8 ]: ]$ j
A.把脚本编译成二进制对象,使它运行得更快
. Z4 b2 |. F5 z( B% V% ZB.代替Zend引擎加快解释器的运行5 z0 @2 n! H" b8 C$ ^
C.缓存脚本输出以提高执行效率7 N: B/ h8 I& z% s/ Z" X" j
D.缓存解析器产生的中间码,以提高运行效率
* S$ U- w+ G% zE.在内存中缓存脚本,减少从硬盘中读取的次数' S2 _, W6 D, |! P
" J# j: A7 G" T2 B
/ m- U+ S' H& u1 z7 G$ J
6.以下哪些情况容易造成系统资源枯竭?(双选)
+ l: A% G0 m- |* u/ q1 K2 }
$ d2 [% G, f& q' K; _- q) OA.RAM太小: I/ P8 W& X# K% |5 t: Z+ d
B.使用了低带宽的连接
# A7 X: {8 s  Q; G6 ]! OC.虚拟内存超过2GB* t) \! d4 R8 t- n& h  _! B( s
D.允许同时运行太多的服务器进程
$ Y9 g2 |/ h2 t$ C2 Q& UE.以上都不对
* T( V* o9 y/ {# o6 p' m6 @4 t; W7 W& t0 J+ f5 C! X
6 F6 `- I# x. a
7.以下脚本缺了些什么?(双选) ; Z1 h3 |$ ?. @) K" u

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

3 b; S- M$ S1 M( x+ K" DA.参数出口(Parameter escapement)3 c0 l5 f( u1 U) \2 ]% ^
B.输出格式化- w* \5 J8 q3 F" l, Q
C.错误检查, Y% l: a9 _7 a* E. i4 k% c
D.一个SQL查询
% }. Q4 G, c) }  E* _; B% yE.以上都不对8 |2 w4 y; K  U: `$ K

  d$ z, p( y1 w5 x/ |& e7 d
8 H7 ]1 p: s" o2 C  t' O4 t- e8.以下那种错误类型无法被自定义的错误处理器捕捉到?(双选)
" Z( Z! S+ @6 q& E  p4 U2 g& u/ V6 J/ k) a8 W1 l
A.E_WARNING
: U7 D" D% C) g" S+ \! wB.E_ERROR: U6 c) A# V. i8 w1 q9 N4 V
C.E_USER_ERROR% P7 [$ E7 ]" `8 @/ e  u
D.E_PARSE
3 V4 Y9 H5 P* [1 C" |+ t4 qE.E_NOTICE
1 h1 c8 Z0 ]& G# p# I
2 O" I1 {! S, c3 x; v% S- H6 Z0 o/ e( M; s5 W- U
9.当需要比较一个常量和一个变量时,如何才能保证不会错弄成赋值?
- N: F* [. X' k; Z
3 B, }' w0 }2 FA.把变量转换成int- W, i3 l( k1 @) [5 ~7 [3 }
B.使用全等比较符(===)
7 ]( y" M" q6 r! J% V( D7 w* YC.确保常量是第一个操作数
; y; n" C( V' \( jD.使用三元运算符
3 m0 S: E7 j3 `2 U/ @0 AE.用括号把操作包起来
) c  D" ]8 e; [
5 U9 O' \  S& Y( N% ]
3 o: g* p( S% F, S10.要通过邮件给系统管理员发送错误信息,以下那种方法最简便?
; C8 O3 @1 M7 s& T4 e/ `4 J. \7 s# n8 B2 c* ]
A.创建一个连接远程SMTP服务器的函数; J2 ?+ i+ n1 o# i) q* g1 l+ R6 b
B.使用mail函数/ T/ d: X  G4 H
C.使用error_log函数' j- \3 _3 @! n0 U7 x7 T
D.调用sendmial程序
- B& w2 z' z- Q3 X) R3 E' Y9 K) iE.使用webservice" [0 }, }1 a( x/ v3 [9 H
; y$ ?9 S! @1 j# P/ O% E5 [( b
9 L- [9 ^- o+ K+ t7 N" ]3 y" t
11.能否仅调用一个函数就关闭脚本内所有的错误报告?
! d# l0 D8 u; u5 L2 d2 H6 G/ C# t" E1 l& P
A.能
1 x+ ]/ X! m1 Q) g( u' `* S+ ^' ]( h! gB.不能
, {/ t) j0 ]# k3 b3 ^' P3 K, e; A4 z, m) a

0 w7 c  V/ Y' a; e: L12.概要分析器(profiler)是做什么的?
) `9 l/ d4 u0 P$ a& Y1 V$ Y' @# `" r' p" O
A.创建关于脚本结构的档案" v" W$ d$ l9 r+ [
B.把脚本转化成UML图) I, B6 f' S/ u, j
C.精确测算脚本不同部分的运行时间& v0 f% J! Y3 Q% F8 z, ?- Z0 D
D.计算脚本通过web服务器执行时的维度1 n; U4 o& x  m8 z* {4 k5 ?4 r
E.扫描脚本,识别由常见错误导致的bug
' ?4 \5 o2 m3 q) L2 v. g9 r8 y1 @: w' h3 |1 v
) Z4 _- I7 z- J! r; }  C4 \
13.______能帮助识别和解决bug。% M7 b+ w# S% s6 h6 U8 P
' H- [6 F4 x+ w/ u/ v7 M
答案:____________
" ?1 S& X& I7 B( Q' h( A
/ j" C$ D! V4 T/ [4 s4 L2 A
5 f6 I* k# i( C5 M2 Q14.trigger_error()和user_error()有什么区别?
+ ~* N7 u* a% \! Y, Y2 k; F* s, P2 N  `% }
A.trigger_error()允许脚本抛出系统级的错误# P) W, k2 ^& c2 I! o
B.user_error()允许脚本抛出系统级的错误% ]" Y. a0 x* c7 u
C.user_error()不能被用在错误管理器中
- T( g0 g5 ?. s& `- }D.trigger_error只在PHP5中可用& U! @; V$ H( u$ Q$ G
E.没有区别
( u) K! u- a4 `3 A/ o9 D( E0 T( n
* ^1 B' G0 W% q1 E+ U
15.______函数能返回脚本里任意行中调用的函数的名称。该函数同时还经常被用在调试中,用来判断错误是如何发生的。1 t1 e  ^8 X; w# r8 K; y

1 j8 B+ D( [  ^1 lA.print_r- s8 _! L1 S, q, `
B.var_dump
& Y- k! v1 I5 WC.stack_dump8 d, V( D5 M, l' P
D.debug_backtrace
. K. n2 t7 U$ I. RE.以上都不对
# c5 _7 i) b- @8 m
* K7 l8 b- S/ F  v0 U9 h答案' G' S! D) E4 W, w- I7 _

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

- q) ^9 s0 W, M8 K. E$ g  A2.问题是由第三方数据源传输缓慢导致的,而你无法控制这个数据源。你也许能在网络连通性上做些工作(假设问题出在你这一边)。还可以对接收到的内容进行缓存,这样能减少获取重复数据的时间。因此,答案是B和E。$ d8 z. t) R/ d* _2 N' M
  x4 N& ?6 N/ x/ B4 T4 v5 o  }
3.正确的选择是B和D。如果关闭错误报告、使用@抑错符和关闭错误日志,那么在你交付给客户的网站出现问题时,你将很难进行分析和调试。/ Y. [3 H  K5 C4 I$ ~

1 ~! D, H) T& l4.这是在描述===操作符。2 Y2 ]$ y7 w. Z, V. q4 W% |
+ X: r0 f4 [! C- N
5.正确答案是D。PHP脚本在执行时,将首先被解析成“中间”码(也叫opcode,操作码),然后解释器执行。操作码缓存出现在这两个步骤之间,对解析器的输出进行缓存。下次执行该脚本时,将缓存的输出直接送入解释器。这样就就不需要再解析一次了。
+ j  t. F) I; J: L( ?$ B# g. E5 }1 N, D# i% t+ G
6.正确答案是A和D。如果RAM太小,进程间将出现资源竞争,服务器将大量使用硬盘交换。同样的,如果允许过多进程同时执行,也会使服务器频繁进行交换,导致速度下降。9 O( m7 d5 z# r7 X* V
% T: R5 g5 N* e( P1 L$ a: T* {
7.正确答案是A和C。脚本不检验datebase_query()的调用是否成功,因此将持续执行下去,最终产生错误。此外,$my_id参数没有转义——可能导致代码注入(详见第11章)。3 S2 p; ?' }  G4 D

+ E; n# y) u, w# Y+ ]8.答案B和D正确。出现解析错误往往表示脚本中有语法错误,自定义的错误管理器无法捕捉到它们的原因很明显:错误管理器在脚本里,而现在无法解析脚本,管理器也就无法执行。类似的,E_ERROR表示有致命的运行错误出现,比如内存耗尽。因此脚本会立刻被中断,因为解释器无法执行后面的代码。
% c8 e2 i  w! |! [! T; A
/ F- g0 b, O- x; @1 P1 s9.答案是C。比较操作是一个可交换的操作(就是说结果独立于操作数之外),而赋值不是。因此,比如说,$a==10和10==$a是等效的,而$a=10和10=$a却不是,而且后者会导致一个错误,因为这不是一个合法的操作。确保常量在操作符前面,能保证你不会错误得将比较变成赋值。
$ E: c) h- C" w! ?3 k0 p: L( {; m" Z: [5 P0 K# ^
10.答案是C。error_log函数能将信息送往一个指定的地址。尽管mail()也可以用,但error_log能自动给邮件添加标题,因此这才是最简单的方法。
- a! |0 j5 b# |& j) b* v& e7 `  E) r3 x7 o6 n0 f1 |
11.答案是不能。error_reporting函数能关闭所有运行时的错误报告,但对解析时的错误无效,因为解析错误发生在脚本执行之前。
( e. B4 V2 f* J3 z# D4 B1 e$ ^3 u6 [$ U9 w
12.显然,答案是C。概要分析器(profiler)能监视脚本的运行,并记录单个部分的运行时间。它可以用来找出和解决瓶颈。
  z( q" N& T* {
! m, u- Z( j5 \  b! k13.这是对调试器的完美定义!你可以用调试软件监视脚本运行,同时分析系统资源消耗,从而发现和解决程序缺陷。
2 w+ a- t7 @; j% j
+ o1 u$ {( J) X( j- `, e% e/ U14.trigger_error()和user_error()之间没有区别。后者其实是前者的别名。) N8 m( q' B# g, |8 y- x
- z! Q' u7 [/ x. g! Q/ u
15.答案是D。题目是在描述debug_backtrace函数,它返回一个由所有在代码的特定位置调用过的函数名组成的数组。

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