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

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

作为一个开发者,无论你经验多么丰富,或者无论你多么努力,你的程序中总会有bug。这是生命中一个必然的部分,如同死亡与缴税(尽管并没有后面两个那么严重)。
! T4 ~6 Z  T6 K8 q要想解决bug,首先要能找到bug。事实上,许多开发者花费了无数小时茫然得盯着代码,只是因为他们没有把程序的容错能力摆在首位。忽略了这个部分,那么期望一个没有bug的程序就是——不可能的。
5 \$ a: H1 V" @8 {# J4 i2 T本章测试题将考察你对调试和性能管理相关知识的了解,以及如何用PHP做好这两件事。
  |2 l& q  i7 F3 G2 \* W% s0 s: A, q+ Q1 `; E7 D" n0 N

$ a2 k) p% n( e/ j  L6 F问题
8 K  X+ V( V2 Q5 w% {8 W
8 v# y  `; A: j5 y1.以下脚本如何用三元操作替代? 8 P) N. \! q  J

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

3 f$ @4 O* L( zA.$x = ($a A. < 10 || $b > 11 || $c == 1 && $d != $c) ? 0 : 1;6 K3 x4 f* E8 L( Q
B.$x = ($a < 10 || $b > 11 || ($c == 1 && $d != $c)) ? 0 : 1;
/ a1 [1 t5 |1 o8 kC.$x = (($a < 10 && $b > 11) || ($c == 1 && $d != $c)) ? 0 : 1;
  `# R/ h! t6 K" p( h6 d+ [- rD.$x = ($a < 10 && $b > 11 && $c == 1 && $d != $c) ? 1 : 0;
! ]7 X! H& U5 Q. }3 L5 P/ i, h' NE.以上都不对( O; q; R4 A$ _' M
0 \2 e, X' j3 @

5 `& c  j" z# Z+ w! A2.有一个脚本由于要从远程获取数据,因而运行速度很慢,以下那种方法能对其进行优化?(双选)
6 Z$ E% K/ [' d. m8 F% H; N* T) K$ D5 C
! l1 i8 m) H2 nA.安装操作码缓存(opcode cache)
1 k  ?$ ^) A, U: _9 @4 J- }1 VB.优化或者升级你的网络连接
7 \4 D7 i( E5 p) Q9 c, l* s( vC.添置更多的硬件5 u% m7 n8 k3 H1 `* ]2 d. Y. |
D.增加服务器的可用RAM
0 t2 q6 T. w6 q0 j# uE.使用连接缓存" ]  Y) @! m3 v" ]  w
3 k$ _1 F- \/ m' K, w. x* m, K

" C1 F  ]4 T6 ?+ J, Y! A4 B3 T3.架设生产环境下的服务器时,需要做哪些步骤?(双选)) C4 s  m, r0 D; a

1 B$ B; ^) ^8 W9 vA.关闭错误报告
- s8 C  [( s, s6 \5 q) {B.打开错误日志
5 k; |% v: l0 ]+ z# M$ X+ S0 RC.关闭错误日志/ d: v2 p6 B5 Z
D.关闭错误显示$ x4 m) k0 G5 h, v5 a  h/ h$ R
E.使用@抑错符
6 q+ R/ i6 c" B$ Y( U0 h3 L3 w
  T, J* `- h; l' z5 q* w; j: \* p, O6 k
4.______操作符能对操作数的数据类型进行严格的比较?
. L! h; E& j) N
0 M  G5 p; ]) M% {4 P2 i7 l答案:____________
4 z: T" r  ?! J- S. W: o3 {6 d8 g. o6 b& Q9 I" x" c6 i

. c, r' M  Z8 u+ Q9 R5.操作码缓存(opcode cache)能做什么?" j1 q" w0 s" G; a$ d
5 O, K" P3 Y! V: S+ e, C' w# H
A.把脚本编译成二进制对象,使它运行得更快
# v4 j0 f. H$ ?8 UB.代替Zend引擎加快解释器的运行
$ u, V8 h; p7 I9 W6 m% [& T5 qC.缓存脚本输出以提高执行效率
# v" [& E! `7 e& J; kD.缓存解析器产生的中间码,以提高运行效率
. T; v+ L' a. j+ S5 E7 v) A% s/ ^E.在内存中缓存脚本,减少从硬盘中读取的次数
' v9 X  a+ Y3 t# |$ z% T" m# ?
1 a' W/ E/ U0 u3 n7 |% _- q
) F' M. T! {: H3 d1 D, f6.以下哪些情况容易造成系统资源枯竭?(双选); C8 M% N+ \  k. ~3 G; i$ U
+ @1 H. l  N. q( }" k. D# i3 ?
A.RAM太小
7 H( p; v& _0 wB.使用了低带宽的连接  U$ h8 `2 ~0 c6 Z4 O* |: C
C.虚拟内存超过2GB& [3 A: ^& L; T. D' M& K8 n
D.允许同时运行太多的服务器进程
7 Q3 h, Q( s4 F- C0 kE.以上都不对
8 ~8 _# e$ U. @
# ^0 V# U3 ]' N, W# a/ a! U& ~- [% X1 o# T" g( t
7.以下脚本缺了些什么?(双选) 2 K; X* }& O2 |; F3 w

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

# j  M# `, x+ Q+ V: M( JA.参数出口(Parameter escapement)
, q% i" U: s, [B.输出格式化* U# I7 H: \" J* r% r
C.错误检查# k5 f7 W2 z) j% @" M
D.一个SQL查询# V. q4 Y& E* I+ }- I! h: [
E.以上都不对
# d# s9 e# _" i! d/ C6 R* L& R3 L  N# }6 P4 K: k! B

* G9 U# L6 |8 y% D$ G' \" r8.以下那种错误类型无法被自定义的错误处理器捕捉到?(双选)5 J' c$ ~  o+ Y2 P% b4 x
+ [% z& d9 O2 U2 E0 i$ m  t' n! w
A.E_WARNING- d% t0 s* M3 x7 V
B.E_ERROR
9 ]$ W- A' p) m4 H0 [  iC.E_USER_ERROR
- C" @& d; W( |' YD.E_PARSE, Q2 W, Z5 v+ x2 p: F: E7 N
E.E_NOTICE
) _2 l% s& Z% [" m3 ?
' R% E  `' ?9 T3 C2 t$ b$ \& h3 m. }" E  x# ?* P0 \0 Y
9.当需要比较一个常量和一个变量时,如何才能保证不会错弄成赋值?
# J. @  V8 T8 \
2 N0 U/ P4 j* S. jA.把变量转换成int* g9 [; p$ @9 `$ j$ {
B.使用全等比较符(===)/ j; O. x4 |! @3 j1 c
C.确保常量是第一个操作数
* x: c* t  M4 `; H9 OD.使用三元运算符
! w. W( C: O1 P8 w3 pE.用括号把操作包起来1 C3 z6 b; S: H( z" X, v5 c
8 e7 O* `& Y- I; v
; ~$ S: @& y9 l, z5 [1 K
10.要通过邮件给系统管理员发送错误信息,以下那种方法最简便?6 F$ |. x4 n( d
0 c# B4 Y, I2 T1 P% Z
A.创建一个连接远程SMTP服务器的函数
4 [; ^3 j, C4 p# k; c+ s3 `! Y8 gB.使用mail函数# Y* y6 i* w/ s  n* W% S
C.使用error_log函数
% ?- ?  p/ V, Y: mD.调用sendmial程序4 Q. [' B# B+ H& \
E.使用webservice! t' B1 S' `5 S' Y; x# r& E6 }
  Q4 i* \* z* U8 _8 H

& {; J0 b0 E. L; t5 B5 Z11.能否仅调用一个函数就关闭脚本内所有的错误报告?8 P2 c/ L* W* F# b- E7 u' u

1 ]9 ^, o( X% p; b) S2 z3 B) q- nA.能
: H" W6 F# c* r3 p# fB.不能
) X+ x9 e- k. t  a/ N/ {9 e
$ E1 b2 `* f% U9 K+ q+ g1 }4 X  Z7 ]* X" B7 C5 b  b
12.概要分析器(profiler)是做什么的?  k. O' ~: i- O3 l$ c9 e

5 B- _  F" y3 ]% l; l5 f: VA.创建关于脚本结构的档案
# [$ e1 M9 d4 `& sB.把脚本转化成UML图
+ U6 s; e8 \+ p' P5 EC.精确测算脚本不同部分的运行时间
" @4 e1 x2 n( n" S& FD.计算脚本通过web服务器执行时的维度
9 n9 Y# k; t; h3 gE.扫描脚本,识别由常见错误导致的bug8 u+ S6 m4 R8 y+ L' |" h6 q

2 D- _' e5 p* X8 ^6 ~7 t( e4 V4 g6 ~. q$ e9 J6 [
13.______能帮助识别和解决bug。
, p+ v( V/ B7 i9 K* G5 Y; _  Q; q0 Z9 z4 P0 m* _
答案:____________
: ?, x' N6 J! O* ^
" p. y3 a. c3 c, Y* j3 R
8 ?! q, E# x! r3 n6 M$ W% z14.trigger_error()和user_error()有什么区别?
: W- f2 @7 Y% Z# v% q
+ r' {1 T. Z* |1 \( w; }' o  ~2 EA.trigger_error()允许脚本抛出系统级的错误* C2 x7 y* o0 n; G1 n- ^
B.user_error()允许脚本抛出系统级的错误& s0 i8 R6 b9 b1 [, D
C.user_error()不能被用在错误管理器中
8 l, ?. ^9 T; @2 jD.trigger_error只在PHP5中可用- i+ Z- B$ z: r' G0 F2 j
E.没有区别
3 h2 \  ]; ?; x& b2 T1 T2 E% A) f
- c' N* k& `3 S* l
15.______函数能返回脚本里任意行中调用的函数的名称。该函数同时还经常被用在调试中,用来判断错误是如何发生的。  o/ L* b9 g, r- e0 Q5 V6 ?6 G0 I

+ |/ D4 i& Y: D) oA.print_r- A; F4 o: X1 K3 J% G& v$ j
B.var_dump
& p" \2 V4 O8 E; U. F; qC.stack_dump1 S4 m1 C( \3 S3 Z6 b' `
D.debug_backtrace( t! i0 y' S- D$ ~9 x( j
E.以上都不对
3 b  D$ {9 h) |0 M7 z$ v5 z* ^* y$ r4 |, s. w1 c8 G: {6 N( U
答案
, I& b( H: _: p; I: D1 @5 w% t1 [% @2 Y$ M* a$ l  w: d  t* C
1.答案是E。三元操作符把每个if语句连到一起,作为&&操作的一部分。然而本题中,$x=1这个赋值只在第三个if为false时发生。如果第一个和第二个条件都不成立,$x=1就不会执行。这题对三元操作的应用有些极端,实际应用时,需要根据可读性来决定是否需要用三元运算符(本题这种情况就最好不要用)。
1 {, V, [) d% |3 a4 A! O; K! D' L/ Q8 d5 y9 V3 i
2.问题是由第三方数据源传输缓慢导致的,而你无法控制这个数据源。你也许能在网络连通性上做些工作(假设问题出在你这一边)。还可以对接收到的内容进行缓存,这样能减少获取重复数据的时间。因此,答案是B和E。
; v  j3 h! b) Z) B" W* b4 y! ~3 S4 C" Z! R# V9 M7 o
3.正确的选择是B和D。如果关闭错误报告、使用@抑错符和关闭错误日志,那么在你交付给客户的网站出现问题时,你将很难进行分析和调试。% K* O0 d6 v* N

& n; _4 p0 N" P2 N4.这是在描述===操作符。6 Q1 _* k3 S6 [+ f6 g8 a
6 Q- A: _" H' y( R3 }+ H2 j
5.正确答案是D。PHP脚本在执行时,将首先被解析成“中间”码(也叫opcode,操作码),然后解释器执行。操作码缓存出现在这两个步骤之间,对解析器的输出进行缓存。下次执行该脚本时,将缓存的输出直接送入解释器。这样就就不需要再解析一次了。
2 d; P: n' n2 }- ~/ A) w9 J7 C0 P- k' y6 ]/ U
6.正确答案是A和D。如果RAM太小,进程间将出现资源竞争,服务器将大量使用硬盘交换。同样的,如果允许过多进程同时执行,也会使服务器频繁进行交换,导致速度下降。
/ H. V' L# I5 @, Q7 {# J
, Y8 @. q' {& ?  H- U7 O7.正确答案是A和C。脚本不检验datebase_query()的调用是否成功,因此将持续执行下去,最终产生错误。此外,$my_id参数没有转义——可能导致代码注入(详见第11章)。! T5 v: {6 K% o, \# X7 n( D4 |

/ I7 c1 P" n7 U  y  _$ u8.答案B和D正确。出现解析错误往往表示脚本中有语法错误,自定义的错误管理器无法捕捉到它们的原因很明显:错误管理器在脚本里,而现在无法解析脚本,管理器也就无法执行。类似的,E_ERROR表示有致命的运行错误出现,比如内存耗尽。因此脚本会立刻被中断,因为解释器无法执行后面的代码。& r7 H, N9 ^1 E# [4 E- d

6 T5 @3 ?1 M( D9.答案是C。比较操作是一个可交换的操作(就是说结果独立于操作数之外),而赋值不是。因此,比如说,$a==10和10==$a是等效的,而$a=10和10=$a却不是,而且后者会导致一个错误,因为这不是一个合法的操作。确保常量在操作符前面,能保证你不会错误得将比较变成赋值。9 S; j  r8 b4 z6 |
4 x9 ]: j: b, T" g$ W
10.答案是C。error_log函数能将信息送往一个指定的地址。尽管mail()也可以用,但error_log能自动给邮件添加标题,因此这才是最简单的方法。/ b& P; }: h! D& u, m' r

1 g) D+ \8 f4 \0 ?11.答案是不能。error_reporting函数能关闭所有运行时的错误报告,但对解析时的错误无效,因为解析错误发生在脚本执行之前。
9 r- T" P3 ^! V' ^: W( S
% Y1 Z0 O$ d  Y% T12.显然,答案是C。概要分析器(profiler)能监视脚本的运行,并记录单个部分的运行时间。它可以用来找出和解决瓶颈。
7 r# U# U8 X9 V1 t) _8 W1 w
. q, T$ p6 p2 M8 S13.这是对调试器的完美定义!你可以用调试软件监视脚本运行,同时分析系统资源消耗,从而发现和解决程序缺陷。
, ]% _  c! k/ z8 D# r
% ?& c0 X2 v% I  S# n( y2 a; I14.trigger_error()和user_error()之间没有区别。后者其实是前者的别名。+ ]6 a( I8 W  d. p
4 F* o  |& u* r# Z1 [: \. u' ?( P$ ]
15.答案是D。题目是在描述debug_backtrace函数,它返回一个由所有在代码的特定位置调用过的函数名组成的数组。

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