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

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

作为一个开发者,无论你经验多么丰富,或者无论你多么努力,你的程序中总会有bug。这是生命中一个必然的部分,如同死亡与缴税(尽管并没有后面两个那么严重)。
+ l  f$ y6 I9 c$ E5 J& V要想解决bug,首先要能找到bug。事实上,许多开发者花费了无数小时茫然得盯着代码,只是因为他们没有把程序的容错能力摆在首位。忽略了这个部分,那么期望一个没有bug的程序就是——不可能的。
/ l0 I0 z" {/ A- \0 k1 D本章测试题将考察你对调试和性能管理相关知识的了解,以及如何用PHP做好这两件事。
1 v8 W$ X2 P3 n' ~( T
. o+ f( S, D) W9 q2 D9 @5 R$ c3 p5 J9 M; D
问题! k/ [0 K2 K5 q' r# M5 s8 N3 H

) w6 O8 T* H2 J$ \% \8 F4 p' \1.以下脚本如何用三元操作替代?
' A1 e) L- a7 h) |

  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, |6 w* E6 EA.$x = ($a A. < 10 || $b > 11 || $c == 1 && $d != $c) ? 0 : 1;
$ e' c3 h+ b7 X6 W1 g2 gB.$x = ($a < 10 || $b > 11 || ($c == 1 && $d != $c)) ? 0 : 1;1 v+ n  V; g) K
C.$x = (($a < 10 && $b > 11) || ($c == 1 && $d != $c)) ? 0 : 1;+ S) L+ A" P1 @# a  P& A
D.$x = ($a < 10 && $b > 11 && $c == 1 && $d != $c) ? 1 : 0;
" t9 S8 ^0 ~1 eE.以上都不对, T" P0 F2 ?* D3 }9 s* r
; \8 z, F" Q" }. e
1 D9 W9 U0 p5 K
2.有一个脚本由于要从远程获取数据,因而运行速度很慢,以下那种方法能对其进行优化?(双选)7 ]- j+ r: f  P! ~
* a; V  s, z2 {
A.安装操作码缓存(opcode cache)! Q) X# H5 K- ~: y/ R6 w9 d
B.优化或者升级你的网络连接
3 L+ a, G  O' w( @7 L0 N) j, XC.添置更多的硬件
+ j3 }# Y; [3 Q% c9 D) bD.增加服务器的可用RAM1 x, C- |: T( _5 G( c  L$ z$ }  x
E.使用连接缓存; c2 ~+ C& T2 \, d: ^; M

