  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14247
- 金币
- 2414
- 威望
- 1647
- 贡献
- 1362
|
[Zend权威认证试题讲解]第十二章 -调试与性能管理
作为一个开发者,无论你经验多么丰富,或者无论你多么努力,你的程序中总会有bug。这是生命中一个必然的部分,如同死亡与缴税(尽管并没有后面两个那么严重)。+ l% F- H0 K: E& P- E1 m) b$ n! E
要想解决bug,首先要能找到bug。事实上,许多开发者花费了无数小时茫然得盯着代码,只是因为他们没有把程序的容错能力摆在首位。忽略了这个部分,那么期望一个没有bug的程序就是——不可能的。
" W( G i# M9 l3 |2 X/ Q x本章测试题将考察你对调试和性能管理相关知识的了解,以及如何用PHP做好这两件事。# ?. `2 [0 E/ `9 b! t
1 S) R! z7 w0 z- c; h- Q; ^4 L1 ]- I; ^+ @
问题+ ^1 [5 K+ }9 U& R9 P( v
% r& ~% j& s+ L% R
1.以下脚本如何用三元操作替代?
; ^ J; @5 P9 h' `' H-
- <?php
- if ($a < 10) {
- if ($b > 11) {
- if ($c == 10 && $d != $c) {
- $x = 0;
- } else {
- $x = 1;
- }
- }
- }
- ?>
复制代码
8 {; U+ x9 K) f, hA.$x = ($a A. < 10 || $b > 11 || $c == 1 && $d != $c) ? 0 : 1;! C) y1 m( ]" b* d) }
B.$x = ($a < 10 || $b > 11 || ($c == 1 && $d != $c)) ? 0 : 1;
: ~# g B3 t1 @C.$x = (($a < 10 && $b > 11) || ($c == 1 && $d != $c)) ? 0 : 1;0 x* E" z$ T3 h( W
D.$x = ($a < 10 && $b > 11 && $c == 1 && $d != $c) ? 1 : 0;4 b) r( Y8 \+ D2 }/ y
E.以上都不对
2 _" J& [ T4 K) y# p! K
5 `8 q0 R3 `, V' k" R, C' c: O3 C( Z* s- ]% C5 R1 V
2.有一个脚本由于要从远程获取数据,因而运行速度很慢,以下那种方法能对其进行优化?(双选)
( ~; i( k9 C( a- d- T
. E( r, P( k0 W; a0 L, IA.安装操作码缓存(opcode cache)
9 H+ C) I: m1 @% [B.优化或者升级你的网络连接/ g* \: M7 Q- R; z, ?6 H
C.添置更多的硬件
; k# g# I/ B2 y. `( uD.增加服务器的可用RAM1 P, p6 Q$ A8 p4 d4 v" [. [
E.使用连接缓存
" r- g7 x* L$ b$ M4 V5 B8 j n, A8 N9 d4 z' i6 U% x* a& l
' T% n5 X. a% l+ a+ b0 V l
3.架设生产环境下的服务器时,需要做哪些步骤?(双选)3 b& g5 \4 {" g1 |; ^
$ D% b. @) G2 K; n2 Z- BA.关闭错误报告$ Y: {6 s) m5 h E
B.打开错误日志
# K; I/ `+ w9 {" C! XC.关闭错误日志. y$ d- w0 c% `" T/ d0 g
D.关闭错误显示
3 |- e4 l4 B0 Z$ S$ nE.使用@抑错符) C# h6 X% a& ]3 O0 o# W$ h& D
+ C/ M) F# s- F' [' X# ?! z5 q! c, x
4.______操作符能对操作数的数据类型进行严格的比较?0 c' F+ u* U& v: V4 u' {* [
" g( `0 b( x! H! H2 D2 e% a
答案:____________
7 y; M8 T' P3 j9 S3 q
$ H+ b, `# m, q3 H9 f) y5 D6 l0 T/ G3 W
5.操作码缓存(opcode cache)能做什么?% D. {- l6 @ j* w' | D
n' w9 K; S! Q0 U- W# DA.把脚本编译成二进制对象,使它运行得更快
) f0 t$ |( w/ p+ q8 d2 R- fB.代替Zend引擎加快解释器的运行
9 H% j7 j u, b# K- l3 O# y4 PC.缓存脚本输出以提高执行效率
8 B, C8 O6 Z( ]% J, ^5 X6 @D.缓存解析器产生的中间码,以提高运行效率
! z7 R# N) N5 ^' X6 {. TE.在内存中缓存脚本,减少从硬盘中读取的次数
; W' G0 b1 ?, t4 M0 _: g4 v, p
: P9 b& _3 d3 S0 R7 b0 r
; @" P: J/ M2 ]! Z6.以下哪些情况容易造成系统资源枯竭?(双选)
5 [/ I. P/ G* C8 j
/ R, E3 K d8 u9 R. Q! [A.RAM太小
/ H U( p. G& e) P. o( ^6 S% d* \/ \B.使用了低带宽的连接
6 ?& Y1 h5 C$ G O& E3 f0 TC.虚拟内存超过2GB; Z8 ]+ e4 ]+ m& X2 ?
D.允许同时运行太多的服务器进程
: Z' |. c- l+ s" P5 e. f; j, OE.以上都不对5 D$ \1 S3 \: _- h V
, Q& |9 A4 M' P) a7 o( D% g1 ]* ^- c7 Q! y9 d- w+ I O7 a, ^
7.以下脚本缺了些什么?(双选)
& i% T% ]/ a8 {" t4 T/ q-
- <?php
- $rs = database_query ("select * from mytable where id = " .
- $my_id);
- while ($a = database_get_data ($rs)) {
- var_dump ($a);
- }
- ?>
复制代码 - J5 d( R, ?" ]% A
A.参数出口(Parameter escapement)
6 c# ^1 t ]2 @# ?B.输出格式化
3 o- k0 T5 m# y, Y5 {- J O! ], _C.错误检查
$ ^% U; y) W* k XD.一个SQL查询1 O! e7 [/ T4 l+ M) e' M1 C
E.以上都不对
. _( P7 f; `$ Z/ c
# O6 }# K7 C& k
4 s, ~$ `* o' @/ \$ Z0 w8.以下那种错误类型无法被自定义的错误处理器捕捉到?(双选)
' h- v) _/ c) X$ D. ~ N- n. ~: k# F3 c) q
A.E_WARNING- \: n" z5 w' G
B.E_ERROR6 C% q! E( R1 S8 K# @5 H( r
C.E_USER_ERROR) y) F' w) s9 l& K+ i9 M' V
D.E_PARSE
% |8 T4 |5 b( k& |2 P2 k* \4 TE.E_NOTICE
8 \# [) E8 N3 W2 U% Z6 i; f- t3 j
) Z7 {' J6 H/ ~4 M9 J: H. ~
3 Y2 U7 F0 w/ j$ q8 u9.当需要比较一个常量和一个变量时,如何才能保证不会错弄成赋值?+ _! p i4 n, d, j5 \
5 X% k' r! j3 s0 i$ z+ S/ `
A.把变量转换成int, S7 Y3 w! q0 \' k6 B
B.使用全等比较符(===)( B9 }' d2 c9 P4 c
C.确保常量是第一个操作数
0 f' d$ i) v0 y7 z8 ID.使用三元运算符* s) [2 j/ L- ]# P/ w y2 P. v/ m
E.用括号把操作包起来* i$ c( M/ d3 c9 R9 L
+ u X4 o$ o8 Z$ t
5 H% o: c H7 A: ?. B/ a8 W
10.要通过邮件给系统管理员发送错误信息,以下那种方法最简便?) Y0 k/ u( V2 x- Z1 D" B6 K: I
! q& ^3 q' B3 u0 m
A.创建一个连接远程SMTP服务器的函数9 q+ a* H+ l& M1 @/ u
B.使用mail函数
& H- w. W% u$ ~9 SC.使用error_log函数1 \+ I2 c+ `! t& s' {+ N/ R
D.调用sendmial程序
5 f; x) E8 s8 B; Q; \7 eE.使用webservice
5 Z0 u5 S, g d5 Q9 K0 |" R2 \+ B% ?. I: H
/ q1 y# p/ i# @
11.能否仅调用一个函数就关闭脚本内所有的错误报告?
7 u" V) {: ~; u; Q
* r! r% ]8 c' g8 s7 u, _A.能8 h: c4 n+ K* x
B.不能& ~6 c7 m; k( @' ~4 K" w# h+ m
8 m+ _) Z# I$ d: {3 y1 n8 u7 R0 W2 ~- f4 E. @1 K7 T$ t9 {
12.概要分析器(profiler)是做什么的?
& @9 L4 M+ n y- s8 d
% z5 C6 ^$ r5 P. v" G+ tA.创建关于脚本结构的档案; N/ T k5 W2 e4 y
B.把脚本转化成UML图
D/ W& b. Q q0 {, KC.精确测算脚本不同部分的运行时间
7 Q, E; F& D6 H$ K0 wD.计算脚本通过web服务器执行时的维度, t* O) _% M; \; m* p
E.扫描脚本,识别由常见错误导致的bug& W+ g& e' m3 D8 u ^( q7 ^
; N! ^" |" k3 f: w- F8 \
4 M8 M. E* J3 o N$ n2 A
13.______能帮助识别和解决bug。 \6 C: h4 t: {
8 q& p; K$ s7 Q# J答案:____________" r1 P+ _+ N) V8 x; D
5 J4 s) D7 r, |7 z* @
, x9 L- N' M$ ~) b3 ^( r14.trigger_error()和user_error()有什么区别?
5 b3 {4 n7 ^$ h+ ?
' v/ i5 ?: l" NA.trigger_error()允许脚本抛出系统级的错误
/ a7 q& o" L& x8 HB.user_error()允许脚本抛出系统级的错误3 z6 i/ [# U5 h
C.user_error()不能被用在错误管理器中
& D |$ U, h3 N9 a! O; X: u; A5 aD.trigger_error只在PHP5中可用
, \ N( v6 K8 v# k9 Y- M: jE.没有区别" A* b$ R6 p! t
+ `( ?5 \7 ]6 s* `' f+ m+ }5 z, |# L ]
15.______函数能返回脚本里任意行中调用的函数的名称。该函数同时还经常被用在调试中,用来判断错误是如何发生的。' s+ \: v8 l( e, A. e4 X" [) q
, `- B4 ]+ l9 M% W/ S
A.print_r
# f0 J6 {, Q& a7 X; UB.var_dump
3 L" L: H2 L/ F- T( [( IC.stack_dump0 L5 p i5 u9 ]$ _1 K
D.debug_backtrace* O6 g, V; k* f% Z* r0 ^ a* ]8 k
E.以上都不对
G+ \9 y6 ~2 M& r3 d2 E- i
+ j3 q: P9 X- {' _) A答案
( w& A% j" G, L6 n8 \- C* u
8 \8 [; M+ H: H+ v" M" v6 G6 _; A1.答案是E。三元操作符把每个if语句连到一起,作为&&操作的一部分。然而本题中,$x=1这个赋值只在第三个if为false时发生。如果第一个和第二个条件都不成立,$x=1就不会执行。这题对三元操作的应用有些极端,实际应用时,需要根据可读性来决定是否需要用三元运算符(本题这种情况就最好不要用)。6 q3 x: |, K3 ^/ Y |; H% T. X
+ j& [5 _8 u$ d6 N2 y' {& @2.问题是由第三方数据源传输缓慢导致的,而你无法控制这个数据源。你也许能在网络连通性上做些工作(假设问题出在你这一边)。还可以对接收到的内容进行缓存,这样能减少获取重复数据的时间。因此,答案是B和E。
$ q `$ B3 w2 w+ ]* Q# G6 X7 B4 Z' Z; [+ L9 y+ ^9 v. C9 F
3.正确的选择是B和D。如果关闭错误报告、使用@抑错符和关闭错误日志,那么在你交付给客户的网站出现问题时,你将很难进行分析和调试。
6 V8 c# J7 Q8 D% E2 J
" B" H1 M- U& V# }4.这是在描述===操作符。
7 O1 a, l. R! R q0 x" V" \# b3 h, S$ ]' L3 `& Y
5.正确答案是D。PHP脚本在执行时,将首先被解析成“中间”码(也叫opcode,操作码),然后解释器执行。操作码缓存出现在这两个步骤之间,对解析器的输出进行缓存。下次执行该脚本时,将缓存的输出直接送入解释器。这样就就不需要再解析一次了。: S2 `0 c) M, B1 Z: y
4 \4 O5 k B/ _# Z! F% j7 a. P3 S/ ^7 ^
6.正确答案是A和D。如果RAM太小,进程间将出现资源竞争,服务器将大量使用硬盘交换。同样的,如果允许过多进程同时执行,也会使服务器频繁进行交换,导致速度下降。( ]5 `; N6 Z) M+ Q7 J/ L+ s
6 p/ [& o$ H# Q6 H# d" i7.正确答案是A和C。脚本不检验datebase_query()的调用是否成功,因此将持续执行下去,最终产生错误。此外,$my_id参数没有转义——可能导致代码注入(详见第11章)。
) A5 A' o' o1 l$ {8 q" L% f% E1 V7 ^! M, O
8.答案B和D正确。出现解析错误往往表示脚本中有语法错误,自定义的错误管理器无法捕捉到它们的原因很明显:错误管理器在脚本里,而现在无法解析脚本,管理器也就无法执行。类似的,E_ERROR表示有致命的运行错误出现,比如内存耗尽。因此脚本会立刻被中断,因为解释器无法执行后面的代码。
/ g: k; ]+ P6 V# g* Y- a; r U: Y7 ^( o9 @3 V2 q
9.答案是C。比较操作是一个可交换的操作(就是说结果独立于操作数之外),而赋值不是。因此,比如说,$a==10和10==$a是等效的,而$a=10和10=$a却不是,而且后者会导致一个错误,因为这不是一个合法的操作。确保常量在操作符前面,能保证你不会错误得将比较变成赋值。
0 E! ?- T: t* ~! L( Q" h
1 F3 L( N+ C+ j, L" S4 H j10.答案是C。error_log函数能将信息送往一个指定的地址。尽管mail()也可以用,但error_log能自动给邮件添加标题,因此这才是最简单的方法。" u" V3 l+ Q7 w; b! }' _
8 x6 i s2 H, l. l
11.答案是不能。error_reporting函数能关闭所有运行时的错误报告,但对解析时的错误无效,因为解析错误发生在脚本执行之前。
; L+ f' f& j. d2 a8 L' O& A0 C: i6 x ` _
12.显然,答案是C。概要分析器(profiler)能监视脚本的运行,并记录单个部分的运行时间。它可以用来找出和解决瓶颈。
( E% M- p s6 Y( j
& j% m7 g- V! C. X13.这是对调试器的完美定义!你可以用调试软件监视脚本运行,同时分析系统资源消耗,从而发现和解决程序缺陷。' q/ j" h' G% H- F% x. g M
0 ^7 A* B e$ u' Q/ ~6 ?9 t! A14.trigger_error()和user_error()之间没有区别。后者其实是前者的别名。7 U4 \' n9 o7 ?5 c$ J
8 d; B5 ^) H5 _0 a7 v
15.答案是D。题目是在描述debug_backtrace函数,它返回一个由所有在代码的特定位置调用过的函数名组成的数组。 |
|