返回列表 发帖

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

作为一个开发者,无论你经验多么丰富,或者无论你多么努力,你的程序中总会有bug。这是生命中一个必然的部分,如同死亡与缴税(尽管并没有后面两个那么严重)。
: Y  n7 F  |# x5 y4 f# s要想解决bug,首先要能找到bug。事实上,许多开发者花费了无数小时茫然得盯着代码,只是因为他们没有把程序的容错能力摆在首位。忽略了这个部分,那么期望一个没有bug的程序就是——不可能的。
  V& k  z6 y7 h+ N4 G. b4 L本章测试题将考察你对调试和性能管理相关知识的了解,以及如何用PHP做好这两件事。
1 h9 k/ S4 V4 s# I/ I8 X% Q0 E. Y! D% O3 ?, k( C! U. ^6 \
! T& p; E, H# v) ?
问题
+ Q8 A# _  _& r5 e' [2 M: k3 V/ R9 J" K6 R: E
1.以下脚本如何用三元操作替代?
$ {3 d1 O# }" 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. ?>
复制代码
, D2 [8 z  M! X' r
A.$x = ($a A. < 10 || $b > 11 || $c == 1 && $d != $c) ? 0 : 1;
5 s# D$ P8 v0 GB.$x = ($a < 10 || $b > 11 || ($c == 1 && $d != $c)) ? 0 : 1;, \# {( A9 \) Z3 j
C.$x = (($a < 10 && $b > 11) || ($c == 1 && $d != $c)) ? 0 : 1;, r* Q9 P3 D; }
D.$x = ($a < 10 && $b > 11 && $c == 1 && $d != $c) ? 1 : 0;
8 c4 S6 M5 m6 y4 Z' [8 qE.以上都不对/ [/ ]2 C, v0 N

& U( @9 c" y9 U9 y* S: D% f9 R; n! \, ]5 y  u- E
2.有一个脚本由于要从远程获取数据,因而运行速度很慢,以下那种方法能对其进行优化?(双选)- w6 ~7 U4 e& t' ]/ A8 K

2 H& `7 s% h( z% A: r& ~A.安装操作码缓存(opcode cache)
  M( ]. j) _3 \3 ^B.优化或者升级你的网络连接
% X# D/ S9 ~3 M& ~7 \9 |C.添置更多的硬件3 F' S$ `, u2 {- V  }( ]. N
D.增加服务器的可用RAM
& g  I) U( Z' `) V" y9 A& OE.使用连接缓存
0 U: E  Q% i9 _' r' q
: F% v! `; q3 ^/ C8 z; ?5 [  u: E! d2 |1 Y1 b2 [
3.架设生产环境下的服务器时,需要做哪些步骤?(双选)) P  D1 @* B& s9 x. |

8 E3 N+ u( d2 d5 _4 A0 z! Z, r* dA.关闭错误报告
5 H# d3 F- n3 C7 BB.打开错误日志; f0 [) {/ X) P6 W3 f2 I7 z% W& g+ d5 J
C.关闭错误日志# {# ^2 \+ M' @. R- `/ R* Z& a0 S7 e
D.关闭错误显示
! D) F, I+ O4 u# ?: h. p; o0 qE.使用@抑错符  ~* q" k2 I" O: J' |: p
4 d1 c( ~# e2 ^6 m5 I  }3 I: m

; _6 l9 l# p0 ?! x4.______操作符能对操作数的数据类型进行严格的比较?! p0 P. n3 ^  G, W7 ^
5 K) U: }# w- f8 }- o. E
答案:____________7 f; r9 g' H$ I3 C& u& o7 B

1 K* I5 u) C/ g" u
+ X3 t" w0 {4 P2 N+ L, r$ Z5.操作码缓存(opcode cache)能做什么?5 x! v) g6 Z; g

