|
  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14389
- 金币
- 2480
- 威望
- 1647
- 贡献
- 1428
|
[Zend权威认证试题讲解]第十二章 -调试与性能管理
作为一个开发者,无论你经验多么丰富,或者无论你多么努力,你的程序中总会有bug。这是生命中一个必然的部分,如同死亡与缴税(尽管并没有后面两个那么严重)。2 Q2 o3 G, ~( }% k
要想解决bug,首先要能找到bug。事实上,许多开发者花费了无数小时茫然得盯着代码,只是因为他们没有把程序的容错能力摆在首位。忽略了这个部分,那么期望一个没有bug的程序就是——不可能的。3 t/ M$ T: a6 x6 S2 k
本章测试题将考察你对调试和性能管理相关知识的了解,以及如何用PHP做好这两件事。" Z- g3 }2 ~7 v ?( \
7 f/ |. s+ y" N' R% o& T
- V3 W9 R! H9 L+ f6 [
问题, d) K2 E* v- r+ F( r
% N8 Z9 @# h O' h/ L/ d7 }
1.以下脚本如何用三元操作替代?
; z. `3 u6 k$ a% u-
- <?php
- if ($a < 10) {
- if ($b > 11) {
- if ($c == 10 && $d != $c) {
- $x = 0;
- } else {
- $x = 1;
- }
- }
- }
- ?>
复制代码
7 ?+ c. Y' p/ ]2 WA.$x = ($a A. < 10 || $b > 11 || $c == 1 && $d != $c) ? 0 : 1;' z5 S* ]% c' [! u
B.$x = ($a < 10 || $b > 11 || ($c == 1 && $d != $c)) ? 0 : 1;9 G+ `! W/ O Q Q; V0 l. W) X( |7 G! w
C.$x = (($a < 10 && $b > 11) || ($c == 1 && $d != $c)) ? 0 : 1;! J- G5 {8 V8 K' G B
D.$x = ($a < 10 && $b > 11 && $c == 1 && $d != $c) ? 1 : 0;7 `* q5 e, b3 A j
E.以上都不对1 X3 T5 b2 [# t- a. J
- ~+ c# H: l: |) D. Q4 z+ ~
' X0 }4 o, ^) p) ]8 X5 _2.有一个脚本由于要从远程获取数据,因而运行速度很慢,以下那种方法能对其进行优化?(双选)2 [7 O& g3 N2 M" k, J
* {( \- E' I" LA.安装操作码缓存(opcode cache)" {% P! X3 _7 n$ N/ r( d. c9 e
B.优化或者升级你的网络连接
# a* O- U6 U8 |+ }/ w! i/ P) GC.添置更多的硬件
4 d0 o% l2 H9 B9 ]- R, BD.增加服务器的可用RAM8 |( e; I" J8 R$ @* U6 B
E.使用连接缓存- [0 D5 ?" [: G$ t+ _6 Y, t
$ t7 O: A+ a# V( o' d+ Z; N" ?$ W% t9 A! |$ M: L5 d
3.架设生产环境下的服务器时,需要做哪些步骤?(双选)8 l% _# g2 K3 S
0 F; ~& n8 i4 r/ [- B+ }7 F/ k8 H2 q
A.关闭错误报告6 t5 `5 @1 K. N3 ~
B.打开错误日志
6 Z% C( T8 o2 T3 O7 v7 u2 sC.关闭错误日志' d& y& V+ w" z' ^
D.关闭错误显示
; l0 |% j0 _2 h9 Z$ Y, q/ K$ OE.使用@抑错符9 o M" V; g! U# I! ~6 S
+ s# Z0 w6 Z+ F: a
x( ]" z# }+ l) p' J4.______操作符能对操作数的数据类型进行严格的比较?& _9 z" z1 h9 M) d. |; r2 V
: ]# a& z7 P1 X5 o; p' ]) ^答案:____________, i( D+ a6 @* C. N1 `
# U) O1 ~1 l0 l2 N& j% T% K9 [( H6 V
0 j+ c3 t) Q" m/ f$ C
5.操作码缓存(opcode cache)能做什么?
" Q2 J9 r+ B' X5 s; _- R) b j4 u, q/ @7 f+ T9 S/ _
A.把脚本编译成二进制对象,使它运行得更快# X8 K+ L# ?3 U
B.代替Zend引擎加快解释器的运行
, _ J) n& `. t. V3 u; ZC.缓存脚本输出以提高执行效率0 o1 Z% r2 _- q' u' t1 F C
D.缓存解析器产生的中间码,以提高运行效率+ X1 s9 f" j3 ]2 V' f
E.在内存中缓存脚本,减少从硬盘中读取的次数2 @" O' t9 a: K5 v
8 h- ?# {& t. c; l( U2 F! }5 V& {7 K0 | Z/ N
6.以下哪些情况容易造成系统资源枯竭?(双选)/ ^1 ^: @" p6 s% ~
: m# D8 Q7 Y# x/ s
A.RAM太小
& i4 L6 F# s7 p1 GB.使用了低带宽的连接/ [ {& K& G, d
C.虚拟内存超过2GB" p, f$ W" _* Z4 K( V
D.允许同时运行太多的服务器进程) {5 o( R' f/ W& l; g
E.以上都不对
$ V- a% `, {/ p) X, T' O- }# ^! c8 S" K9 [
' }7 v" X+ z8 c" t! t7.以下脚本缺了些什么?(双选) 5 n, E' i4 D4 X$ z; v# g/ i
-
- <?php
- $rs = database_query ("select * from mytable where id = " .
- $my_id);
- while ($a = database_get_data ($rs)) {
- var_dump ($a);
- }
- ?>
复制代码 : s7 }) Q& P! {7 D
A.参数出口(Parameter escapement)" B6 I( G. D+ D. y. v0 Y: N) v- Y: y
B.输出格式化4 H+ ? X" G* Z) [7 c2 I
C.错误检查
) q: Z) c7 j7 E# q% ]) D7 g/ zD.一个SQL查询7 y; a$ G$ X5 B, f3 `( \: V9 u3 T. C% L
E.以上都不对( C Z0 Z% S/ ]
0 z2 v' [7 K/ N+ @) f1 ]+ k, x: @4 [7 @4 F# P
8.以下那种错误类型无法被自定义的错误处理器捕捉到?(双选)+ C: V- n( Y: \# q2 u
$ B, ~, @! o5 w' k% L: J. v1 b8 o
A.E_WARNING7 Z6 W W" _. J' S6 _0 j
B.E_ERROR
9 {' P+ ]+ G: g0 j2 j3 JC.E_USER_ERROR0 S4 T; @! Y& Z: T# O: a/ a; p
D.E_PARSE
3 |1 K% a, Z& g1 _7 p/ `E.E_NOTICE
/ j- W5 R6 ` U2 A: P" s ?
9 Z( e F& z* u: l3 s, K Q9 T' z: U- q; F* H
9.当需要比较一个常量和一个变量时,如何才能保证不会错弄成赋值?
0 T% ?- x2 p" S7 W9 T: n8 B; h! a+ J1 b. g% Y8 J0 b
A.把变量转换成int
3 b. c7 |1 N8 A$ HB.使用全等比较符(===)$ k5 j4 T3 H' p& S8 B
C.确保常量是第一个操作数
$ I+ P) h( V0 HD.使用三元运算符, U2 |: a3 [( j$ H# n" p) ~
E.用括号把操作包起来! l4 Q; Y4 B) u, \" |
" k; c) w. L% D' }
8 r( Z% M6 E% D5 X, i10.要通过邮件给系统管理员发送错误信息,以下那种方法最简便?
Z: R5 ] X5 B: e+ [ g4 Q! O+ x. w) W& o1 f: G& _$ d
A.创建一个连接远程SMTP服务器的函数1 v! k: J- Z3 _; D( {+ f
B.使用mail函数
' m$ C4 A! }$ M" ?. |6 V6 q4 KC.使用error_log函数1 `/ j2 y+ h6 ]& Q* e. v+ {
D.调用sendmial程序/ q. C9 Q; ?. O/ N& I- i. K: K/ R; g
E.使用webservice$ S- e0 L9 N# `4 D5 c
4 v' H) M. M( j+ k" V4 I( \; O% ]# Q6 ~& l1 \5 b
11.能否仅调用一个函数就关闭脚本内所有的错误报告?
1 k& r( b# G8 K- d. C1 D2 {
( Z% _3 b7 E# z: A$ z$ ^A.能
) Q4 m( } P$ K# u c& q' fB.不能- P" z+ p/ G; |
, H! q0 p7 ^( V& K m
0 B: f A& @9 a3 m- U12.概要分析器(profiler)是做什么的?
$ `6 S2 q& F5 C: D1 E& w, G
9 w5 ^* c. F9 LA.创建关于脚本结构的档案
. [# ^- z& N$ X& N9 u0 m$ eB.把脚本转化成UML图
7 D& J3 [1 d) N) z; p5 M: cC.精确测算脚本不同部分的运行时间( |' | c/ w2 T3 Q
D.计算脚本通过web服务器执行时的维度
- s. F% Q/ N7 F( Y1 F/ OE.扫描脚本,识别由常见错误导致的bug3 Z- [+ ^4 h7 Y5 f# F
- y7 m7 m5 m1 @- n% R A. `6 y# d( V9 ~% m! ]2 ^$ N& c
13.______能帮助识别和解决bug。! @. X7 P! @5 ]' w* }- ^
) i! C) G2 k# [4 {) o答案:____________! W5 B- }* a5 A* ?5 h
2 S8 b. b6 f* K" f$ h+ `0 o; w0 m, @& T5 W# D
14.trigger_error()和user_error()有什么区别?/ S$ I0 j* s+ Y9 }- @6 ?
- ~* E+ b& y- W" TA.trigger_error()允许脚本抛出系统级的错误3 B! q8 L$ c. k
B.user_error()允许脚本抛出系统级的错误) L; H: r, y/ C, Z
C.user_error()不能被用在错误管理器中
+ S" E1 B: P) a9 rD.trigger_error只在PHP5中可用8 S2 }5 {" i1 f3 @
E.没有区别
/ H2 B' J! t- [
3 _. D( t. ^1 c* @, @, ]8 c8 G0 C9 O+ g5 e
15.______函数能返回脚本里任意行中调用的函数的名称。该函数同时还经常被用在调试中,用来判断错误是如何发生的。
7 S1 {% J$ Z+ g! W4 J" L6 Y A( F/ a6 Y
A.print_r
3 D) m' I: g) u( U ` ^% V3 B+ fB.var_dump
( h7 h$ Y* J% d1 l$ tC.stack_dump
0 I6 ?. U% S7 v0 qD.debug_backtrace
2 }: K5 n3 J1 F7 O4 sE.以上都不对
- T L! K$ p( W2 ` R' B% M/ D! N/ n- n: z8 k, Y
答案& F* O6 h$ { ~2 S& G
- Z4 @* f5 V, K" ]: x; ~1.答案是E。三元操作符把每个if语句连到一起,作为&&操作的一部分。然而本题中,$x=1这个赋值只在第三个if为false时发生。如果第一个和第二个条件都不成立,$x=1就不会执行。这题对三元操作的应用有些极端,实际应用时,需要根据可读性来决定是否需要用三元运算符(本题这种情况就最好不要用)。9 [+ z" y( I! F% \0 k5 C
7 O3 n, X9 t# N0 Y* E
2.问题是由第三方数据源传输缓慢导致的,而你无法控制这个数据源。你也许能在网络连通性上做些工作(假设问题出在你这一边)。还可以对接收到的内容进行缓存,这样能减少获取重复数据的时间。因此,答案是B和E。
# |6 P1 v+ s9 G5 J- o5 [- A# {. u1 ^) [% p( K1 I" e4 E
3.正确的选择是B和D。如果关闭错误报告、使用@抑错符和关闭错误日志,那么在你交付给客户的网站出现问题时,你将很难进行分析和调试。6 Q2 r2 ]) i9 {
% K* s( H2 q$ V5 S4 Y; E
4.这是在描述===操作符。; [" V. B9 H& ?, z% `8 s" O8 `
; b7 ^, ]% _. ?; b) u, I' [
5.正确答案是D。PHP脚本在执行时,将首先被解析成“中间”码(也叫opcode,操作码),然后解释器执行。操作码缓存出现在这两个步骤之间,对解析器的输出进行缓存。下次执行该脚本时,将缓存的输出直接送入解释器。这样就就不需要再解析一次了。6 G* V0 P& [3 ~. Y0 q3 E
* ?7 h' n% @$ T5 [7 l6.正确答案是A和D。如果RAM太小,进程间将出现资源竞争,服务器将大量使用硬盘交换。同样的,如果允许过多进程同时执行,也会使服务器频繁进行交换,导致速度下降。6 }. ^1 _! A! Q# P0 T) @2 x4 f
' ]; ^% [7 A& H
7.正确答案是A和C。脚本不检验datebase_query()的调用是否成功,因此将持续执行下去,最终产生错误。此外,$my_id参数没有转义——可能导致代码注入(详见第11章)。# N# N3 y! Q+ N& W2 p4 K
$ Z7 @& J# X) k8.答案B和D正确。出现解析错误往往表示脚本中有语法错误,自定义的错误管理器无法捕捉到它们的原因很明显:错误管理器在脚本里,而现在无法解析脚本,管理器也就无法执行。类似的,E_ERROR表示有致命的运行错误出现,比如内存耗尽。因此脚本会立刻被中断,因为解释器无法执行后面的代码。
- X M. y+ z- _+ U+ ` \3 b/ q$ W4 ]6 |, r% ]# z' t O' y* {
9.答案是C。比较操作是一个可交换的操作(就是说结果独立于操作数之外),而赋值不是。因此,比如说,$a==10和10==$a是等效的,而$a=10和10=$a却不是,而且后者会导致一个错误,因为这不是一个合法的操作。确保常量在操作符前面,能保证你不会错误得将比较变成赋值。% F/ ~4 W# g& M h6 d! t, D
+ j% ~& r$ {" _0 ]$ L2 G6 L( f10.答案是C。error_log函数能将信息送往一个指定的地址。尽管mail()也可以用,但error_log能自动给邮件添加标题,因此这才是最简单的方法。
& p$ A( b/ v) Z! f b* z" q$ |9 s$ o4 Q* r: O8 _0 j
11.答案是不能。error_reporting函数能关闭所有运行时的错误报告,但对解析时的错误无效,因为解析错误发生在脚本执行之前。, v' ~) p. J: R/ S2 j3 M
% D- T5 U+ ?) s& O
12.显然,答案是C。概要分析器(profiler)能监视脚本的运行,并记录单个部分的运行时间。它可以用来找出和解决瓶颈。" c0 G! Q) ^8 |6 S7 e
" Y' U3 v! @5 e/ d6 T4 R
13.这是对调试器的完美定义!你可以用调试软件监视脚本运行,同时分析系统资源消耗,从而发现和解决程序缺陷。
0 e- e1 i6 o, {( S$ a
* |7 n; B, B& I. o- r+ k% D14.trigger_error()和user_error()之间没有区别。后者其实是前者的别名。2 k3 o$ k% W+ W( Q( Q
N! c9 N+ Y. h$ p7 H' K15.答案是D。题目是在描述debug_backtrace函数,它返回一个由所有在代码的特定位置调用过的函数名组成的数组。 |
|