返回列表 发帖

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

作为一个开发者,无论你经验多么丰富,或者无论你多么努力,你的程序中总会有bug。这是生命中一个必然的部分,如同死亡与缴税(尽管并没有后面两个那么严重)。. K- f% g* J& D4 f% l) p4 r0 ?
要想解决bug,首先要能找到bug。事实上,许多开发者花费了无数小时茫然得盯着代码,只是因为他们没有把程序的容错能力摆在首位。忽略了这个部分,那么期望一个没有bug的程序就是——不可能的。
! R( V/ e: f6 t( @# {8 d+ C" @本章测试题将考察你对调试和性能管理相关知识的了解,以及如何用PHP做好这两件事。0 m8 z$ p4 T0 w( l9 x: v! N. I

% r1 ]% L+ Q8 j2 I( j9 y/ U1 i) x$ @& H  y* o
问题
5 U$ u/ `% A) E
$ Y; ~5 W( v9 I' H" P  ~2 R! o1.以下脚本如何用三元操作替代?
3 @$ Z- E8 L, d9 R  S

  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, F6 `6 n+ w8 m" g
A.$x = ($a A. < 10 || $b > 11 || $c == 1 && $d != $c) ? 0 : 1;
$ R! k1 {9 D  \1 M$ P# i$ I2 x( g2 FB.$x = ($a < 10 || $b > 11 || ($c == 1 && $d != $c)) ? 0 : 1;
' K$ F9 K3 P( k7 xC.$x = (($a < 10 && $b > 11) || ($c == 1 && $d != $c)) ? 0 : 1;
( ~/ D; S  b) X$ l5 z8 e. T/ @- hD.$x = ($a < 10 && $b > 11 && $c == 1 && $d != $c) ? 1 : 0;
' K8 j3 P; @+ |, jE.以上都不对0 S% O8 N7 G* |9 A% g, p

( i4 @; l' u( U- p" A& N
0 o' B  r. X7 B0 g7 c2.有一个脚本由于要从远程获取数据,因而运行速度很慢,以下那种方法能对其进行优化?(双选)
9 G) u0 r2 J% Z& n: a  M4 P/ K+ Q' ~
0 {3 ^1 @; S" h3 K& s' o- P' mA.安装操作码缓存(opcode cache)
' N+ @9 N) O$ v$ q+ F- h. U- HB.优化或者升级你的网络连接
! \) I  r1 T, ^0 G; l1 NC.添置更多的硬件
9 w1 t# D; X! F7 G; f' O9 Y0 ^D.增加服务器的可用RAM
" k$ P( Q' L$ b: b! ME.使用连接缓存
; X: O# e; c6 k: k4 y0 X- a0 q! @
9 ^6 d0 f5 D3 g( O0 d- [
# O' M- V3 e5 w; N4 x" q3.架设生产环境下的服务器时,需要做哪些步骤?(双选)' x5 i+ ?: ]8 L' h0 L, Z

; a0 L0 d9 T* B3 b* C, [+ IA.关闭错误报告4 X) B+ n  ]( v: u0 l
B.打开错误日志5 |1 A6 n! n8 O+ W* n9 [/ H
C.关闭错误日志
! O  t6 `1 X/ Z6 Z  a; LD.关闭错误显示
* R* n2 w# }/ i( I/ F5 o- VE.使用@抑错符
" I4 r5 X9 {1 K6 P/ h2 ^' j' W0 Z) |7 _- N# G7 \, l' M) C' k1 o1 O
* S3 l& t; o, ?
4.______操作符能对操作数的数据类型进行严格的比较?
+ y/ ~. I3 i9 D2 [+ M/ L3 _' n. s6 w$ l& n+ ?
答案:____________
# N9 h7 ~6 w) T# N+ U
8 N3 \5 g, c$ d( y8 e5 P, g2 [1 W
  h- y- q. b8 E5 b6 h0 z5.操作码缓存(opcode cache)能做什么?
4 n$ m' y% n; N3 ~! w4 {7 s5 V, i0 _& }
A.把脚本编译成二进制对象,使它运行得更快+ i6 s" @+ t$ P4 K8 q
B.代替Zend引擎加快解释器的运行
$ c; {0 U/ R9 l! vC.缓存脚本输出以提高执行效率
8 c7 Q' b, u, ^' Z, QD.缓存解析器产生的中间码,以提高运行效率* z4 X/ N* c  Y9 ?
E.在内存中缓存脚本,减少从硬盘中读取的次数! W: W: E) W8 V( Y: Q, M

: A, v) P8 i# Y+ T. x9 ?1 x% r9 z; @; Q7 q, g  I1 _$ |
6.以下哪些情况容易造成系统资源枯竭?(双选)
  p, h6 u" d0 ^5 T, A& G
; |+ D# X. @/ Z  X: e2 O+ WA.RAM太小
, J) H9 s* d& Y0 }- n- xB.使用了低带宽的连接5 S8 ]. o8 ^1 j% K
C.虚拟内存超过2GB9 W7 x8 }% }' Z* A. o9 B# Y
D.允许同时运行太多的服务器进程& _, a2 ^" E: Q( u
E.以上都不对
9 V1 e% g2 [8 a* B/ W5 t4 h+ Y# d9 d0 j

8 _8 `2 ^. T) B1 i. U- r  M0 [! z0 T7.以下脚本缺了些什么?(双选) ; q6 z. P5 N' f, B& ~) 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. ?>
复制代码

8 J. ]# u9 L5 K. g' a8 O) VA.参数出口(Parameter escapement)
& Z( a( d9 ~) S+ [, }' n6 RB.输出格式化: g* u' e% y1 {) M5 Z6 F
C.错误检查7 C( t! u2 G+ V
D.一个SQL查询
# Y% D; G8 r4 ]% c# s& z! rE.以上都不对: \2 h& m4 }6 Q% t+ u( x

/ T6 P  V0 B" G) _) Z1 T# a7 J5 q, ^5 W" {1 Q2 g) e
8.以下那种错误类型无法被自定义的错误处理器捕捉到?(双选)
, C6 B  C# t! V. J1 e$ B/ J$ V; n* h  |2 _6 U4 |  q
A.E_WARNING; Y1 U! U6 C- D. ^2 g
B.E_ERROR0 C+ b  x! O, }4 }
C.E_USER_ERROR* H6 }0 V+ ]; M( R9 m& I
D.E_PARSE
' P6 \* u' P" z, @E.E_NOTICE6 @: ~0 x+ S, g

' X( Y1 V9 J, n
) \) m, j6 i- p4 n9.当需要比较一个常量和一个变量时,如何才能保证不会错弄成赋值?
1 [6 t: d- A, L6 v2 z
4 B  Z  M+ u: l3 G+ y7 U2 AA.把变量转换成int
0 s) x* `! {/ `& UB.使用全等比较符(===)1 \1 |5 t- o' [5 z1 i# x8 f
C.确保常量是第一个操作数
+ ~# X0 X* B$ B0 B# z. ~D.使用三元运算符) k) T5 c, G* ~
E.用括号把操作包起来6 N7 m( t7 g" o) f8 e

+ F" {* \$ E, a' f) P) c
, }$ Q5 U& D) s0 A! n( N10.要通过邮件给系统管理员发送错误信息,以下那种方法最简便?7 l0 Q0 ?" n, |) ^! F2 }1 T$ K

$ ]8 ?6 H' s* L- p$ }8 g5 XA.创建一个连接远程SMTP服务器的函数4 B& o3 _: k  A& ^
B.使用mail函数
$ y5 |* o# B. }" hC.使用error_log函数
! `2 ?" O8 |0 E& h4 uD.调用sendmial程序, M$ z0 s. u0 b5 G6 {4 S  B8 g
E.使用webservice
& u: `1 R. W! @; Z/ L3 \6 \* M% O# k
( g$ D  r6 {# {! ?( |
11.能否仅调用一个函数就关闭脚本内所有的错误报告?5 Q& p' M  H# G1 G8 [  H

1 B" P& V* N! j8 }6 x& tA.能( v' V) H# D+ T5 g+ [
B.不能
% D$ X9 g! N# a5 N; Y0 C/ {9 d6 Z) G* Q  W9 F

$ ]" ?2 ~4 z: r$ Y9 O! z( Y$ `12.概要分析器(profiler)是做什么的?( a: m- n5 Z0 L2 u+ v
0 v1 K4 T: ?: U7 e/ Y
A.创建关于脚本结构的档案5 t5 w5 W& ~1 j3 O
B.把脚本转化成UML图5 P5 k7 g- l0 V" s
C.精确测算脚本不同部分的运行时间
  I1 M6 w9 L% G' f5 W. Z$ G- LD.计算脚本通过web服务器执行时的维度
5 D% y1 ~. E5 }6 u3 n" M/ VE.扫描脚本,识别由常见错误导致的bug( f9 F  s: K; \3 M5 ?: C

