返回列表 发帖

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

作为一个开发者,无论你经验多么丰富,或者无论你多么努力,你的程序中总会有bug。这是生命中一个必然的部分,如同死亡与缴税(尽管并没有后面两个那么严重)。* X+ p& P) }6 D; B& p2 Q
要想解决bug,首先要能找到bug。事实上,许多开发者花费了无数小时茫然得盯着代码,只是因为他们没有把程序的容错能力摆在首位。忽略了这个部分,那么期望一个没有bug的程序就是——不可能的。1 U6 j5 D& u( m! o, c8 l
本章测试题将考察你对调试和性能管理相关知识的了解,以及如何用PHP做好这两件事。( N  k8 D& N, `: t  F' `( x
' T: A. g. N& |, u7 V9 A* @) w

( v5 o. r3 z; z6 b$ d. K9 E问题* ~  r. g( L) x* H/ L3 v' S& A* U

5 j5 g+ k% J7 d1 n/ S( h2 m- C1.以下脚本如何用三元操作替代?
$ v" W+ O! T  u3 m) ?5 \' B( D5 m

  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. ?>
复制代码
: I' I; A- E, E) K+ q# ]
A.$x = ($a A. < 10 || $b > 11 || $c == 1 && $d != $c) ? 0 : 1;) ?) l4 n- B4 c1 G3 N+ U- |( p
B.$x = ($a < 10 || $b > 11 || ($c == 1 && $d != $c)) ? 0 : 1;
, V! Y# z/ m7 }7 i$ sC.$x = (($a < 10 && $b > 11) || ($c == 1 && $d != $c)) ? 0 : 1;7 M# Q4 C" P! ^5 h9 |  X" `! }" H
D.$x = ($a < 10 && $b > 11 && $c == 1 && $d != $c) ? 1 : 0;  h7 _% z! P, l3 [/ b
E.以上都不对
4 W* o+ g& e; _
( l( e, @; H% E8 c
0 R" c6 |7 q1 Q1 u  ~2.有一个脚本由于要从远程获取数据,因而运行速度很慢,以下那种方法能对其进行优化?(双选)# x' d  Y6 t9 _/ c
% w; k. s1 l! m2 P- }
A.安装操作码缓存(opcode cache)- M/ D2 T: f% ~, Y9 c' N% t1 I
B.优化或者升级你的网络连接  w2 i7 w# _" c
C.添置更多的硬件1 L/ ^! Y" ?$ d$ @
D.增加服务器的可用RAM9 o( n; z. y/ }/ V
E.使用连接缓存
! E$ P0 v& n% x* r, w" H/ h' T& X5 [
+ B  h5 F6 Z+ V/ c( ]/ e5 z
3.架设生产环境下的服务器时,需要做哪些步骤?(双选)6 z, Y: v1 k( Q8 a/ Q& J
* G. x; G, p$ m0 I. G0 U) {
A.关闭错误报告* i8 z8 A" e8 r" v
B.打开错误日志  G! R8 G9 {7 X) G/ R! C
C.关闭错误日志
' o8 c7 P  B, C2 `. q" E1 B9 DD.关闭错误显示
& t  l" X8 x! ]. PE.使用@抑错符
: q  s4 Q- ~$ r
7 Y9 K+ o3 r* P, |# V1 M1 h( K3 J! T* Q8 |3 f% p& n4 Z5 D
4.______操作符能对操作数的数据类型进行严格的比较?
% z7 m5 E$ n7 r. X( E; c, ^: A" i
答案:____________
& d& G3 J5 a% [! Y; E6 b" K2 ]* I+ g" y# s0 O0 W% \6 s, E
7 E+ v( t  e4 h+ k5 f8 q% I; J
5.操作码缓存(opcode cache)能做什么?4 r% N7 h* w: H1 J0 d# }. D
- w( F' \/ Z6 {/ l. u
A.把脚本编译成二进制对象,使它运行得更快
$ @0 o! k0 Z" ~" S, J5 ~5 t! N2 }B.代替Zend引擎加快解释器的运行- T0 ]: E! q" x$ [9 O2 w" e
C.缓存脚本输出以提高执行效率
8 ^& d* J5 y! K& tD.缓存解析器产生的中间码,以提高运行效率
+ @; x6 n  R9 Q; j/ d7 m4 w! yE.在内存中缓存脚本,减少从硬盘中读取的次数
- c& |9 Q) G9 ~! Y
: q! p5 U! ]# M  Q1 ]# Q' t6 L
9 c" `. U8 Y5 E$ y/ h6.以下哪些情况容易造成系统资源枯竭?(双选)
( C: {) }+ l# Z3 @: M4 P
. l5 L' u2 g1 f1 i/ lA.RAM太小; o! J* Q0 k5 y! D9 s8 N, E: A
B.使用了低带宽的连接
& R" h- |/ w0 t* ?) xC.虚拟内存超过2GB. y" _1 D7 E8 y: K
D.允许同时运行太多的服务器进程. [. u7 z% n$ Q) ]3 O
E.以上都不对$ y/ ~, ~1 Y0 Y8 K2 F" E3 q3 q  N

( t6 S& k8 \6 F4 z9 v$ s8 r
5 [2 Q2 g7 n3 ]% D7.以下脚本缺了些什么?(双选)
' m- o" a: @+ U; ]2 t6 y

  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 S4 u: ~) o# J/ ^8 W1 l$ g- E, Z
A.参数出口(Parameter escapement)
& n7 ]" {, ^. G. C& }B.输出格式化
( F& C$ T8 {  C, p% M$ A  _! ^C.错误检查1 @( g+ r# C  @$ \* u9 K
D.一个SQL查询
9 W2 F5 [: k7 S3 n* s" _E.以上都不对
- N8 U$ t9 G& E4 v. I$ d8 l
1 t; Z1 U2 q" v+ w0 \- w1 b1 C6 v' b) h; P7 T# g& o" E$ W* H
8.以下那种错误类型无法被自定义的错误处理器捕捉到?(双选)
8 g! v1 p/ T3 S$ _' \
2 x  \2 Z' P, YA.E_WARNING
* _5 E! h; m$ f8 R4 m( EB.E_ERROR
% y6 @: r$ s+ m# QC.E_USER_ERROR
: `) B* ~" C! x9 m, I% p% V) YD.E_PARSE! i# K2 e0 p5 j
E.E_NOTICE# [  Z# ^- s5 i9 G

  v6 S* x- J" [, i" q; Z
, Z7 e; C& X# N; o; e. |9.当需要比较一个常量和一个变量时,如何才能保证不会错弄成赋值?
# I. J: E; i: u% ~, r$ z0 Z
0 b+ H; U' a, Y" ~* nA.把变量转换成int: |  ~- G4 p1 Y# V) j
B.使用全等比较符(===)2 T  A* m& }( H5 b. x
C.确保常量是第一个操作数4 Y# u/ D/ @+ @  z3 T1 s" O
D.使用三元运算符- D& ]- a1 ]0 C' p3 a
E.用括号把操作包起来
) m+ a$ \; v8 p; r" M2 |' ]
: W: N0 e% B1 `  p, j, V1 S
% K9 a! v8 M$ W: L6 e& ^9 q10.要通过邮件给系统管理员发送错误信息,以下那种方法最简便?& X5 _+ K- X) Z2 x. u

4 I/ E; K! ]$ nA.创建一个连接远程SMTP服务器的函数
1 Y* {* M& W) I' a, m% TB.使用mail函数
4 I0 @) d1 X9 B# V. S* h! n9 eC.使用error_log函数
' W1 ^; i6 B/ j7 {: X0 fD.调用sendmial程序& T4 i; Y; D" K+ c
E.使用webservice- z! |+ Z6 ~/ a/ Y

/ T) ~: P) a! P+ ^% X5 O
2 N$ e" R3 f$ k- a9 P/ l11.能否仅调用一个函数就关闭脚本内所有的错误报告?
# y; h0 L2 E& [( X; n# ]+ f7 \) Z: [8 u4 E% N0 j" y) r
A.能
) {5 t6 \5 X* d7 V5 I& Y7 b1 P+ CB.不能  z+ D# @6 m/ b& X: A) d

; m" A) H0 @' b$ \, {$ p* A; [) e1 [" \7 [
12.概要分析器(profiler)是做什么的?6 b+ S3 s0 S) f) H! U
5 t- M  Y) G2 |8 A
A.创建关于脚本结构的档案0 E8 P4 S8 b8 J/ o1 ]
B.把脚本转化成UML图
: @- S, Q# v- _7 ^0 n) H1 q  GC.精确测算脚本不同部分的运行时间6 r' W0 Y' J* ^
D.计算脚本通过web服务器执行时的维度
3 W0 l8 V" l0 t$ }* A2 Q# pE.扫描脚本,识别由常见错误导致的bug
; q/ h' e4 @6 M1 o2 F
4 I2 c6 [; t$ N& H2 I4 a5 f' g8 ?* P" _
13.______能帮助识别和解决bug。
: v2 o/ n/ }4 A8 S- I
* B8 E, L/ P3 ^答案:____________
& E& f. U2 ]* e4 C4 v: l! i, Q- |) Q" E
& C7 o& X; s, G# n( c7 B% {
14.trigger_error()和user_error()有什么区别?
/ g- U6 k) o& s5 V( L2 \; J  {. j6 K0 |5 k4 c/ e5 l* i
A.trigger_error()允许脚本抛出系统级的错误0 S! o9 s6 t- b! X- B' y* b
B.user_error()允许脚本抛出系统级的错误) B2 I& g  T* W9 W! h& J
C.user_error()不能被用在错误管理器中/ h2 C" l' o, T5 v+ Q- O. J
D.trigger_error只在PHP5中可用
% i% i4 E* k2 r0 u5 zE.没有区别) b8 u% a- x) t; _