: n- L4 u; O, i. h7 y# K% D: y
9 x" X8 a8 D% T) G3.架设生产环境下的服务器时,需要做哪些步骤?(双选)
( T7 m) M2 U0 K2 H1 W3 R$ D8 H4 _5 {  D8 \6 ~1 }" c; f; V% X3 L7 R
A.关闭错误报告
) x& V) O: e! E8 O" L( ~2 iB.打开错误日志
8 H( r/ a! Z5 q1 E/ SC.关闭错误日志* E( S9 j; l+ @
D.关闭错误显示
* _5 o+ _2 c6 q! C6 o9 S6 e' oE.使用@抑错符
* {& M& N, I- J3 E' a9 \8 R+ Z( O; w0 g9 \6 n
) N+ d* f' w  u' V! [4 [$ [8 m+ v
4.______操作符能对操作数的数据类型进行严格的比较?
7 A. n: b: n9 I. W5 \! V
1 j4 S& g/ s+ B# r8 v- d答案:____________
2 }3 p, S( L6 g/ P$ C6 B$ T+ ?# v8 k
/ i. c# k9 i6 P- {& `
5.操作码缓存(opcode cache)能做什么?1 c( ^5 N8 m% G- u, {- D! w
/ f, Y# ]9 w$ x2 o, t
A.把脚本编译成二进制对象,使它运行得更快
* ?4 u2 v' Z1 ?7 J! p$ wB.代替Zend引擎加快解释器的运行
* ~& }4 x) N. `6 Z; E6 jC.缓存脚本输出以提高执行效率5 l( k6 y1 |! {6 d0 @8 u$ z
D.缓存解析器产生的中间码,以提高运行效率
, I9 \4 G( \9 J3 A, f% RE.在内存中缓存脚本,减少从硬盘中读取的次数
8 p" ]2 o5 P  u- T2 k& i  ]3 C8 w. E( N& O1 H7 \+ S: T1 ?
! z; X" O& z# o# o
6.以下哪些情况容易造成系统资源枯竭?(双选)2 q& \0 {; z- t) P( F. B4 A
8 q8 B. p: Y. E3 L* \
A.RAM太小3 s$ y: m: m. \, F/ N
B.使用了低带宽的连接
$ {; v3 j4 M* D! S9 _4 jC.虚拟内存超过2GB
4 L4 Z. V9 a5 v5 eD.允许同时运行太多的服务器进程
7 K2 y! w' L) l4 {2 j6 y% P5 WE.以上都不对( v5 @* l2 O' P% w0 m/ _" y

! ^3 i  W* b8 X/ b6 ]$ B5 C) B5 Y. C7 k' i! G
7.以下脚本缺了些什么?(双选) 9 a; F3 t! u- f9 `

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

; F8 ?( {* P6 x5 _3 B9 L" I5 aA.参数出口(Parameter escapement), c, U6 t! T4 m2 p! z
B.输出格式化
! c, f; Q, S+ |+ q  C/ }6 Z4 J. T1 AC.错误检查
+ [2 C" W& P9 d* S9 ?" J1 G( O% J# CD.一个SQL查询2 g+ I; C' }' w- c
E.以上都不对
  _1 i- |- {( o9 ]
( i% d4 {  u3 t# M8 e' J3 G- i) t2 Y
8.以下那种错误类型无法被自定义的错误处理器捕捉到?(双选)
& ]9 A# \# J% Z4 J( s5 b5 ]3 v  L6 a9 @' S6 q2 U. R7 ]" v
A.E_WARNING9 S! R1 }0 o& I  P+ e
B.E_ERROR
) m' Y6 N0 r! r2 AC.E_USER_ERROR
0 p$ G7 \3 Y+ e3 SD.E_PARSE1 i0 @( h0 g+ p4 b" Q1 m/ [% p
E.E_NOTICE' J5 N: V# q$ A5 b( [9 H" b" j

: a7 y0 E+ z& C/ I& o/ Y: y& J. M6 j9 I+ W% K
9.当需要比较一个常量和一个变量时,如何才能保证不会错弄成赋值?9 {# ]' h) e* R4 {: k& }

4 I+ d$ l' f2 |; QA.把变量转换成int: w# ]5 N0 ?% |0 @! c: n7 _0 }6 Y
B.使用全等比较符(===)* a* d3 h8 x: j1 \1 K
C.确保常量是第一个操作数* C2 @- `% S. ]. W5 o: B+ `! V
D.使用三元运算符
  h/ o* H, X0 @! S/ g* ME.用括号把操作包起来! u& l' Z8 v) _9 G) B3 x
8 r. X% C: M: q* Y- |9 e2 r
* [- Y" S# }! f9 d, _5 q: s
10.要通过邮件给系统管理员发送错误信息,以下那种方法最简便?
5 n6 a- x7 q7 p5 Y9 ~$ n2 U0 g$ A$ q& p" X7 R$ J* _# y; `5 L8 g7 z
A.创建一个连接远程SMTP服务器的函数
1 c- a3 S" e% O' I! g) I$ TB.使用mail函数
0 c) w8 r1 j  s0 ^8 L$ Y, bC.使用error_log函数
: Y% q. C; t+ W1 }3 kD.调用sendmial程序
9 h. k2 {. z7 }* y5 I* v4 H+ NE.使用webservice. d+ C, `' F, ~6 w
3 |, z" m, X- R& i  x
9 r6 T5 O. k1 B6 q) V% ~/ X/ W
11.能否仅调用一个函数就关闭脚本内所有的错误报告?
! u2 ^4 B$ {' I3 J5 s7 D5 f
% Q0 m  ^3 J4 E, v+ P  ?* I/ ?A.能! H2 g; R3 X9 @: W% E
B.不能
! h! ~  s' J8 B- h* Q2 Z2 x6 Y! w9 B( O% V

# Q0 D- z+ F" [1 U/ ]  `* M8 Z12.概要分析器(profiler)是做什么的?
3 p0 L# ^* k2 J; j& ~: j* a0 [9 h2 I) P7 `9 w% Q) ?
A.创建关于脚本结构的档案6 Z, |0 j, j* o2 V! C/ P
B.把脚本转化成UML图
" _: C* e2 }! M8 c! Y5 QC.精确测算脚本不同部分的运行时间4 [" e/ G0 W8 m0 b
D.计算脚本通过web服务器执行时的维度$ |( N& q& a. b, W/ F2 u& C* V
E.扫描脚本,识别由常见错误导致的bug; }9 T" L( t" {1 s( ~; s7 T
. M, s$ b. O9 p3 B$ D
+ k- S! M6 S! P) I  E
13.______能帮助识别和解决bug。! o. Z: w5 J. _7 q) |9 O5 U

2 k  h9 i5 n. r' Q4 d8 W答案:____________" B, ]! Q) z6 ?, F5 B' J" N
; y- N& |; u" I5 G$ c8 W
& k" D( L' [8 J
14.trigger_error()和user_error()有什么区别?
$ R* w2 L$ X6 m; U8 [: ?: ~6 J6 Y5 l+ x/ k/ g9 j' n9 ]
A.trigger_error()允许脚本抛出系统级的错误' X; a1 _' i& Y/ c7 e; i
B.user_error()允许脚本抛出系统级的错误6 S4 V* p9 [8 z# D9 m7 |+ y. ~
C.user_error()不能被用在错误管理器中
- x% b9 C- `' k' b% y5 {6 UD.trigger_error只在PHP5中可用
& W5 ^: W+ b# j% b3 ~. {E.没有区别3 m4 l7 Z# V1 s3 W
% |) G( D7 t9 n3 _
! n4 \& T/ A! j! F
15.______函数能返回脚本里任意行中调用的函数的名称。该函数同时还经常被用在调试中,用来判断错误是如何发生的。
! H4 C9 W# q7 L1 G7 k: j7 `+ H. X2 s* a0 O
A.print_r2 [' p5 d9 N  a2 S8 \
B.var_dump; k4 X+ p! Z! t$ s+ x% Y& `
C.stack_dump
& y' n  W1 S" i' CD.debug_backtrace
( ?5 r* ]7 v. VE.以上都不对
6 l5 W; k) `0 U  ^" b2 W( R* }% q& Y. R
答案: I) l, _0 b0 M

/ M; M$ O: R2 H9 S1.答案是E。三元操作符把每个if语句连到一起,作为&&操作的一部分。然而本题中,$x=1这个赋值只在第三个if为false时发生。如果第一个和第二个条件都不成立,$x=1就不会执行。这题对三元操作的应用有些极端,实际应用时,需要根据可读性来决定是否需要用三元运算符(本题这种情况就最好不要用)。7 q; q: S9 Z& G7 Q4 w4 Z% }
8 S! ]  z2 L& p
2.问题是由第三方数据源传输缓慢导致的,而你无法控制这个数据源。你也许能在网络连通性上做些工作(假设问题出在你这一边)。还可以对接收到的内容进行缓存,这样能减少获取重复数据的时间。因此,答案是B和E。5 c# N' Q4 s/ A0 d
% w+ t" w% i/ k3 i
3.正确的选择是B和D。如果关闭错误报告、使用@抑错符和关闭错误日志,那么在你交付给客户的网站出现问题时,你将很难进行分析和调试。
6 M$ }( E3 x8 ~4 j: x9 c' D8 D& E1 {  {% b- Y2 h! Y" A( |
4.这是在描述===操作符。* e& |1 }  u0 a8 M! n! e

  K; }" N) j9 j1 ]5.正确答案是D。PHP脚本在执行时,将首先被解析成“中间”码(也叫opcode,操作码),然后解释器执行。操作码缓存出现在这两个步骤之间,对解析器的输出进行缓存。下次执行该脚本时,将缓存的输出直接送入解释器。这样就就不需要再解析一次了。
% t3 u+ f# e/ P; Y: Z3 X
# S4 q, C2 G  _6.正确答案是A和D。如果RAM太小,进程间将出现资源竞争,服务器将大量使用硬盘交换。同样的,如果允许过多进程同时执行,也会使服务器频繁进行交换,导致速度下降。" P8 [+ k9 G  Q$ p. g- J3 Q

- Q2 e3 L7 k9 T4 ^7.正确答案是A和C。脚本不检验datebase_query()的调用是否成功,因此将持续执行下去,最终产生错误。此外,$my_id参数没有转义——可能导致代码注入(详见第11章)。
9 G9 K  W: g/ w# R% s! d( v* S+ o6 `" M! Y
8.答案B和D正确。出现解析错误往往表示脚本中有语法错误,自定义的错误管理器无法捕捉到它们的原因很明显:错误管理器在脚本里,而现在无法解析脚本,管理器也就无法执行。类似的,E_ERROR表示有致命的运行错误出现,比如内存耗尽。因此脚本会立刻被中断,因为解释器无法执行后面的代码。! r1 r+ f3 Q. c5 }- z' B# A
1 m8 @. Q, k& Z7 K5 Y6 P
9.答案是C。比较操作是一个可交换的操作(就是说结果独立于操作数之外),而赋值不是。因此,比如说,$a==10和10==$a是等效的,而$a=10和10=$a却不是,而且后者会导致一个错误,因为这不是一个合法的操作。确保常量在操作符前面,能保证你不会错误得将比较变成赋值。! Y' }# r& N3 ]+ H  P. V
: y, _. z2 |; q7 m4 H" p
10.答案是C。error_log函数能将信息送往一个指定的地址。尽管mail()也可以用,但error_log能自动给邮件添加标题,因此这才是最简单的方法。
6 p6 ~) `7 j6 p& R( U; A2 w8 b" v( u' G' z/ k7 J$ ?, I
11.答案是不能。error_reporting函数能关闭所有运行时的错误报告,但对解析时的错误无效,因为解析错误发生在脚本执行之前。
7 d: j* D( s: w1 {3 S
3 H* o! G: J8 f: m  G  P/ k/ G6 M. s12.显然,答案是C。概要分析器(profiler)能监视脚本的运行,并记录单个部分的运行时间。它可以用来找出和解决瓶颈。
! u) V  z# R: V$ U0 x3 D+ ?
) Z/ Z6 ^* P5 X! A6 f5 R13.这是对调试器的完美定义!你可以用调试软件监视脚本运行,同时分析系统资源消耗,从而发现和解决程序缺陷。
. x9 |, H$ S' n9 u7 N  z0 @; p. O* T. ~3 y
14.trigger_error()和user_error()之间没有区别。后者其实是前者的别名。
' s" {- Y, @4 f2 M# l: t6 d8 G5 r+ D
; d8 b; y; s% h. W+ P15.答案是D。题目是在描述debug_backtrace函数,它返回一个由所有在代码的特定位置调用过的函数名组成的数组。

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