5 x) `) Y" Z% b1 \5 }A.把脚本编译成二进制对象,使它运行得更快
: R% X2 c- \) r4 qB.代替Zend引擎加快解释器的运行
! K  Z# [, A! B2 M' o: X' h0 XC.缓存脚本输出以提高执行效率4 p+ b3 S2 c8 }+ _
D.缓存解析器产生的中间码,以提高运行效率; |' W, l+ W, k( |4 |0 O- k* O
E.在内存中缓存脚本,减少从硬盘中读取的次数
* L3 u! V7 |. U, g
- l3 I& U% M/ f8 y1 N  a
1 l- d9 T! P: ~& d( [6.以下哪些情况容易造成系统资源枯竭?(双选)
3 V) \/ u/ m3 ~% |  N" b/ ^
+ n7 t. m% n( c) b1 r" M$ gA.RAM太小2 v/ ]1 @4 N) E3 e, p4 _
B.使用了低带宽的连接
: _7 F* F! x& q* F: \8 @% X# e7 yC.虚拟内存超过2GB8 A0 T: K% P0 E* C6 m
D.允许同时运行太多的服务器进程
7 C; L5 N2 T- n+ QE.以上都不对
- o4 N/ U$ f; J# i, k
0 ~6 o3 c) D% K
9 C! ?9 ~0 O0 R: E' x7.以下脚本缺了些什么?(双选) 1 ~8 E. p- m  }- I

  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. ?>
复制代码
4 q- r& l9 z3 W' ]5 Z# U! b/ q
A.参数出口(Parameter escapement)
- w5 I8 t; T0 D" U1 m% EB.输出格式化
! [3 m+ F, \) L$ l: @4 CC.错误检查
" K/ F+ w8 Z4 j: iD.一个SQL查询
7 J/ W" s; P' r' ?) mE.以上都不对
$ H6 L: X. W6 c4 a* f) f8 N2 j/ E
6 B7 d9 [& I7 L: [/ O( W3 ^8 K
9 [4 B1 W3 Z2 E$ z- A2 A8.以下那种错误类型无法被自定义的错误处理器捕捉到?(双选)- a3 M) o* U# O2 U* i- [
2 ~& E# {8 s/ m6 {! _. X
A.E_WARNING
' u9 v8 V( F* ^. u; ^" \* p8 ]. LB.E_ERROR
  M7 I' ^- F1 p" }4 ?1 GC.E_USER_ERROR
, x% L1 H2 B1 @6 @D.E_PARSE
+ |3 `& [6 I6 t+ Q- UE.E_NOTICE
( d8 O2 ?4 f/ r9 {
4 `) F! o4 j. x8 ]- ]2 P
* p' p( V; A0 p9.当需要比较一个常量和一个变量时,如何才能保证不会错弄成赋值?
  i4 a; h$ Z" v! @5 d& Q/ A; J" f3 M& {, N- P
A.把变量转换成int8 ^) M/ T3 R) N- `- D. Q* h
B.使用全等比较符(===)% ]  r- R- M, w" t! p# C
C.确保常量是第一个操作数
  L0 h/ }8 v) r: o* L1 `, Y: \9 [D.使用三元运算符
, U1 x6 F% x, K0 e: H0 tE.用括号把操作包起来
( l7 X  y& @! A6 J3 `
& g: O# l; g( _" C0 G) a; d4 c  X) }# b$ f( _
10.要通过邮件给系统管理员发送错误信息,以下那种方法最简便?% C' k4 c/ A/ W: W: ^

  M* g( r/ Z% zA.创建一个连接远程SMTP服务器的函数7 v4 u, c3 e3 X$ ^" N4 E; Y
B.使用mail函数1 V+ ?8 S8 @7 k4 p7 I
C.使用error_log函数/ |1 ]0 i. {- W  t
D.调用sendmial程序
6 E3 k1 b- X) o6 _# t2 i% tE.使用webservice
0 T" b0 M/ Q; J
. M; i% p* o4 @( V" l8 I, y) d* y+ }/ N. i" h* t8 H( h
11.能否仅调用一个函数就关闭脚本内所有的错误报告?, j9 {' g5 B, ~3 [% w' `. E
; o; A) {- V1 k3 ?# c
A.能
) q( v; p0 T  U5 B4 q3 R. ZB.不能
8 q5 k( B9 \5 u+ P# Y6 ?
) n0 c7 F' h% j" g# |) h0 l
+ j. W1 N: ^/ ?+ f. o12.概要分析器(profiler)是做什么的?
8 x" A- r) z4 J; X" \2 ^2 t
0 j8 x/ ~0 @; |) fA.创建关于脚本结构的档案: ?0 `" f8 E% s* j6 ?
B.把脚本转化成UML图$ z' B7 i5 A6 A7 p. o8 I. N
C.精确测算脚本不同部分的运行时间1 T6 Y7 f' ~2 s7 W1 f3 V
D.计算脚本通过web服务器执行时的维度) I4 _7 ]* {* W( h3 v3 D; G
E.扫描脚本,识别由常见错误导致的bug
+ u! O- n- G. S2 i+ H
4 U5 R6 u: E# C3 P
) k3 [$ `2 k# l- p13.______能帮助识别和解决bug。1 a  w( h1 p" ?6 c6 q/ w- P  }5 b

- R/ r9 x! q3 b# V1 E/ ?答案:____________
) W6 C5 i, R3 F$ s0 P' v. n- }: [" u" U6 d

& D! V1 O* u2 O9 j7 k/ h14.trigger_error()和user_error()有什么区别?4 ]0 c3 [+ E2 c/ F5 u! @2 R3 N3 D
8 Y6 R, F: M4 X8 F, d
A.trigger_error()允许脚本抛出系统级的错误2 d" U8 M# a% N$ p3 i9 V
B.user_error()允许脚本抛出系统级的错误8 O( F7 b$ w) {& P1 h4 H
C.user_error()不能被用在错误管理器中; w  ?; L8 q# A( [
D.trigger_error只在PHP5中可用! q& R" h/ e$ {7 w" [2 M) |0 L8 i
E.没有区别
( {* e2 H/ |7 ?1 `1 F. L! K1 |+ p1 I5 G' s# C

+ E6 c' |: W9 ]1 o; X3 Y" `15.______函数能返回脚本里任意行中调用的函数的名称。该函数同时还经常被用在调试中,用来判断错误是如何发生的。
  i* h* o7 e1 h5 h6 C
/ F! `6 H) d+ }3 i; X2 h. vA.print_r
: t. y1 S* q" _- t3 \& NB.var_dump1 H+ G% q# D, i& n! [/ A+ A, ~
C.stack_dump7 {( @* `$ B* z- y* `; e. q
D.debug_backtrace
! u/ u( x1 b$ dE.以上都不对
6 O+ r4 P" Q6 i. C, B* [; y" V( C" J( J  E( ]
答案
* @; E/ w/ M" J% r4 p7 j! J8 a* O& _9 c* y9 A1 r  q" G
1.答案是E。三元操作符把每个if语句连到一起,作为&&操作的一部分。然而本题中,$x=1这个赋值只在第三个if为false时发生。如果第一个和第二个条件都不成立,$x=1就不会执行。这题对三元操作的应用有些极端,实际应用时,需要根据可读性来决定是否需要用三元运算符(本题这种情况就最好不要用)。
3 T) U: A& A! O, u
# m3 x6 U( q) _, y4 Q( ^! C2.问题是由第三方数据源传输缓慢导致的,而你无法控制这个数据源。你也许能在网络连通性上做些工作(假设问题出在你这一边)。还可以对接收到的内容进行缓存,这样能减少获取重复数据的时间。因此,答案是B和E。
) m6 T' H- v5 D6 Z% K9 A3 K/ H5 D4 Z( q+ w
3.正确的选择是B和D。如果关闭错误报告、使用@抑错符和关闭错误日志,那么在你交付给客户的网站出现问题时,你将很难进行分析和调试。
* e5 v- |  T  c5 f1 t" L
8 O' h7 Z9 H1 @$ u, _3 E9 t9 X4.这是在描述===操作符。3 b8 g: t3 O" R7 K. e, N3 q

; M! B# P- p' ]0 L5.正确答案是D。PHP脚本在执行时,将首先被解析成“中间”码(也叫opcode,操作码),然后解释器执行。操作码缓存出现在这两个步骤之间,对解析器的输出进行缓存。下次执行该脚本时,将缓存的输出直接送入解释器。这样就就不需要再解析一次了。
: D( F) W3 |) n( z5 q
: E* S& H: _+ z! a' u# d2 p8 i6.正确答案是A和D。如果RAM太小,进程间将出现资源竞争,服务器将大量使用硬盘交换。同样的,如果允许过多进程同时执行,也会使服务器频繁进行交换,导致速度下降。
& a3 a- y7 ]; G& j- X4 e% v! a, Z( n. `) s3 O8 e. N# ^
7.正确答案是A和C。脚本不检验datebase_query()的调用是否成功,因此将持续执行下去,最终产生错误。此外,$my_id参数没有转义——可能导致代码注入(详见第11章)。* T& w; D. y4 I% ~
# o/ e# k4 `" L; x" r- h8 H7 \
8.答案B和D正确。出现解析错误往往表示脚本中有语法错误,自定义的错误管理器无法捕捉到它们的原因很明显:错误管理器在脚本里,而现在无法解析脚本,管理器也就无法执行。类似的,E_ERROR表示有致命的运行错误出现,比如内存耗尽。因此脚本会立刻被中断,因为解释器无法执行后面的代码。+ j. U3 J) q& O4 b0 ^
# N# O" i# T& p3 n9 V
9.答案是C。比较操作是一个可交换的操作(就是说结果独立于操作数之外),而赋值不是。因此,比如说,$a==10和10==$a是等效的,而$a=10和10=$a却不是,而且后者会导致一个错误,因为这不是一个合法的操作。确保常量在操作符前面,能保证你不会错误得将比较变成赋值。
0 p9 h5 {# L* A3 U( ~/ v$ I0 B+ B9 H" ?5 q
10.答案是C。error_log函数能将信息送往一个指定的地址。尽管mail()也可以用,但error_log能自动给邮件添加标题,因此这才是最简单的方法。
3 d0 B& e, ~; t+ [( X. }, B
; l7 {5 K/ ^5 d11.答案是不能。error_reporting函数能关闭所有运行时的错误报告,但对解析时的错误无效,因为解析错误发生在脚本执行之前。
4 C; }% A, A+ }  T) I$ q% m1 @3 E' I- A' B$ H! D
12.显然,答案是C。概要分析器(profiler)能监视脚本的运行,并记录单个部分的运行时间。它可以用来找出和解决瓶颈。6 E2 L4 I  w& q, ^3 H

+ I0 t! Q1 X: q/ R/ b13.这是对调试器的完美定义!你可以用调试软件监视脚本运行,同时分析系统资源消耗,从而发现和解决程序缺陷。
+ d/ [( H( m4 _0 s& i5 U0 @# v* o' F) u  u/ t/ t& U/ e9 ~
14.trigger_error()和user_error()之间没有区别。后者其实是前者的别名。
. [% ?3 H3 J; a( q- P* ~7 b7 q) Y; n: U7 }+ j2 k
15.答案是D。题目是在描述debug_backtrace函数,它返回一个由所有在代码的特定位置调用过的函数名组成的数组。

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