|
  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14389
- 金币
- 2480
- 威望
- 1647
- 贡献
- 1428
|
[Zend权威认证试题讲解]第十二章 -调试与性能管理
作为一个开发者,无论你经验多么丰富,或者无论你多么努力,你的程序中总会有bug。这是生命中一个必然的部分,如同死亡与缴税(尽管并没有后面两个那么严重)。
4 t7 N6 e5 N3 J g9 Q要想解决bug,首先要能找到bug。事实上,许多开发者花费了无数小时茫然得盯着代码,只是因为他们没有把程序的容错能力摆在首位。忽略了这个部分,那么期望一个没有bug的程序就是——不可能的。9 S8 }7 G1 O+ w' _( u: o
本章测试题将考察你对调试和性能管理相关知识的了解,以及如何用PHP做好这两件事。
; Y$ _, y9 d/ e4 x
: e, G3 @1 a: o7 C- J8 s% M0 U
问题) f+ w& \- I0 h" ]
$ Y1 `2 N( @/ u' m3 H7 w1 Y1.以下脚本如何用三元操作替代?
6 b4 O2 ~ W* M$ V+ {-
- <?php
- if ($a < 10) {
- if ($b > 11) {
- if ($c == 10 && $d != $c) {
- $x = 0;
- } else {
- $x = 1;
- }
- }
- }
- ?>
复制代码
8 O; S, s5 l' i( y6 GA.$x = ($a A. < 10 || $b > 11 || $c == 1 && $d != $c) ? 0 : 1;# U& [. V- j* A1 W
B.$x = ($a < 10 || $b > 11 || ($c == 1 && $d != $c)) ? 0 : 1;
4 n7 v h+ x6 }/ |$ M. HC.$x = (($a < 10 && $b > 11) || ($c == 1 && $d != $c)) ? 0 : 1;* d0 D7 X/ _+ J1 ]- b
D.$x = ($a < 10 && $b > 11 && $c == 1 && $d != $c) ? 1 : 0;
9 N! o% o! o$ i" L" z" d% XE.以上都不对9 j p9 L# c' {+ b, E. S' k$ H8 W
3 Y, t. E$ K5 |) {' \. {8 `, x
3 ~: v5 R- w* N9 U' m- F/ G2.有一个脚本由于要从远程获取数据,因而运行速度很慢,以下那种方法能对其进行优化?(双选)- f1 y$ n& h( r4 O( Y4 i+ M
% L2 H1 W, \, }1 u+ M9 i) `A.安装操作码缓存(opcode cache)! {& k! I) x# w
B.优化或者升级你的网络连接- {! {1 e( k% X/ g8 s# B- L3 o3 h
C.添置更多的硬件
2 Y6 _% _) \. S; y3 ]4 C* ?D.增加服务器的可用RAM
. l$ [# J% ?# w( b- q$ eE.使用连接缓存) I' ]9 C: A0 A- D8 R, }
- N; d, `4 Z; c: r
. x% r/ W, v: P- z* i
3.架设生产环境下的服务器时,需要做哪些步骤?(双选)8 R- M4 m% Y# d1 N* [! U' M. _+ x
3 ?# i" h4 ?* j% [( e/ u
A.关闭错误报告
4 U+ }+ X4 C0 q/ IB.打开错误日志
2 ?' ?6 l4 |9 }7 w+ t2 hC.关闭错误日志# m. T* A/ L7 C; _5 S8 G
D.关闭错误显示: m+ k# o" l5 T* K% \4 T% i
E.使用@抑错符
/ P9 H+ a( [0 ]$ E3 [9 H# r2 l+ `! K
% r/ j/ ^; e7 U( i2 e1 ^/ p# d4.______操作符能对操作数的数据类型进行严格的比较?* k# n8 K) }' _4 l
; o( \1 w4 h& l: d: E3 E
答案:____________
0 L: [* ^# Q' \+ Z% j* R: l6 g# U& f! Y6 c, S( L! S2 Z7 \
9 p0 @2 A, |! g1 w5.操作码缓存(opcode cache)能做什么?2 D! G- w) J9 V2 a' m8 i* u
: V6 z' E. o+ y8 R }( m7 U
A.把脚本编译成二进制对象,使它运行得更快" N0 M2 p' @/ @; `
B.代替Zend引擎加快解释器的运行
) s' R0 \$ x2 J6 E* HC.缓存脚本输出以提高执行效率, m' C( F% I# p% L
D.缓存解析器产生的中间码,以提高运行效率: o* h; |& P; \0 D" c0 M" n
E.在内存中缓存脚本,减少从硬盘中读取的次数
" C4 N7 t7 |* q" v! Y6 l5 W( k. K* q; M1 b0 i
+ Q ^' I5 D) V; M0 w8 \8 {8 H
6.以下哪些情况容易造成系统资源枯竭?(双选)
; n1 R+ H8 o3 }# d- l' U Y: \5 O4 P8 \1 Y
A.RAM太小9 d; h" |% F& K8 `) G$ _$ t
B.使用了低带宽的连接
+ `1 h* N* P y/ B2 R' rC.虚拟内存超过2GB
* `4 A6 m4 R9 {$ U1 t. _D.允许同时运行太多的服务器进程8 g0 ^; Z1 o# @1 f# J* c2 k
E.以上都不对
) m7 z& e) G6 P
( I: M0 U- E( j- @. [$ U; z& g+ c; \( ^# p+ e+ b% Y n
7.以下脚本缺了些什么?(双选) / N- ^5 I7 {- x7 i. S& y4 F9 V. c
-
- <?php
- $rs = database_query ("select * from mytable where id = " .
- $my_id);
- while ($a = database_get_data ($rs)) {
- var_dump ($a);
- }
- ?>
复制代码
( j7 l! A# w/ X3 D2 _+ W1 DA.参数出口(Parameter escapement)
- _% w4 D a" d# q3 I0 _B.输出格式化, ]/ m& B8 j" B6 V
C.错误检查% D" N6 p8 z/ @- C! s2 O
D.一个SQL查询
" h3 v+ V4 L2 ~7 W' |( RE.以上都不对
9 m. v3 }" a$ Y6 L3 v1 f0 P$ |
0 \* A; x( K" Q, }. _, f' z: G/ q; y4 ?/ X' n( P
8.以下那种错误类型无法被自定义的错误处理器捕捉到?(双选)
* ~; c" H3 R; f' `2 q/ S- [5 B. U% w# T$ z- Y; x0 N M
A.E_WARNING+ D' U8 q" ~8 q
B.E_ERROR
1 f& w2 [8 }; V/ c7 EC.E_USER_ERROR* X o* l. h& f. H3 A
D.E_PARSE! t0 L+ i8 Q/ ^5 k. w1 b
E.E_NOTICE6 a% R _+ s3 X$ w5 w
; x/ k0 F4 L4 o+ \2 P4 r) C* X
" P. ~; i8 d% g6 I; k1 t! E9.当需要比较一个常量和一个变量时,如何才能保证不会错弄成赋值?
k4 e0 M( T' w9 _$ P s) V' L8 w, J' z- D0 c
A.把变量转换成int3 C/ ?7 z( c: V6 f$ ?2 K% J
B.使用全等比较符(===); |1 K4 p7 }4 {$ F6 A: H$ a5 G1 D1 @$ c
C.确保常量是第一个操作数
( ^9 ~& Z4 |5 x7 h& ^1 m! x, ^D.使用三元运算符
& a4 A# P- h' z' WE.用括号把操作包起来
2 x) @1 q* G9 S' v. }3 R4 \+ V: J0 ]
$ B N- N B' x; s2 v0 ~4 M. Q
8 c7 z* _: N; Q$ }% d1 k6 S- u10.要通过邮件给系统管理员发送错误信息,以下那种方法最简便?
# [# k% n( ]* X, x) p% h" T/ j. {. w( |
A.创建一个连接远程SMTP服务器的函数
4 J( i. L6 I: g( M: Y: QB.使用mail函数
2 I3 _+ k) D/ W7 FC.使用error_log函数7 Z0 K* o% k8 d3 s# c. D4 ]: G2 @
D.调用sendmial程序
% F: j- A& M: x# q/ tE.使用webservice
, H/ v: I- B& ^
) j3 p+ c- I0 _' t$ \
6 W( E( {7 P$ G/ u11.能否仅调用一个函数就关闭脚本内所有的错误报告?
0 P6 r( A- h. T; C: m% J, r% s& v( [2 n7 O R8 a
A.能) ^! y- e5 ^/ @) C0 K5 l
B.不能
# k J- o* f4 R6 c3 A/ ^ l: n2 C# e+ \5 m- R; S, O3 m
* o9 `) \) C+ y8 m# S9 y12.概要分析器(profiler)是做什么的?. \9 E0 x6 G2 m6 |5 x6 H2 x
. ?* w3 P9 p! X) N: {9 Z( IA.创建关于脚本结构的档案
+ I& s g. _# a2 i3 i; pB.把脚本转化成UML图
6 u/ x. l2 m% R* o! P& wC.精确测算脚本不同部分的运行时间
$ V% M6 B6 k3 y1 N# d& M9 AD.计算脚本通过web服务器执行时的维度% r" A5 d# k; e6 \/ h) R
E.扫描脚本,识别由常见错误导致的bug
' G8 s, m0 _" ?8 N$ P+ M% b+ r
- C% \4 |. G$ I2 s13.______能帮助识别和解决bug。
% r) t* k4 j0 [( J" k5 g! {! i: w2 J5 {# H
答案:____________
2 C I9 x/ f8 `4 c+ i; e( N, C8 t& p. K$ [& q6 z7 M3 W
3 O ]0 B2 q6 D! L! b
14.trigger_error()和user_error()有什么区别?
) }1 {: j/ g: r! |1 S! }; g& N# ^+ A( e
A.trigger_error()允许脚本抛出系统级的错误" e9 z4 Z+ b$ I3 c& C
B.user_error()允许脚本抛出系统级的错误5 K/ s1 v$ ~0 M/ A
C.user_error()不能被用在错误管理器中3 [/ G" q9 Q2 u( C9 D) a
D.trigger_error只在PHP5中可用
5 B" c" t9 z; ?4 A+ Z: ]E.没有区别
9 y7 ^: I: E# G" w$ ?8 D( _; D) ^4 L
+ n* G5 F1 t' ]; C4 B9 U7 V15.______函数能返回脚本里任意行中调用的函数的名称。该函数同时还经常被用在调试中,用来判断错误是如何发生的。
# [9 r; O8 B. ?: }# k0 j/ n6 `7 @) _: E; ^* S3 M1 o( A e" ~) N. c
A.print_r
# |+ i2 q7 f1 c qB.var_dump% k$ Y! _ e o" d- {. v# N- Q
C.stack_dump
$ p4 o: I. B! g: d. |( a, uD.debug_backtrace+ V7 W5 Z1 k9 _% A- G" a8 o
E.以上都不对
' B" e% P$ {) `; x$ ]: V, R: Q9 A _& K8 {
答案
) c1 [' {0 a0 ^5 Y x
3 |7 H9 h" h. t5 ]8 n# y1 B2 k1.答案是E。三元操作符把每个if语句连到一起,作为&&操作的一部分。然而本题中,$x=1这个赋值只在第三个if为false时发生。如果第一个和第二个条件都不成立,$x=1就不会执行。这题对三元操作的应用有些极端,实际应用时,需要根据可读性来决定是否需要用三元运算符(本题这种情况就最好不要用)。
* V2 L6 C3 o) o- X% R4 S* R6 V
1 U% u9 m9 J7 m. Z, M2 g2.问题是由第三方数据源传输缓慢导致的,而你无法控制这个数据源。你也许能在网络连通性上做些工作(假设问题出在你这一边)。还可以对接收到的内容进行缓存,这样能减少获取重复数据的时间。因此,答案是B和E。
) e0 O" T' A t7 {: d5 \3 Y$ r0 u
3.正确的选择是B和D。如果关闭错误报告、使用@抑错符和关闭错误日志,那么在你交付给客户的网站出现问题时,你将很难进行分析和调试。; _7 \) {8 _6 N% R# i3 S
0 O) j O! A! u% l. r
4.这是在描述===操作符。# L. \0 a* b! Q5 `! r- L
+ N" d' X- H. |) {5.正确答案是D。PHP脚本在执行时,将首先被解析成“中间”码(也叫opcode,操作码),然后解释器执行。操作码缓存出现在这两个步骤之间,对解析器的输出进行缓存。下次执行该脚本时,将缓存的输出直接送入解释器。这样就就不需要再解析一次了。' r1 A7 m1 W8 ~$ }/ T. x* Z6 s6 O
0 D1 v2 c k# [1 ~# R( h" K
6.正确答案是A和D。如果RAM太小,进程间将出现资源竞争,服务器将大量使用硬盘交换。同样的,如果允许过多进程同时执行,也会使服务器频繁进行交换,导致速度下降。
m1 w5 [: ?& v0 a
/ p* q. [5 ?- |& d( f; R4 I4 t7.正确答案是A和C。脚本不检验datebase_query()的调用是否成功,因此将持续执行下去,最终产生错误。此外,$my_id参数没有转义——可能导致代码注入(详见第11章)。! J! }; c9 I4 N% K
V" F. H. l9 F8 [/ m
8.答案B和D正确。出现解析错误往往表示脚本中有语法错误,自定义的错误管理器无法捕捉到它们的原因很明显:错误管理器在脚本里,而现在无法解析脚本,管理器也就无法执行。类似的,E_ERROR表示有致命的运行错误出现,比如内存耗尽。因此脚本会立刻被中断,因为解释器无法执行后面的代码。
; c5 ~# q! z) Y
0 B+ H+ b' d" {8 U& t Y9.答案是C。比较操作是一个可交换的操作(就是说结果独立于操作数之外),而赋值不是。因此,比如说,$a==10和10==$a是等效的,而$a=10和10=$a却不是,而且后者会导致一个错误,因为这不是一个合法的操作。确保常量在操作符前面,能保证你不会错误得将比较变成赋值。
2 C6 _) B# T2 ?- F. m) { a( T- R! o4 [' k7 d, H
10.答案是C。error_log函数能将信息送往一个指定的地址。尽管mail()也可以用,但error_log能自动给邮件添加标题,因此这才是最简单的方法。
1 |# [- R) i2 K% ~
2 K- i0 p4 V, {11.答案是不能。error_reporting函数能关闭所有运行时的错误报告,但对解析时的错误无效,因为解析错误发生在脚本执行之前。, O$ x/ `. H& C0 o2 `3 z g
+ ]) u* ]/ S4 Z) e8 t3 t8 [0 b) Z7 _$ g
12.显然,答案是C。概要分析器(profiler)能监视脚本的运行,并记录单个部分的运行时间。它可以用来找出和解决瓶颈。
0 z8 i" y5 \ t, _$ o+ W. ~- l }' f' Y I1 W: \0 T! u+ N" P( c5 L
13.这是对调试器的完美定义!你可以用调试软件监视脚本运行,同时分析系统资源消耗,从而发现和解决程序缺陷。. m' {! | P7 X% y [' U' p+ T
: e% Z% c4 D9 Q2 x14.trigger_error()和user_error()之间没有区别。后者其实是前者的别名。9 b; b* z L* p% u3 |
# N- U4 Q! O7 r U* |
15.答案是D。题目是在描述debug_backtrace函数,它返回一个由所有在代码的特定位置调用过的函数名组成的数组。 |
|