& S) V- S  ]* C6 a1 T" g0 j, e% y( U3 a- {0 L
13.______能帮助识别和解决bug。
' B/ a8 B% L. m5 y- c
( s8 v& ?8 q/ a# V  `答案:____________
4 v, R6 _' k% [# m, y% @
. M+ g( A3 \8 D1 @0 ^! D6 T- ?4 \; S* u5 ~* `. d; `; \
14.trigger_error()和user_error()有什么区别?+ h' q' r5 P1 C8 U( B- x
; Q; [( a1 Y% x( w. ^" c  E" b: o% e
A.trigger_error()允许脚本抛出系统级的错误
. r& T* H5 N9 ^) J2 K( WB.user_error()允许脚本抛出系统级的错误+ `. K4 f& ~! }4 w  T
C.user_error()不能被用在错误管理器中
3 H! [1 C; H( |' P6 i1 a1 `. J1 vD.trigger_error只在PHP5中可用
+ j( ~7 [& y+ q' XE.没有区别
2 K3 W. U2 O; q) X. h! x; A5 B
& Y7 w; `8 Y0 D( k/ }6 F2 n
5 ?( |8 k4 Z/ V: r. O0 x15.______函数能返回脚本里任意行中调用的函数的名称。该函数同时还经常被用在调试中,用来判断错误是如何发生的。
; b, Q% c0 y) s& ^1 z2 M+ C! ^, `7 J: C5 [# z3 s
A.print_r
5 C1 V. E  K$ [: J7 Z- R% f; U8 TB.var_dump
: Q( Q9 m3 g4 p5 e: hC.stack_dump
: _. B' a9 k. H0 U  b9 ~D.debug_backtrace( x8 ?9 ?5 r, d
E.以上都不对
4 j8 m0 X6 I" V7 b) j7 ~3 ?1 L, T$ t! Q7 I/ H* h7 a3 F
答案) Y1 H6 f1 m6 J$ Q$ q
$ x; K2 |  Q" v/ {
1.答案是E。三元操作符把每个if语句连到一起,作为&&操作的一部分。然而本题中,$x=1这个赋值只在第三个if为false时发生。如果第一个和第二个条件都不成立,$x=1就不会执行。这题对三元操作的应用有些极端,实际应用时,需要根据可读性来决定是否需要用三元运算符(本题这种情况就最好不要用)。' K4 V% A4 V% Q4 p
6 l' Y, h8 b4 ~/ M3 P! m* l2 T
2.问题是由第三方数据源传输缓慢导致的,而你无法控制这个数据源。你也许能在网络连通性上做些工作(假设问题出在你这一边)。还可以对接收到的内容进行缓存,这样能减少获取重复数据的时间。因此,答案是B和E。
/ ?& a- a: e3 ?1 T% t0 Q7 A$ @# B4 K% i" g9 m8 l
3.正确的选择是B和D。如果关闭错误报告、使用@抑错符和关闭错误日志,那么在你交付给客户的网站出现问题时,你将很难进行分析和调试。$ w8 u& C4 D$ @
- c" E7 g) _/ H2 O+ h4 R) u
4.这是在描述===操作符。
" j4 J" ?$ W( P4 |3 |8 |" H1 S- j* k
* ~- ~2 h$ a6 Y6 F2 c5.正确答案是D。PHP脚本在执行时,将首先被解析成“中间”码(也叫opcode,操作码),然后解释器执行。操作码缓存出现在这两个步骤之间,对解析器的输出进行缓存。下次执行该脚本时,将缓存的输出直接送入解释器。这样就就不需要再解析一次了。9 |1 D! p; F8 Z- N! s0 N( _

6 E' u; `, ~* D+ _/ W% E$ Q6.正确答案是A和D。如果RAM太小,进程间将出现资源竞争,服务器将大量使用硬盘交换。同样的,如果允许过多进程同时执行,也会使服务器频繁进行交换,导致速度下降。
% W6 j4 F4 e& ]/ _7 m
- `* J' R, {5 R8 \' y7.正确答案是A和C。脚本不检验datebase_query()的调用是否成功,因此将持续执行下去,最终产生错误。此外,$my_id参数没有转义——可能导致代码注入(详见第11章)。- @  ?# j' c" C1 p( Y8 m6 g4 u
6 T2 u% {% f" U# b( [1 m- F
8.答案B和D正确。出现解析错误往往表示脚本中有语法错误,自定义的错误管理器无法捕捉到它们的原因很明显:错误管理器在脚本里,而现在无法解析脚本,管理器也就无法执行。类似的,E_ERROR表示有致命的运行错误出现,比如内存耗尽。因此脚本会立刻被中断,因为解释器无法执行后面的代码。0 L3 d7 o( r: m9 D% |1 h) d
8 v  P4 q! P& \9 q- C9 r
9.答案是C。比较操作是一个可交换的操作(就是说结果独立于操作数之外),而赋值不是。因此,比如说,$a==10和10==$a是等效的,而$a=10和10=$a却不是,而且后者会导致一个错误,因为这不是一个合法的操作。确保常量在操作符前面,能保证你不会错误得将比较变成赋值。) j1 o; V3 N+ a" C- U
, A  |+ w0 y$ L# q) m
10.答案是C。error_log函数能将信息送往一个指定的地址。尽管mail()也可以用,但error_log能自动给邮件添加标题,因此这才是最简单的方法。
' X- X# W/ r+ Q; m0 O; [9 t/ `$ R& w( r2 d
11.答案是不能。error_reporting函数能关闭所有运行时的错误报告,但对解析时的错误无效,因为解析错误发生在脚本执行之前。
9 r/ C2 x' \6 Y$ W/ F$ X6 R& [4 @1 }# i) `5 a
12.显然,答案是C。概要分析器(profiler)能监视脚本的运行,并记录单个部分的运行时间。它可以用来找出和解决瓶颈。6 F) A+ t4 ~0 P+ A
) a- p+ t4 ~: E* h9 g3 K
13.这是对调试器的完美定义!你可以用调试软件监视脚本运行,同时分析系统资源消耗,从而发现和解决程序缺陷。( |; A9 a7 o' x* c: i

6 T. T: L5 [# Y/ f9 h14.trigger_error()和user_error()之间没有区别。后者其实是前者的别名。
/ I& a; x& K, T  a" O
) K9 H$ @+ f6 k0 L" k% p15.答案是D。题目是在描述debug_backtrace函数,它返回一个由所有在代码的特定位置调用过的函数名组成的数组。

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