返回列表 发帖

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

作为一个开发者,无论你经验多么丰富,或者无论你多么努力,你的程序中总会有bug。这是生命中一个必然的部分,如同死亡与缴税(尽管并没有后面两个那么严重)。
/ r$ v  F) v, @- G4 j+ R要想解决bug,首先要能找到bug。事实上,许多开发者花费了无数小时茫然得盯着代码,只是因为他们没有把程序的容错能力摆在首位。忽略了这个部分,那么期望一个没有bug的程序就是——不可能的。
- B( Z; H( d9 S4 M本章测试题将考察你对调试和性能管理相关知识的了解,以及如何用PHP做好这两件事。
. m4 z' t1 H; m; F, D3 ?/ X, V8 c" Z- F

9 W# U& W8 v5 K6 C. h. x2 B% r问题
+ G% i- y1 A2 }
$ v1 l* K) H* z) K- Y$ a) n4 G1.以下脚本如何用三元操作替代?
3 n( c, [. \4 G- n6 t' c- Z

  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. ?>
复制代码
( g' b: u6 @7 h7 g8 B
A.$x = ($a A. < 10 || $b > 11 || $c == 1 && $d != $c) ? 0 : 1;
; d, X+ L6 P0 M7 rB.$x = ($a < 10 || $b > 11 || ($c == 1 && $d != $c)) ? 0 : 1;, D! I$ ?# c# ]9 L
C.$x = (($a < 10 && $b > 11) || ($c == 1 && $d != $c)) ? 0 : 1;2 X5 T: o5 Q2 B8 _* k8 L6 \5 q
D.$x = ($a < 10 && $b > 11 && $c == 1 && $d != $c) ? 1 : 0;  F8 k4 [* A4 k8 `
E.以上都不对
/ a4 z0 y; J( j) O& t5 {' y3 a, B
, i% D0 p3 Z6 W) U3 c# F! {
2.有一个脚本由于要从远程获取数据,因而运行速度很慢,以下那种方法能对其进行优化?(双选)
* Q! y5 _; Z' {+ x1 P6 y  t
! C- B; n0 A0 \" x, q/ vA.安装操作码缓存(opcode cache)
9 }; w: \' e. T5 T1 o$ q8 fB.优化或者升级你的网络连接
3 A+ G0 }. c& ]6 ]! P  J0 v9 ]C.添置更多的硬件
* G1 c3 _( z6 D6 I1 S! t. yD.增加服务器的可用RAM1 A+ S6 l; z& e5 \! V5 G
E.使用连接缓存
# y6 M4 G6 i# q4 ]) p, ~3 M
: o- n% O' |, ?
& a. }; i, u' \$ ]+ l, M6 ~2 s0 W! v/ r3.架设生产环境下的服务器时,需要做哪些步骤?(双选)5 n: t! j* t1 l# i+ q$ R. E

0 U% P6 f+ O7 d+ s/ c. sA.关闭错误报告
4 U4 |! l+ Z7 Y0 T- VB.打开错误日志2 ]7 q* H* X9 S
C.关闭错误日志9 |# g* j' b# k: Z; c
D.关闭错误显示
0 {+ X# m2 N) oE.使用@抑错符
; h* O- R6 B. F) V, ]9 c5 V  K5 Z" B  b  [- a& X

$ \0 l$ f& c1 v! g! ~4.______操作符能对操作数的数据类型进行严格的比较?
% o& f& E' \8 [# M7 \1 G. O
' ]; F9 t, ~" V  z7 Y答案:____________6 q! q( R! X% A# x* C3 `+ i" P

: Q1 E; q0 B2 `& ^1 K) F& ?: k! v* M- u
5.操作码缓存(opcode cache)能做什么?
, G' M* \* l3 ~. J8 f" a5 H" ?8 X
A.把脚本编译成二进制对象,使它运行得更快% x$ B1 ^) a7 y6 Y
B.代替Zend引擎加快解释器的运行. V, i+ B9 ^7 r/ W
C.缓存脚本输出以提高执行效率
  F8 J7 C# j# qD.缓存解析器产生的中间码,以提高运行效率
+ o- R, P8 J( |4 s7 g6 n" @. CE.在内存中缓存脚本,减少从硬盘中读取的次数
$ G2 g; m4 V# j' d
6 j; B( X" ?/ u9 _% w8 `: |* w+ w# R. ?% }0 y; t, h% m* F2 \  m
6.以下哪些情况容易造成系统资源枯竭?(双选)3 |! F( a; t  @( {+ c. F
5 j& N. ^5 R! _' ]4 c6 h7 c
A.RAM太小
0 w- b+ k& }! i0 `% x, c1 |B.使用了低带宽的连接
1 y# j7 Q5 c8 F& AC.虚拟内存超过2GB* n5 r$ v: N3 k3 ]1 U: K6 Q
D.允许同时运行太多的服务器进程' K. {, {; v/ Z/ F' J
E.以上都不对' K& @" z. f: U# c# }: M9 @
# [6 I6 ?+ S) H% A
; h8 I0 X) o( P7 e5 c$ T/ {
7.以下脚本缺了些什么?(双选) 3 `, t7 `! a0 h' Q6 Y( D- j5 J3 c

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

. @$ d( w" _* m7 _" V1 B7 UA.参数出口(Parameter escapement)
# S& w8 b9 ]$ s* W. _3 DB.输出格式化5 I5 Q, j0 Y) f; k3 O
C.错误检查. D$ C: q. c" B7 Y; k9 s3 R0 g
D.一个SQL查询
' l" F  I& @, T0 GE.以上都不对
6 b1 i' D0 }# T- {. l7 c# j" {: S1 n+ {& W6 Z
( C# J1 N# X) W
8.以下那种错误类型无法被自定义的错误处理器捕捉到?(双选)
* M/ e* D7 P" ?0 I$ O/ m4 I! ^7 T2 x: z, c  u4 X4 \$ z' X% ?* t
A.E_WARNING& R4 e% ~* ?# L8 k3 z' ?
B.E_ERROR2 j9 S9 ^' T. @: O5 V& f- C6 L; C
C.E_USER_ERROR6 D" t4 M/ d/ k, e6 `* Z
D.E_PARSE$ V+ n3 H1 n' {) j
E.E_NOTICE
6 o7 q" [) O  P
. g* S5 }6 r; }, v
2 a0 [4 U9 {3 a$ g8 O9 K9.当需要比较一个常量和一个变量时,如何才能保证不会错弄成赋值?5 ^2 U& L1 W' e( y+ H# u
; U7 ?: X* d, B' \- t9 n
A.把变量转换成int4 Y4 y1 H0 l% a, d
B.使用全等比较符(===)
4 I3 M% q- r7 O% X( u" z# ~C.确保常量是第一个操作数5 @$ B0 a7 C, K) s  @  e6 p6 C# D
D.使用三元运算符$ L2 E2 X0 L" D( `  L  h5 D
E.用括号把操作包起来
) ]2 G5 j2 o6 o$ I! ]) Z# U) o- q4 O" b+ T4 l) H! ]
2 O5 q" W8 |9 J0 e
10.要通过邮件给系统管理员发送错误信息,以下那种方法最简便?
, T$ a7 h, H( ~+ h* z+ k2 d- d
. s# O5 u/ C; JA.创建一个连接远程SMTP服务器的函数
# w: Q! E/ ^: V0 g0 E8 SB.使用mail函数. P5 j/ W7 P3 E- p) S
C.使用error_log函数- ?9 V( {7 @  w2 y4 _
D.调用sendmial程序0 _8 h9 a1 f" m" x" F
E.使用webservice
: z7 s5 M4 R' A( ^' V
' k; V: T' Q. I( ~# Z4 a9 h; U. [+ q5 @$ d( E
11.能否仅调用一个函数就关闭脚本内所有的错误报告?
/ D  j/ z; K  z9 t7 S3 q" V, L
A.能. L" L( S' `) E" V$ [# p
B.不能4 `. w; z6 c- R$ T" q9 a, [" S

4 }) i5 r, @! {& Y4 r, @" j, H9 J6 A, c/ P; s
12.概要分析器(profiler)是做什么的?% q+ \' J6 n: m& p% `$ O! K
! K, e1 [7 t; L8 G1 j" S- t
A.创建关于脚本结构的档案
7 n& C. O* D7 o' sB.把脚本转化成UML图  p% z1 r6 D: Z0 W. v, b% ?
C.精确测算脚本不同部分的运行时间
0 `9 r3 s' M. l3 H! A( S. j; \D.计算脚本通过web服务器执行时的维度
+ f4 k: K( r# i1 hE.扫描脚本,识别由常见错误导致的bug
2 ?0 z7 z" S4 g  B- z. W# D3 I0 i* }8 D1 M5 L

+ m$ s/ w: y( Z! B13.______能帮助识别和解决bug。
& r$ M& z8 ~( U9 v7 Z# r
9 ?) f" O2 i" R5 T4 F/ m. `$ B答案:____________4 k  x3 u6 R! X: P* t' N

! ^0 |+ L% W/ H1 W7 {
4 U- [9 a: S8 w* T7 c14.trigger_error()和user_error()有什么区别?; t' \7 ]  C0 Q( t
4 `* ]$ u9 z1 M7 y' I
A.trigger_error()允许脚本抛出系统级的错误
# h) l0 K9 r1 EB.user_error()允许脚本抛出系统级的错误. w! `: N, D) z+ z- g: i
C.user_error()不能被用在错误管理器中
( |; Z8 K. o: a; [  y9 ~# YD.trigger_error只在PHP5中可用
. o& X; m0 D; o/ c/ M' Q# DE.没有区别
3 x4 P3 R3 D- Z. S$ ^, Q- V% k$ Y+ G

$ W) b4 A' I/ i; r4 Z5 v15.______函数能返回脚本里任意行中调用的函数的名称。该函数同时还经常被用在调试中,用来判断错误是如何发生的。' ?+ Y- \! ?6 F. d7 G0 W

0 b, |$ W, M/ `* \' p& _" ?- e$ X5 |A.print_r
( B1 Q; }9 N- F4 EB.var_dump
1 W# k! H6 h9 s# G# o( e% HC.stack_dump5 \: t+ U$ O2 d" `
D.debug_backtrace
  l% J. l# J# {% ?E.以上都不对
! t5 F( o/ V# i0 B5 d  [( @7 M# q( H9 a
答案% T0 K) l1 c6 ~: D( o! r
1 o; i4 |# d; e
1.答案是E。三元操作符把每个if语句连到一起,作为&&操作的一部分。然而本题中,$x=1这个赋值只在第三个if为false时发生。如果第一个和第二个条件都不成立,$x=1就不会执行。这题对三元操作的应用有些极端,实际应用时,需要根据可读性来决定是否需要用三元运算符(本题这种情况就最好不要用)。6 v+ O( h5 l( D; L/ C

9 x1 s" `/ H% t1 Y2.问题是由第三方数据源传输缓慢导致的,而你无法控制这个数据源。你也许能在网络连通性上做些工作(假设问题出在你这一边)。还可以对接收到的内容进行缓存,这样能减少获取重复数据的时间。因此,答案是B和E。+ ?- M6 k! l$ P6 q( S
+ B/ u7 B7 D' A
3.正确的选择是B和D。如果关闭错误报告、使用@抑错符和关闭错误日志,那么在你交付给客户的网站出现问题时,你将很难进行分析和调试。
* I5 o0 J, ^3 z# a
6 {% P- H5 k7 n4.这是在描述===操作符。/ e% }: e0 a1 e: A" ~) X& s( M
# _1 r9 c: e/ m1 m
5.正确答案是D。PHP脚本在执行时,将首先被解析成“中间”码(也叫opcode,操作码),然后解释器执行。操作码缓存出现在这两个步骤之间,对解析器的输出进行缓存。下次执行该脚本时,将缓存的输出直接送入解释器。这样就就不需要再解析一次了。. B- G, _! h4 `5 Z$ a. G

9 T, f$ o5 w+ X  t" U2 A* c6.正确答案是A和D。如果RAM太小,进程间将出现资源竞争,服务器将大量使用硬盘交换。同样的,如果允许过多进程同时执行,也会使服务器频繁进行交换,导致速度下降。$ j8 G3 u& R; x0 o& B
7 W0 W  T3 |& {1 z7 X8 E+ p
7.正确答案是A和C。脚本不检验datebase_query()的调用是否成功,因此将持续执行下去,最终产生错误。此外,$my_id参数没有转义——可能导致代码注入(详见第11章)。
3 \& W( p' ~* ^& I1 i
' N% \' f- s7 s: k- t& U4 z8.答案B和D正确。出现解析错误往往表示脚本中有语法错误,自定义的错误管理器无法捕捉到它们的原因很明显:错误管理器在脚本里,而现在无法解析脚本,管理器也就无法执行。类似的,E_ERROR表示有致命的运行错误出现,比如内存耗尽。因此脚本会立刻被中断,因为解释器无法执行后面的代码。
7 O, L6 k6 d+ ~& i- b5 d6 Y. B' j& J( I' c4 o* u6 A
9.答案是C。比较操作是一个可交换的操作(就是说结果独立于操作数之外),而赋值不是。因此,比如说,$a==10和10==$a是等效的,而$a=10和10=$a却不是,而且后者会导致一个错误,因为这不是一个合法的操作。确保常量在操作符前面,能保证你不会错误得将比较变成赋值。. m: |* ^( _! o, u  A

7 v0 M' t" j# ^$ `1 W1 w: ]10.答案是C。error_log函数能将信息送往一个指定的地址。尽管mail()也可以用,但error_log能自动给邮件添加标题,因此这才是最简单的方法。
7 S" @/ h, N: `2 n
  g) u& @1 d4 H9 v0 z9 {6 @- H  B11.答案是不能。error_reporting函数能关闭所有运行时的错误报告,但对解析时的错误无效,因为解析错误发生在脚本执行之前。
) w0 p$ y- k" M! L5 Z& q' w; R/ m, f4 [/ w
12.显然,答案是C。概要分析器(profiler)能监视脚本的运行,并记录单个部分的运行时间。它可以用来找出和解决瓶颈。0 q! x' u7 t& A: d7 a  S
1 Z; X; W  X; p9 T; @
13.这是对调试器的完美定义!你可以用调试软件监视脚本运行,同时分析系统资源消耗,从而发现和解决程序缺陷。
# @) F! m9 C' K( W" h3 k2 {% \3 f" x
14.trigger_error()和user_error()之间没有区别。后者其实是前者的别名。
4 O) f( J, ~: f/ r! X5 O1 \: U
- F( p0 H/ d; f* `% s7 J15.答案是D。题目是在描述debug_backtrace函数,它返回一个由所有在代码的特定位置调用过的函数名组成的数组。

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