返回列表 发帖

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

作为一个开发者,无论你经验多么丰富,或者无论你多么努力,你的程序中总会有bug。这是生命中一个必然的部分,如同死亡与缴税(尽管并没有后面两个那么严重)。% {3 N' |4 A* f; p! ?
要想解决bug,首先要能找到bug。事实上,许多开发者花费了无数小时茫然得盯着代码,只是因为他们没有把程序的容错能力摆在首位。忽略了这个部分,那么期望一个没有bug的程序就是——不可能的。
4 W6 ~1 b( p0 A4 G本章测试题将考察你对调试和性能管理相关知识的了解,以及如何用PHP做好这两件事。  t" F) N7 k0 i- k" O

! N. n, {  `) X8 c2 G( m# E0 M
+ w: g9 c5 ~& U问题, J3 z5 A. K3 U% n0 P
2 n) B) l1 F/ N
1.以下脚本如何用三元操作替代? " @" _! a  g* F4 v4 B

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

( g5 l8 X4 w( u' f$ l. z, zA.$x = ($a A. < 10 || $b > 11 || $c == 1 && $d != $c) ? 0 : 1;
2 G% W1 ?( G' A+ b& E* q+ B; YB.$x = ($a < 10 || $b > 11 || ($c == 1 && $d != $c)) ? 0 : 1;
; b  @% v, x! x6 y" L) SC.$x = (($a < 10 && $b > 11) || ($c == 1 && $d != $c)) ? 0 : 1;
& v# _, M6 `1 w  w: cD.$x = ($a < 10 && $b > 11 && $c == 1 && $d != $c) ? 1 : 0;
4 L8 W( r* z  o3 }  Q" @3 JE.以上都不对3 d0 o: U- e1 O+ S: a
5 ]- H! c/ x; n

& y( R. y5 C" v0 s( x2.有一个脚本由于要从远程获取数据,因而运行速度很慢,以下那种方法能对其进行优化?(双选)' o9 U/ G3 ]; ^) x6 i
) S3 g# F" C1 }" u) X1 T/ e
A.安装操作码缓存(opcode cache)
8 k- i- c# t6 j3 L- rB.优化或者升级你的网络连接7 B/ j$ h: Z) w* ?- w% T, J
C.添置更多的硬件' N! P9 n# T/ v/ u7 V
D.增加服务器的可用RAM
6 o  @6 J9 z6 o8 ?. A( T: j  eE.使用连接缓存
5 `. ~, g* L8 E  Y$ f1 w; l: z& t" u, r# {* [0 n7 V# `

3 A& ^; a6 G$ @3 ^' M$ j3.架设生产环境下的服务器时,需要做哪些步骤?(双选)
* q0 U7 V# a/ K- A" P$ K7 w7 d3 E8 a1 V: c; r* w
A.关闭错误报告: j3 ^* x% X' G. k. ]" J
B.打开错误日志1 i' C* q: i3 v" P5 b- b$ P
C.关闭错误日志2 k$ C! D9 Q0 S/ y: W
D.关闭错误显示
: @. U2 V: C5 P9 a' `0 u, XE.使用@抑错符. l7 T' h: E3 u& ?) A

3 i/ U2 L0 K0 m3 o6 Z) o7 ~4 u( v. z* E
4.______操作符能对操作数的数据类型进行严格的比较?; `3 o! \0 z) U1 {+ u1 ], x$ D

/ P6 a, B8 a3 U, J( c2 H答案:____________
) G; v) |9 h( F+ k: \9 e$ E2 S; q5 U

, G, x. s' s! i0 T3 H) E' [7 `5.操作码缓存(opcode cache)能做什么?
& l. U1 D0 A% s& e' n( _: H1 ?
' F' l  d% M  T; A8 \4 I. BA.把脚本编译成二进制对象,使它运行得更快
& b& W: O4 ?- \+ K+ cB.代替Zend引擎加快解释器的运行9 h3 E, L3 r: H0 u( g# B
C.缓存脚本输出以提高执行效率3 v+ k* I/ a, X5 W5 [
D.缓存解析器产生的中间码,以提高运行效率
( s9 e' m3 _, h8 G. v* Z' f! ?; iE.在内存中缓存脚本,减少从硬盘中读取的次数
+ D( ]2 H; j0 |  d* H* W% y/ M' ?6 b- Q. @( H+ t
4 k6 V0 L0 H$ T9 F3 U9 V5 D( k
6.以下哪些情况容易造成系统资源枯竭?(双选)
& t. Z+ \! S* _9 b
3 ?, B, U( V/ l) EA.RAM太小% d3 Y0 L& e  y+ T  [. y6 T' X) q2 t
B.使用了低带宽的连接
  @, u# o8 i% q% t. E) FC.虚拟内存超过2GB
  K1 {+ y8 j* h2 G2 J, x7 JD.允许同时运行太多的服务器进程
  ~! F0 s0 J- T% W( V  ~E.以上都不对
, q. o9 U5 b* q- U2 _- ^" H# g; v1 [6 D$ ?
' @: ?/ u. l4 v
7.以下脚本缺了些什么?(双选) 2 s1 W) s% z! H4 V* t

  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 Q* C" x( I: r1 CA.参数出口(Parameter escapement)
- Z. O+ G9 t2 G% IB.输出格式化
. f% ?3 ]- Y) KC.错误检查
! j0 s( G; F. Q# v: I. S) zD.一个SQL查询- D1 W" R/ V+ o; ?  b
E.以上都不对# ]2 q$ t5 N: r8 O

9 n! C' N' w. p# E: l, m2 r6 h* y" r; D0 p! @
8.以下那种错误类型无法被自定义的错误处理器捕捉到?(双选)+ v. j1 v2 O( ^& u) q" Y2 \9 X7 O
, c0 x6 l1 Y2 q% u* h/ U0 F
A.E_WARNING1 r$ q, s; \4 p2 Y$ W
B.E_ERROR
+ _+ V  ^2 c% R; V2 M$ B" k# \# nC.E_USER_ERROR0 z  ~9 }5 s9 f" _7 Q# e
D.E_PARSE7 O; |& c6 g6 k6 D3 n9 @
E.E_NOTICE
1 ?4 {/ I% q7 p" f  C! I
; a2 m4 W/ m* [$ U( |# c/ z1 t/ R$ j- o- l0 d$ N9 p
9.当需要比较一个常量和一个变量时,如何才能保证不会错弄成赋值?
5 A0 o0 Z0 L8 Z, l. x
/ S: J. @+ `2 j& iA.把变量转换成int4 |8 F1 {& U# x2 x3 H3 o) r
B.使用全等比较符(===)
/ g' v! _0 ~3 S3 cC.确保常量是第一个操作数4 w9 O4 a9 Z7 d7 {. o9 N
D.使用三元运算符7 O0 P* r5 W" o7 Q
E.用括号把操作包起来
3 n5 t  g% n( H' ~0 X! X& ^- r$ C6 q0 b' O  y4 D

; G. m% M! y# J/ M10.要通过邮件给系统管理员发送错误信息,以下那种方法最简便?
+ ]8 Q% L! v+ B4 }# {" z* }
1 b" B, F! u5 X6 g- a8 m; RA.创建一个连接远程SMTP服务器的函数
( Z% t2 J6 u0 N3 R, ]9 P) ]0 dB.使用mail函数; x/ A! C0 B0 d! h
C.使用error_log函数' V! V1 v  e( {0 f4 `2 @% k
D.调用sendmial程序
8 d/ x" X/ Y: A6 gE.使用webservice
; [; e( G( H$ B+ h) H
/ X) B0 Z# I. h* f) g
2 T1 k( W& ]( I: }1 C  p* h9 h11.能否仅调用一个函数就关闭脚本内所有的错误报告?% O/ |: E: o+ {; ?+ a" D6 T
% o/ U3 n2 c9 y8 E( n: X
A.能
! F0 @- R2 f2 U9 aB.不能% w/ T! M3 e# k3 L. p  N# R' O( L3 M
- X" b$ G1 J2 A+ V3 h" a7 e

; V8 z  p. Y# `  q$ U12.概要分析器(profiler)是做什么的?+ F" ~  z. X. `& Z3 x* [! A/ J
# T- r7 d4 d+ y/ h) o: A% y
A.创建关于脚本结构的档案
4 O' C2 i) ]& p$ T1 c6 M- ^5 ~9 ZB.把脚本转化成UML图# M% |6 m- ?& {0 g# {* r
C.精确测算脚本不同部分的运行时间
0 S2 Z# _' t0 {4 I$ }4 YD.计算脚本通过web服务器执行时的维度
7 D+ S+ y  O1 s2 Z6 j0 rE.扫描脚本,识别由常见错误导致的bug
2 C) E! ^3 A8 {3 j9 q
6 Y; u. b9 D1 s7 `- X- S" |5 g" X
13.______能帮助识别和解决bug。
9 P4 b7 v" k) b: x, c/ M0 c! U$ M
  J8 @' z+ ^3 e8 S! r3 P答案:____________
7 \6 I) |1 O) W9 T0 N8 `6 m; a9 v* {: w' ]+ ~
1 j' |! S) \" x, u0 n; a) ^
14.trigger_error()和user_error()有什么区别?
7 X! v; |) g- Y' e
5 l) z  J  Y, O0 ]0 |A.trigger_error()允许脚本抛出系统级的错误1 R3 F! k3 \" r+ i# y
B.user_error()允许脚本抛出系统级的错误/ T' `" P9 C7 M6 Z. ^4 X' x. y+ F% g
C.user_error()不能被用在错误管理器中/ R/ y9 B+ o0 G1 C; a) o8 J
D.trigger_error只在PHP5中可用
$ U7 f( a! L/ q3 B. H2 J% q- T  cE.没有区别7 V& k8 z8 ]& T1 Z! Z% U
& s- u5 t8 }* G) C( q) u; x. p

9 R) n: ]) Q( Z15.______函数能返回脚本里任意行中调用的函数的名称。该函数同时还经常被用在调试中,用来判断错误是如何发生的。" c+ T. f" N1 L5 A* P  A0 p  M

6 ]5 h$ t" `$ A7 j2 e! K9 QA.print_r
' B. m! H1 m4 G% n7 f( I$ TB.var_dump
9 M4 F8 ^/ y# r3 n* V1 @C.stack_dump
6 v7 A4 K1 @5 g# L7 P- JD.debug_backtrace8 j5 `: G$ @$ T) C2 s7 c
E.以上都不对
. c+ q3 A" w% t' ~  O9 {+ s- w* F6 v
答案3 i& E3 k: t  @6 _  x7 Y3 ^
7 }! u2 y0 c2 U$ R! e/ e8 v
1.答案是E。三元操作符把每个if语句连到一起,作为&&操作的一部分。然而本题中,$x=1这个赋值只在第三个if为false时发生。如果第一个和第二个条件都不成立,$x=1就不会执行。这题对三元操作的应用有些极端,实际应用时,需要根据可读性来决定是否需要用三元运算符(本题这种情况就最好不要用)。
9 u5 H/ o: w6 D# Q; T1 a9 g' h9 P) O  C" B, M
2.问题是由第三方数据源传输缓慢导致的,而你无法控制这个数据源。你也许能在网络连通性上做些工作(假设问题出在你这一边)。还可以对接收到的内容进行缓存,这样能减少获取重复数据的时间。因此,答案是B和E。
( H& p7 u2 G2 ]7 v6 y2 n* ]! z
- b" ~, K/ v& V3.正确的选择是B和D。如果关闭错误报告、使用@抑错符和关闭错误日志,那么在你交付给客户的网站出现问题时,你将很难进行分析和调试。
6 O6 K& Z4 {: O
, a2 `& q6 _5 u, w! }! b3 C  X4.这是在描述===操作符。% G! K$ M" m6 t& ^8 F( E

4 g& y; T! @1 N( b5 `$ M( {5.正确答案是D。PHP脚本在执行时,将首先被解析成“中间”码(也叫opcode,操作码),然后解释器执行。操作码缓存出现在这两个步骤之间,对解析器的输出进行缓存。下次执行该脚本时,将缓存的输出直接送入解释器。这样就就不需要再解析一次了。
# I, s& k* K% m: G) N+ ?& a. ^
5 s/ v* a" g9 n6.正确答案是A和D。如果RAM太小,进程间将出现资源竞争,服务器将大量使用硬盘交换。同样的,如果允许过多进程同时执行,也会使服务器频繁进行交换,导致速度下降。
: s/ E8 w* e: c: m
& ~8 J- E( v8 U, v7.正确答案是A和C。脚本不检验datebase_query()的调用是否成功,因此将持续执行下去,最终产生错误。此外,$my_id参数没有转义——可能导致代码注入(详见第11章)。' }' N# R$ l0 \0 Z

0 f9 Q. b7 Q/ O8 E" y4 L; q% c8.答案B和D正确。出现解析错误往往表示脚本中有语法错误,自定义的错误管理器无法捕捉到它们的原因很明显:错误管理器在脚本里,而现在无法解析脚本,管理器也就无法执行。类似的,E_ERROR表示有致命的运行错误出现,比如内存耗尽。因此脚本会立刻被中断,因为解释器无法执行后面的代码。5 a; D0 |: [. U3 a* U6 D& S
8 I# t: c# z) h) f& `( K4 z& m  N" z
9.答案是C。比较操作是一个可交换的操作(就是说结果独立于操作数之外),而赋值不是。因此,比如说,$a==10和10==$a是等效的,而$a=10和10=$a却不是,而且后者会导致一个错误,因为这不是一个合法的操作。确保常量在操作符前面,能保证你不会错误得将比较变成赋值。# h% M) y% ~$ v

. t0 b# J6 ~* Z8 M8 j6 O0 P10.答案是C。error_log函数能将信息送往一个指定的地址。尽管mail()也可以用,但error_log能自动给邮件添加标题,因此这才是最简单的方法。
# o" ?3 o5 d. x; z. B: M. J
# ~# ?4 ?0 F# ?' |7 @& }' K! f2 k11.答案是不能。error_reporting函数能关闭所有运行时的错误报告,但对解析时的错误无效,因为解析错误发生在脚本执行之前。
) S, B7 W6 D* G$ ^9 B$ x: P, [* x# |
12.显然,答案是C。概要分析器(profiler)能监视脚本的运行,并记录单个部分的运行时间。它可以用来找出和解决瓶颈。
: c- ^1 [* \, _7 ^) h
# l, H7 `& D; H) o  Q( y% T13.这是对调试器的完美定义!你可以用调试软件监视脚本运行,同时分析系统资源消耗,从而发现和解决程序缺陷。, m0 @7 k" }$ Y' m+ S  K# A9 k3 D
+ {( C9 D; Q3 h$ E7 a5 h$ L+ z
14.trigger_error()和user_error()之间没有区别。后者其实是前者的别名。
  ]( S* M9 C. t  e0 d, D* t! S' r  G. K! F: P1 k) {: Q
15.答案是D。题目是在描述debug_backtrace函数,它返回一个由所有在代码的特定位置调用过的函数名组成的数组。

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