  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14189
- 金币
- 2385
- 威望
- 1647
- 贡献
- 1333
|
[Zend权威认证试题讲解]第十二章 -调试与性能管理
作为一个开发者,无论你经验多么丰富,或者无论你多么努力,你的程序中总会有bug。这是生命中一个必然的部分,如同死亡与缴税(尽管并没有后面两个那么严重)。 L9 g! ~( U) s* B4 z
要想解决bug,首先要能找到bug。事实上,许多开发者花费了无数小时茫然得盯着代码,只是因为他们没有把程序的容错能力摆在首位。忽略了这个部分,那么期望一个没有bug的程序就是——不可能的。
+ ]# p) n1 v! Z本章测试题将考察你对调试和性能管理相关知识的了解,以及如何用PHP做好这两件事。
; `" f6 i" x5 ^6 ?; v. z+ z
% B9 @( W$ k& D) A3 E6 g/ Y; H+ H% V+ }$ ~
问题3 X# K! ? H8 x% Z( G
3 y r3 q/ b; t4 p. U% ~8 R
1.以下脚本如何用三元操作替代? * W% a _# v X
-
- <?php
- if ($a < 10) {
- if ($b > 11) {
- if ($c == 10 && $d != $c) {
- $x = 0;
- } else {
- $x = 1;
- }
- }
- }
- ?>
复制代码 ! m6 e" s4 E, E8 @8 ^1 S. M+ ~/ D
A.$x = ($a A. < 10 || $b > 11 || $c == 1 && $d != $c) ? 0 : 1;
0 n) t) J& J# y8 q, }9 e& p; \B.$x = ($a < 10 || $b > 11 || ($c == 1 && $d != $c)) ? 0 : 1;
8 O! J# P: p7 r" ]; [; z# _) a$ tC.$x = (($a < 10 && $b > 11) || ($c == 1 && $d != $c)) ? 0 : 1;; R1 f- e7 X5 Q! {7 {8 N/ }
D.$x = ($a < 10 && $b > 11 && $c == 1 && $d != $c) ? 1 : 0;
k4 M2 `& L D( \: O; ^E.以上都不对- p* E3 |1 X1 S! P1 h
, c' H( ^4 y8 e3 [
" W( c- Q6 Z5 p7 f& G2 \; q, N2.有一个脚本由于要从远程获取数据,因而运行速度很慢,以下那种方法能对其进行优化?(双选)1 O( \" `3 A5 f; S/ M
; Z1 m* M, e$ K1 b% CA.安装操作码缓存(opcode cache)
6 ~& w7 _( c& HB.优化或者升级你的网络连接 M7 n! U5 x0 U3 I7 z
C.添置更多的硬件8 `; W$ w) H4 d9 K( Y
D.增加服务器的可用RAM% A+ l) \( s9 ^9 B4 n/ B
E.使用连接缓存
) a3 T8 n2 s5 U$ o* P" t3 L! c& |- z; j& ]; H6 l2 |
+ o4 b# i" U/ R q
3.架设生产环境下的服务器时,需要做哪些步骤?(双选)
2 B5 b. M# ?3 F) c( ?/ S1 p. K+ W2 ^ G% Z: q
A.关闭错误报告
' j# x, x+ l" U) p2 [& aB.打开错误日志
! c* [2 q% q! Q! {+ H" kC.关闭错误日志
4 g: d. `8 n6 _) `' ]D.关闭错误显示
. k7 v' N+ L9 C5 J; T9 a" xE.使用@抑错符% K2 ~, J3 E! t! _+ y% R
" w+ @9 V; {) E( y8 B+ g
: h: l: I& L* x: c4.______操作符能对操作数的数据类型进行严格的比较?
6 h# p. ?0 M8 d6 }" f; y
$ O, e" E1 ]6 T# _& A5 r答案:____________
/ q8 D" q, k) F6 i, j
( f' e" i, x7 `: q% j: ]5 j$ x
$ `$ }* w7 h: s# } O: v6 R2 l5.操作码缓存(opcode cache)能做什么?
2 Z' A+ J6 j+ X) z% I g- c/ b0 r2 b A- R7 i
A.把脚本编译成二进制对象,使它运行得更快
+ |' b4 Q; E% e% T& S* ^) _B.代替Zend引擎加快解释器的运行8 }* g _* [1 f: v6 S, C
C.缓存脚本输出以提高执行效率0 c& J/ U9 q( A8 M0 V, R% B
D.缓存解析器产生的中间码,以提高运行效率
* D$ P; E8 S& p4 Y* W7 P; QE.在内存中缓存脚本,减少从硬盘中读取的次数
6 I2 K0 b. W* I1 g* V7 a5 Q9 J2 ^
4 Y( P% [; W" f; A+ a- m3 L' p+ V9 R O" |8 T7 h: |% V( X7 H
6.以下哪些情况容易造成系统资源枯竭?(双选)
7 |$ a- {2 T/ Y# ^4 g, m/ ?& X
5 A7 `5 Q' T/ k8 q- nA.RAM太小
% ^4 @: Q8 `6 x, S0 O' [3 jB.使用了低带宽的连接
7 z( w+ S7 Q+ m7 ?8 p, R1 M/ ^/ zC.虚拟内存超过2GB
8 U+ J7 v& o, r: XD.允许同时运行太多的服务器进程5 ?- w- g$ o; n: d: Y% m
E.以上都不对9 u1 A+ I8 U! K
; `# ~; E0 T2 v4 A/ D4 ]+ c. x1 N: ]0 _2 g: o5 B
7.以下脚本缺了些什么?(双选)
: `$ C+ e/ Y5 z" e3 W$ y1 a-
- <?php
- $rs = database_query ("select * from mytable where id = " .
- $my_id);
- while ($a = database_get_data ($rs)) {
- var_dump ($a);
- }
- ?>
复制代码 0 J) p: @2 a* a0 J ] T
A.参数出口(Parameter escapement)
" `. r9 x* b7 n6 JB.输出格式化( v5 u0 X- g3 j9 |1 u4 T) n! ^4 }5 ~
C.错误检查
3 m w5 M' F& r6 x, W: Q7 h# S: YD.一个SQL查询9 l1 O8 i- e: `
E.以上都不对
K3 x" \1 F& e$ p
5 k* X# [# n/ u1 }9 U9 N
* C& E% k* a# i7 s; I8.以下那种错误类型无法被自定义的错误处理器捕捉到?(双选)
/ d$ C2 S. j; W( ~5 Z
! V. ?! l8 I" s$ X9 Z( z9 t. p, iA.E_WARNING
" Q% R* J7 K0 [# q! B2 MB.E_ERROR% A# E4 I6 h$ j! u# l0 A* h
C.E_USER_ERROR' A9 G8 n4 B! T
D.E_PARSE
+ |5 P% P9 N/ J9 LE.E_NOTICE
9 ]4 \" G& I' ]& B* W& a4 h( v5 ~: F( f/ i7 j& L7 s5 ~
9 \* k6 ^ D" ^5 A' |! N
9.当需要比较一个常量和一个变量时,如何才能保证不会错弄成赋值?
# q' \ p: @0 N3 s8 p1 Y5 N& x+ ~9 Y. Y/ k7 V" {
A.把变量转换成int5 L; s7 r( g' I) C3 @, `' G: z% a$ Y
B.使用全等比较符(===). v" ]4 w7 J2 x# t- r$ h H+ K
C.确保常量是第一个操作数" C- }% M- }* N
D.使用三元运算符
/ k) H& I9 C( v' q- \" V- P; OE.用括号把操作包起来
/ B: I. s1 s) d8 H; r$ Y6 |" m N7 k$ q4 b) n+ a" f
" R/ X2 x: [) A, n. _10.要通过邮件给系统管理员发送错误信息,以下那种方法最简便?% @3 d+ f/ C" ^* j1 Q
0 d; R; {9 d1 N+ e' s n8 H
A.创建一个连接远程SMTP服务器的函数
+ `+ ~5 |. X9 EB.使用mail函数$ W# `7 L9 ?0 i+ E7 m# u
C.使用error_log函数. a6 ^- A4 V+ I0 k& @8 A. [ v
D.调用sendmial程序
3 @) \+ o% P6 g0 L: qE.使用webservice0 T; ~9 K7 Z/ @6 g
) r( n9 P. }6 U4 e/ I* M
! Q) ` y% E2 q* L. W$ W11.能否仅调用一个函数就关闭脚本内所有的错误报告?4 H, x1 W5 @' @0 u( |" m% z @
# p7 }% N8 P3 ~
A.能
' n Y) F3 ]7 h5 w1 _B.不能2 F$ S$ Q( R+ x, ?: C3 @& r
) p. K+ J4 ~ p, ?1 q
& j) a- E9 G; ?1 {6 X# Z' y8 X5 [
12.概要分析器(profiler)是做什么的?
. d4 y; T, r5 a5 _ e5 K+ {4 K- v+ ~
A.创建关于脚本结构的档案
" \! |' l3 w0 s F6 \$ v' P7 T4 cB.把脚本转化成UML图5 U' r/ C" Z8 x4 z* c
C.精确测算脚本不同部分的运行时间
% }7 _7 k+ i4 ]0 N* CD.计算脚本通过web服务器执行时的维度
4 E y' M8 j; O! YE.扫描脚本,识别由常见错误导致的bug
9 Y. C' a" k" [9 _
9 i1 d7 O- t& Y( s! ?; ?7 A0 b# q+ d9 B3 C9 t: y7 {
13.______能帮助识别和解决bug。
1 J4 w D( J8 c& ^) }: Z) J, o O5 \3 F7 O r- X% a; a$ H& Y+ R: n* ?
答案:____________) h9 t. d6 i; _' P- U7 @
& y0 o; M' M2 R1 a8 { Q" U. }5 q* o; R5 `: e7 n
14.trigger_error()和user_error()有什么区别?1 N. m0 p$ {' [+ b; x9 f7 e, ]7 |
% S6 [ o, M5 K: v' Z( ] f2 UA.trigger_error()允许脚本抛出系统级的错误
+ a6 P2 O4 d A: D5 Q+ pB.user_error()允许脚本抛出系统级的错误
5 a) W( Z- Y1 [; YC.user_error()不能被用在错误管理器中- E! d2 r( x" | D
D.trigger_error只在PHP5中可用% P( u7 r: ~7 G
E.没有区别# q9 O& X: i5 C* \% `4 e6 s; r
3 C0 b# {7 O; Z4 K3 l
$ \7 [* p- I% o# J2 s15.______函数能返回脚本里任意行中调用的函数的名称。该函数同时还经常被用在调试中,用来判断错误是如何发生的。
5 S' f* D+ ~: N4 G1 z8 F! c
& I" a/ `; c9 v5 e1 n' m/ VA.print_r$ x# F: o/ _; K+ h/ _
B.var_dump7 T) E0 X K: C! P* X8 y
C.stack_dump( Z# |, ^. a {4 N! f& ]6 f7 ^
D.debug_backtrace
3 f6 M- S3 W2 `; \7 aE.以上都不对
" P+ }8 J x- H( u) F
' s) z- V, J, A6 Y答案
6 i1 {$ ?0 O J# J! U! g( N# v& }
1.答案是E。三元操作符把每个if语句连到一起,作为&&操作的一部分。然而本题中,$x=1这个赋值只在第三个if为false时发生。如果第一个和第二个条件都不成立,$x=1就不会执行。这题对三元操作的应用有些极端,实际应用时,需要根据可读性来决定是否需要用三元运算符(本题这种情况就最好不要用)。
/ ^0 w( i5 B! }$ M& L7 P
. q" n0 N6 k8 g% ~1 N2.问题是由第三方数据源传输缓慢导致的,而你无法控制这个数据源。你也许能在网络连通性上做些工作(假设问题出在你这一边)。还可以对接收到的内容进行缓存,这样能减少获取重复数据的时间。因此,答案是B和E。/ Y& T" b- B* A
/ S! J. V z# D- w' N y- Q. C2 j
3.正确的选择是B和D。如果关闭错误报告、使用@抑错符和关闭错误日志,那么在你交付给客户的网站出现问题时,你将很难进行分析和调试。( l7 Q4 x. Z+ X0 O0 d
% z; M4 p$ W; Z3 b- O( z
4.这是在描述===操作符。
# y7 P9 p+ }$ y9 j6 w2 }& y: z
! s2 O) j; I+ o: h: w- k5.正确答案是D。PHP脚本在执行时,将首先被解析成“中间”码(也叫opcode,操作码),然后解释器执行。操作码缓存出现在这两个步骤之间,对解析器的输出进行缓存。下次执行该脚本时,将缓存的输出直接送入解释器。这样就就不需要再解析一次了。
" Q. x+ F! n' L4 D& V, f0 R
( e. p9 }3 B. W8 I" ~, _/ T: o6.正确答案是A和D。如果RAM太小,进程间将出现资源竞争,服务器将大量使用硬盘交换。同样的,如果允许过多进程同时执行,也会使服务器频繁进行交换,导致速度下降。" @7 W# h3 N7 a) x
) ]- B n; P- M/ k; S
7.正确答案是A和C。脚本不检验datebase_query()的调用是否成功,因此将持续执行下去,最终产生错误。此外,$my_id参数没有转义——可能导致代码注入(详见第11章)。5 w- c5 H9 U, Q/ \+ G+ ^4 q) [
. e d- |; g. R, r# I3 d, k, X8.答案B和D正确。出现解析错误往往表示脚本中有语法错误,自定义的错误管理器无法捕捉到它们的原因很明显:错误管理器在脚本里,而现在无法解析脚本,管理器也就无法执行。类似的,E_ERROR表示有致命的运行错误出现,比如内存耗尽。因此脚本会立刻被中断,因为解释器无法执行后面的代码。
! G2 z6 [9 W2 `8 O. P% l& A! P% p! X h2 r* \1 w
9.答案是C。比较操作是一个可交换的操作(就是说结果独立于操作数之外),而赋值不是。因此,比如说,$a==10和10==$a是等效的,而$a=10和10=$a却不是,而且后者会导致一个错误,因为这不是一个合法的操作。确保常量在操作符前面,能保证你不会错误得将比较变成赋值。9 l# C; N$ v, R7 F- _& H
9 Y# |( \! Y3 L9 j" |) d
10.答案是C。error_log函数能将信息送往一个指定的地址。尽管mail()也可以用,但error_log能自动给邮件添加标题,因此这才是最简单的方法。
, d+ `6 A* ]. J( H* ~! H [- X+ N3 D5 h" D- [ i, ]
11.答案是不能。error_reporting函数能关闭所有运行时的错误报告,但对解析时的错误无效,因为解析错误发生在脚本执行之前。4 k1 R' ~9 p( n# U2 j
. O- w4 O5 x3 @6 y8 }5 X A12.显然,答案是C。概要分析器(profiler)能监视脚本的运行,并记录单个部分的运行时间。它可以用来找出和解决瓶颈。5 d; Y, {. \5 ~
' I: G/ |( E+ V, ?" T/ R6 H
13.这是对调试器的完美定义!你可以用调试软件监视脚本运行,同时分析系统资源消耗,从而发现和解决程序缺陷。- l( ?* {% i' ~$ G
( h. p# h; D; R+ v" t/ n
14.trigger_error()和user_error()之间没有区别。后者其实是前者的别名。6 s, b k6 z. N( z: i5 _
! z& ~7 ?' n4 {3 b5 p
15.答案是D。题目是在描述debug_backtrace函数,它返回一个由所有在代码的特定位置调用过的函数名组成的数组。 |
|