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

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

作为一个开发者,无论你经验多么丰富,或者无论你多么努力,你的程序中总会有bug。这是生命中一个必然的部分,如同死亡与缴税(尽管并没有后面两个那么严重)。+ H6 p& n) I) N- j; ~7 z
要想解决bug,首先要能找到bug。事实上,许多开发者花费了无数小时茫然得盯着代码,只是因为他们没有把程序的容错能力摆在首位。忽略了这个部分,那么期望一个没有bug的程序就是——不可能的。
$ l( Q6 k% l, M8 R! _' c本章测试题将考察你对调试和性能管理相关知识的了解,以及如何用PHP做好这两件事。
: @% J% T8 _7 n" L1 m5 ?3 e2 L. x" |' f; F" {

0 Y8 @2 L! |% x) I问题
' \4 |3 n) T7 J: z8 k: v5 ^% T% c1 E* ~# \6 f6 L; B) w' z" y
1.以下脚本如何用三元操作替代? & H( F- E* i0 G1 X3 w

  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" P$ m% k" r1 r, w* y
A.$x = ($a A. < 10 || $b > 11 || $c == 1 && $d != $c) ? 0 : 1;
) @+ e1 {4 b# _! {' CB.$x = ($a < 10 || $b > 11 || ($c == 1 && $d != $c)) ? 0 : 1;
/ v+ \; {' ]: {; X" ?0 p, K: l: TC.$x = (($a < 10 && $b > 11) || ($c == 1 && $d != $c)) ? 0 : 1;
: a' w+ V. t0 QD.$x = ($a < 10 && $b > 11 && $c == 1 && $d != $c) ? 1 : 0;
8 [; m5 u: U/ iE.以上都不对3 f" L# z* S* K% g, Z  V; Z
8 e* Q  N8 h. P9 w: }" j7 s, i

  v" P4 m, B6 x' ?* _/ w$ z# d  F2.有一个脚本由于要从远程获取数据,因而运行速度很慢,以下那种方法能对其进行优化?(双选)" ?7 s3 u9 Q& d3 l9 J; x- E* {
8 m" O/ i. x2 b. h3 \
A.安装操作码缓存(opcode cache)
, c! [; T" }$ a* d/ LB.优化或者升级你的网络连接
( K4 z6 M+ s: I* r( Z/ K- |C.添置更多的硬件
! H+ e' g0 `- qD.增加服务器的可用RAM* H/ Q% M# A7 z
E.使用连接缓存3 S8 n& ]3 L  `' B

. Q3 C" a9 u7 D! E& |: u1 p; {) _$ b' y/ V: z+ q/ M1 P
3.架设生产环境下的服务器时,需要做哪些步骤?(双选)
4 @2 \. _+ o& u7 h$ p; N& `+ g( Z
4 L8 y' U) y, u1 K5 s4 D, U2 X" LA.关闭错误报告3 r$ F2 l0 p* v& p
B.打开错误日志7 Y- U: U" _  n/ T; M5 A# Y1 c
C.关闭错误日志. M2 {( O( H. M3 h, F. t
D.关闭错误显示/ S% v- J% |  {4 P
E.使用@抑错符
2 y% E: c2 H5 U1 Y+ z0 i) V9 V, d4 O4 W
# R6 J0 X! i. }! N1 L
4.______操作符能对操作数的数据类型进行严格的比较?- c2 T5 w& q8 Z# O# `# P
; ?  D3 |' M* m; g5 C: h6 A
答案:____________
6 p9 K+ _# I6 l- M* ]$ G9 \( l, u. p& f

: t* ~6 @2 I6 q) b* F5.操作码缓存(opcode cache)能做什么?
, m: ?9 i$ }) D8 ]# U0 r4 z
: G* g4 `0 w! T2 w/ p5 v1 PA.把脚本编译成二进制对象,使它运行得更快
: d) d+ j) C2 Z- mB.代替Zend引擎加快解释器的运行7 p1 C% A4 P3 m+ w3 P
C.缓存脚本输出以提高执行效率: V, v. w) z- o1 r5 J
D.缓存解析器产生的中间码,以提高运行效率; c- Z- F$ C/ j! e
E.在内存中缓存脚本,减少从硬盘中读取的次数
: ^# @% s* ^$ d2 d( C8 W4 P% ^5 ?$ i2 p* M) U" j2 d8 Q

. M( |* W# p( c9 G6.以下哪些情况容易造成系统资源枯竭?(双选)
) }1 j8 v1 B* b  b8 R' Y2 S; R  }6 A+ b; n* A5 D1 A* ^
A.RAM太小4 y. f8 [3 w8 A0 _$ N$ B; }, F
B.使用了低带宽的连接* b1 E9 _) M4 e  l7 w; E3 k
C.虚拟内存超过2GB# f5 t; D- W) d! j( `
D.允许同时运行太多的服务器进程' j9 S% b2 |* i
E.以上都不对
5 \0 Z/ [, H9 \3 n2 J6 f2 ~2 [& s% `/ @; u0 [

( i' A6 W9 M/ N3 t( G0 E9 J$ h7.以下脚本缺了些什么?(双选) ( m& S$ O: w. 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. ?>
复制代码

. }- S6 t5 s- ?" e( F' a- D7 u6 {( JA.参数出口(Parameter escapement)
9 O8 `: Q$ [6 U# g" JB.输出格式化8 W0 [- h' e9 a/ c$ S6 V9 a  |* T7 c
C.错误检查
( j3 S  o2 r3 QD.一个SQL查询
4 B0 ^( W1 X- q% nE.以上都不对. l! `  Y$ j% V$ T  K
4 Y; h; f# R9 m9 B' t. Q& k+ ^
6 O( V# t7 g" v6 Y  u7 X1 r; [
8.以下那种错误类型无法被自定义的错误处理器捕捉到?(双选)+ o; U% Y  R: t9 `: @3 g+ z

& i. B7 o5 z8 F/ f% J( QA.E_WARNING5 h1 Y7 m% ?3 |+ t! m( w
B.E_ERROR9 W$ a6 s. U- T) S  P
C.E_USER_ERROR7 s; i, J- g/ j6 I
D.E_PARSE
0 Q- W+ F  `) E1 V5 c' f8 RE.E_NOTICE
  A& c- m( d# J: {0 o
4 f% N( V  @6 ^9 Y* U# q
0 Y( a" t7 J! ?9.当需要比较一个常量和一个变量时,如何才能保证不会错弄成赋值?
# Y, O7 ~2 ~2 g2 t; W" Y  ?/ b
# K3 q3 c$ W$ s# D7 _A.把变量转换成int
# H0 N; v; O6 m; t& IB.使用全等比较符(===)
: ]  I; t3 b% a, b* x. e8 K2 @# }4 RC.确保常量是第一个操作数- B* P7 v6 D1 X
D.使用三元运算符
& h* c- k8 J( q  S1 QE.用括号把操作包起来
8 t( B; Z  c+ d) R6 Q9 m. f& F5 l+ k9 W5 a6 ~, E; I# l/ }: U; F

0 @& z+ U$ Y0 t10.要通过邮件给系统管理员发送错误信息,以下那种方法最简便?2 `! Y7 q9 g* J- y9 b
+ h0 ~9 X5 U" h  t1 X( Z( O1 p
A.创建一个连接远程SMTP服务器的函数
! n$ d: e$ P; vB.使用mail函数! a% w$ d2 W/ @5 A/ g: l+ Y
C.使用error_log函数  F( y: R( `% Q/ t1 ^
D.调用sendmial程序
& c" d+ \( Q+ P9 ^+ h/ \E.使用webservice
; r4 ~* g) r  ?5 g  B1 t
4 h8 A# f: h( n! U" K. |- [8 ~( N6 @) Z" r- t9 C* @6 n: w
11.能否仅调用一个函数就关闭脚本内所有的错误报告?- M( |. n; W2 ~' a9 u8 {+ s9 }2 b
# ~: Y" t0 t1 D0 D
A.能
$ }" r, V# ^7 X* [. C: zB.不能
; _. Z6 S% j& g7 q* l' o
. r& i8 @) Q8 {, N4 c7 {/ A1 h  s" N6 C5 V0 c) a! D4 }& V
12.概要分析器(profiler)是做什么的?
) _; @7 T) E0 |& I+ `/ m' b+ M. [( X4 @2 T- H- M7 U
A.创建关于脚本结构的档案
6 @' y& @  {! u' _2 q: yB.把脚本转化成UML图
. c- @3 Z. X+ uC.精确测算脚本不同部分的运行时间
, M* F+ p$ a) D( xD.计算脚本通过web服务器执行时的维度! K* L2 p: K! Z9 ]! ^* N5 c
E.扫描脚本,识别由常见错误导致的bug& x# b4 y) W, @8 |  p9 R

  @8 K9 a7 A5 ^6 ?9 G! G( T) [4 Y) Z2 }' q! k9 N4 \% A. n% F6 @: ?
13.______能帮助识别和解决bug。
( K' c. a. X/ c7 D' V6 A) i$ x5 R( |
答案:____________
1 K2 k2 P6 x% K, ]% }* o. Y' p& v( o, i. i: t7 v: B

3 J3 |# B& r/ V+ R14.trigger_error()和user_error()有什么区别?
9 G' w! ^1 m# X, F% v
( k+ H& \( I6 w* q& YA.trigger_error()允许脚本抛出系统级的错误9 _) d9 r: g  N. u! v9 H% \. z
B.user_error()允许脚本抛出系统级的错误
  E# i5 |# J7 N+ ]' K9 DC.user_error()不能被用在错误管理器中, v4 |! m5 l  s
D.trigger_error只在PHP5中可用
: n, o( b9 q/ M) I9 w% vE.没有区别
. G1 h# m4 x2 `1 K9 p5 X6 q) U; t7 C. [2 C4 z

; o  s1 z! x& c. ^" c15.______函数能返回脚本里任意行中调用的函数的名称。该函数同时还经常被用在调试中,用来判断错误是如何发生的。* ^% L- @0 B4 X& ]6 r: u% ?+ i% a
% W3 c$ p6 e' @9 g
A.print_r/ u9 w# t! I8 H  S2 d; `4 r6 G0 p
B.var_dump$ ]5 F- Y, {) E/ o6 t
C.stack_dump$ X8 P& }# _+ I& s' @0 W- M- ~
D.debug_backtrace! J% I, Q* j# f
E.以上都不对
* I: ~8 k9 Q7 \2 U& _
3 V* y0 R7 R6 K+ P答案
6 P( B9 {) a2 f
9 V& r* Q" y* I+ J1.答案是E。三元操作符把每个if语句连到一起,作为&&操作的一部分。然而本题中,$x=1这个赋值只在第三个if为false时发生。如果第一个和第二个条件都不成立,$x=1就不会执行。这题对三元操作的应用有些极端,实际应用时,需要根据可读性来决定是否需要用三元运算符(本题这种情况就最好不要用)。
2 w+ L6 J9 ]4 ~, b+ }: b3 a( ]( `( n* t( y- }
2.问题是由第三方数据源传输缓慢导致的,而你无法控制这个数据源。你也许能在网络连通性上做些工作(假设问题出在你这一边)。还可以对接收到的内容进行缓存,这样能减少获取重复数据的时间。因此,答案是B和E。
& W: \% n  c6 |( {. [! H
& @: L' x  B$ K4 G5 y- I) Q3.正确的选择是B和D。如果关闭错误报告、使用@抑错符和关闭错误日志,那么在你交付给客户的网站出现问题时,你将很难进行分析和调试。% ]4 U! }0 r1 \% Y% }4 |
9 k$ `6 [9 I8 s
4.这是在描述===操作符。4 s* i$ W' X6 M1 v

2 Y3 c9 f& G6 y6 ?7 P; w3 Y' S5.正确答案是D。PHP脚本在执行时,将首先被解析成“中间”码(也叫opcode,操作码),然后解释器执行。操作码缓存出现在这两个步骤之间,对解析器的输出进行缓存。下次执行该脚本时,将缓存的输出直接送入解释器。这样就就不需要再解析一次了。
3 _2 e$ t6 d" ~( I5 R
) d% O0 x* ]* h+ t7 {1 j2 w6.正确答案是A和D。如果RAM太小,进程间将出现资源竞争,服务器将大量使用硬盘交换。同样的,如果允许过多进程同时执行,也会使服务器频繁进行交换,导致速度下降。2 D  s1 {; l) ~: C
1 K& t9 V. @4 F( H; i7 ]* M' g" O6 u
7.正确答案是A和C。脚本不检验datebase_query()的调用是否成功,因此将持续执行下去,最终产生错误。此外,$my_id参数没有转义——可能导致代码注入(详见第11章)。
+ l( o5 g9 s1 T# L8 l/ }! r  h! c( F, t, N) @
8.答案B和D正确。出现解析错误往往表示脚本中有语法错误,自定义的错误管理器无法捕捉到它们的原因很明显:错误管理器在脚本里,而现在无法解析脚本,管理器也就无法执行。类似的,E_ERROR表示有致命的运行错误出现,比如内存耗尽。因此脚本会立刻被中断,因为解释器无法执行后面的代码。
8 Q. H- a* o6 h6 Y% d+ C( `) I; j3 g% _* r
9.答案是C。比较操作是一个可交换的操作(就是说结果独立于操作数之外),而赋值不是。因此,比如说,$a==10和10==$a是等效的,而$a=10和10=$a却不是,而且后者会导致一个错误,因为这不是一个合法的操作。确保常量在操作符前面,能保证你不会错误得将比较变成赋值。
7 P5 D7 j; Y/ U' d9 C
  o# R+ ~8 |8 y* `- q- M10.答案是C。error_log函数能将信息送往一个指定的地址。尽管mail()也可以用,但error_log能自动给邮件添加标题,因此这才是最简单的方法。8 N  Y2 B$ m5 p; Z+ j9 i% c6 S

+ X, o" y& f+ {" E* u, C+ o5 v11.答案是不能。error_reporting函数能关闭所有运行时的错误报告,但对解析时的错误无效,因为解析错误发生在脚本执行之前。
6 q7 B: O' v- Y2 t$ T% B
  U9 p1 |) u/ S8 [$ D12.显然,答案是C。概要分析器(profiler)能监视脚本的运行,并记录单个部分的运行时间。它可以用来找出和解决瓶颈。
4 \, J! v; U6 m8 ?3 M4 n7 A2 F7 I& U4 ~/ d0 u) R* o
13.这是对调试器的完美定义!你可以用调试软件监视脚本运行,同时分析系统资源消耗,从而发现和解决程序缺陷。$ x1 r. f; K. i1 T3 L6 N

0 O% d- \7 w9 k14.trigger_error()和user_error()之间没有区别。后者其实是前者的别名。2 ?  H3 V' O+ K; m

6 e7 n$ z, j0 k. `15.答案是D。题目是在描述debug_backtrace函数,它返回一个由所有在代码的特定位置调用过的函数名组成的数组。

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