: V% ?: G* p8 E1 @0 b. m2 L( v6 `5 F% l
15.______函数能返回脚本里任意行中调用的函数的名称。该函数同时还经常被用在调试中,用来判断错误是如何发生的。+ ^1 i1 w. ]# E2 W/ G& j% ^; A
. {8 {  i+ @# `3 E# r# a1 g
A.print_r
9 ^, b2 C' w' J( R1 yB.var_dump' m& A. N+ L4 B. `
C.stack_dump3 N  s( I$ ]) j- R6 k# h9 x
D.debug_backtrace
4 @- k$ y) M6 C( ^8 uE.以上都不对
6 z: z3 g% g7 @0 }$ C) L; l! C3 L- Z; [  X9 W1 ]
答案
/ j/ h) ]7 z; l
: q) i* P2 }! e, U. t6 {$ ]+ Q1.答案是E。三元操作符把每个if语句连到一起,作为&&操作的一部分。然而本题中,$x=1这个赋值只在第三个if为false时发生。如果第一个和第二个条件都不成立,$x=1就不会执行。这题对三元操作的应用有些极端,实际应用时,需要根据可读性来决定是否需要用三元运算符(本题这种情况就最好不要用)。* U" h% G, P; o8 L3 D! V' X

) {; ?* p! ~9 Q) g- Q2.问题是由第三方数据源传输缓慢导致的,而你无法控制这个数据源。你也许能在网络连通性上做些工作(假设问题出在你这一边)。还可以对接收到的内容进行缓存,这样能减少获取重复数据的时间。因此,答案是B和E。& K; @8 F8 y- j8 `7 w

6 c! h) r$ E0 e! Z- q3.正确的选择是B和D。如果关闭错误报告、使用@抑错符和关闭错误日志,那么在你交付给客户的网站出现问题时,你将很难进行分析和调试。( L7 _& w3 j5 j4 i
* d2 P2 g+ F" {! P( j& Y1 q
4.这是在描述===操作符。6 e8 v) P# ^: \- q4 l6 p
- K1 R' q, o- V
5.正确答案是D。PHP脚本在执行时,将首先被解析成“中间”码(也叫opcode,操作码),然后解释器执行。操作码缓存出现在这两个步骤之间,对解析器的输出进行缓存。下次执行该脚本时,将缓存的输出直接送入解释器。这样就就不需要再解析一次了。5 B3 n) j3 G$ n. _, x" b! X

7 f! o" A2 x' E- d$ D# |6 E1 h6.正确答案是A和D。如果RAM太小,进程间将出现资源竞争,服务器将大量使用硬盘交换。同样的,如果允许过多进程同时执行,也会使服务器频繁进行交换,导致速度下降。1 E7 Z, v* R/ I9 _* z: H8 ~1 d
& V7 r, z# z; v. e3 r
7.正确答案是A和C。脚本不检验datebase_query()的调用是否成功,因此将持续执行下去,最终产生错误。此外,$my_id参数没有转义——可能导致代码注入(详见第11章)。- u+ E$ \9 o7 i1 S% k4 @7 C  [

4 ~6 ^) C  ^" v" h. s8.答案B和D正确。出现解析错误往往表示脚本中有语法错误,自定义的错误管理器无法捕捉到它们的原因很明显:错误管理器在脚本里,而现在无法解析脚本,管理器也就无法执行。类似的,E_ERROR表示有致命的运行错误出现,比如内存耗尽。因此脚本会立刻被中断,因为解释器无法执行后面的代码。
# O( ]/ a( r( _1 W- W; g
3 u- n. w5 f# g) ?# Z9.答案是C。比较操作是一个可交换的操作(就是说结果独立于操作数之外),而赋值不是。因此,比如说,$a==10和10==$a是等效的,而$a=10和10=$a却不是,而且后者会导致一个错误,因为这不是一个合法的操作。确保常量在操作符前面,能保证你不会错误得将比较变成赋值。' }2 p& b- Y+ h4 p# b

5 X6 [% ]( k. H8 B" Y; g10.答案是C。error_log函数能将信息送往一个指定的地址。尽管mail()也可以用,但error_log能自动给邮件添加标题,因此这才是最简单的方法。
, b# e( W' D$ i. P# m
! ~% l& r9 h7 B: v- O) m* G11.答案是不能。error_reporting函数能关闭所有运行时的错误报告,但对解析时的错误无效,因为解析错误发生在脚本执行之前。" c3 P3 d7 }* Q* w
2 L9 S" q7 s/ Z7 `' _' E) n' t
12.显然,答案是C。概要分析器(profiler)能监视脚本的运行,并记录单个部分的运行时间。它可以用来找出和解决瓶颈。
& n8 ?2 ]) N( [( V% t, `  r4 k) j7 T
7 V2 I7 S: l9 B( K13.这是对调试器的完美定义!你可以用调试软件监视脚本运行,同时分析系统资源消耗,从而发现和解决程序缺陷。
) ^. X. \2 r: R
) u5 G1 w8 M  h14.trigger_error()和user_error()之间没有区别。后者其实是前者的别名。
. z% i2 C3 g/ R3 z& e& o  y. x
! R0 i. d1 g' d$ i& g( ?. }15.答案是D。题目是在描述debug_backtrace函数,它返回一个由所有在代码的特定位置调用过的函数名组成的数组。

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