  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14197
- 金币
- 2389
- 威望
- 1647
- 贡献
- 1337
|
[Zend权威认证试题讲解]第十二章 -调试与性能管理
作为一个开发者,无论你经验多么丰富,或者无论你多么努力,你的程序中总会有bug。这是生命中一个必然的部分,如同死亡与缴税(尽管并没有后面两个那么严重)。* F; h& n) U3 D0 D6 L
要想解决bug,首先要能找到bug。事实上,许多开发者花费了无数小时茫然得盯着代码,只是因为他们没有把程序的容错能力摆在首位。忽略了这个部分,那么期望一个没有bug的程序就是——不可能的。
/ |. f) ]% ^/ P. _5 b7 N本章测试题将考察你对调试和性能管理相关知识的了解,以及如何用PHP做好这两件事。/ l- d) X& Z; e6 W3 K' T) V4 M
' t0 r# J8 {- K( k8 z* V/ }4 {; Q# X; D5 q$ O6 J1 J+ [
问题% t1 C( C/ j- v
& h+ R- T* w$ a- {+ V+ w9 h/ l# m) L
1.以下脚本如何用三元操作替代? 2 x/ G" M- X- A8 U
-
- <?php
- if ($a < 10) {
- if ($b > 11) {
- if ($c == 10 && $d != $c) {
- $x = 0;
- } else {
- $x = 1;
- }
- }
- }
- ?>
复制代码
# w, r8 M, k. j" P; bA.$x = ($a A. < 10 || $b > 11 || $c == 1 && $d != $c) ? 0 : 1;
2 ^: i. _4 i3 \) q$ mB.$x = ($a < 10 || $b > 11 || ($c == 1 && $d != $c)) ? 0 : 1;
: ?! p8 Q1 }) Y: vC.$x = (($a < 10 && $b > 11) || ($c == 1 && $d != $c)) ? 0 : 1;- y; }' _ @5 Y$ ^/ E$ R
D.$x = ($a < 10 && $b > 11 && $c == 1 && $d != $c) ? 1 : 0;# O3 K& g+ O; j- l9 T3 e( Q
E.以上都不对
) E2 e3 I5 F( N# `; _6 D6 M% |1 R j; g, x2 G. T6 Y; @
: R/ x; Q- W7 j
2.有一个脚本由于要从远程获取数据,因而运行速度很慢,以下那种方法能对其进行优化?(双选), r' e2 M: l' w! v9 c
( K; e9 x% U. z7 Z* u7 w- IA.安装操作码缓存(opcode cache)
/ }; C1 ^; p! a7 aB.优化或者升级你的网络连接
, F# ?8 f4 }" S8 C6 QC.添置更多的硬件
7 h0 c0 }# s) nD.增加服务器的可用RAM
% ~' T# t5 p5 \* k5 L# e! PE.使用连接缓存
% w( s, z+ e/ J% l
3 l1 X3 P# c( E* ^. Q* K3 A; I$ ?8 G: f7 o: n7 B
3.架设生产环境下的服务器时,需要做哪些步骤?(双选)+ k5 }1 e& _6 S" r
% X9 l: L7 o: I9 P1 j/ P
A.关闭错误报告
; c( O' Z$ S* c5 l' l; I& n4 FB.打开错误日志3 {* P. @+ W# y
C.关闭错误日志
$ n( H6 x# Y/ [; K$ i* Y* e- ?D.关闭错误显示
7 G B$ i# I( a! R4 v+ u+ ~E.使用@抑错符. w1 E) o, M* `6 l- f3 J) {6 M; v
' c! Z9 I4 _8 v5 s4 y
/ z0 ] c% u7 {% e) _7 s( f* J4.______操作符能对操作数的数据类型进行严格的比较?
" @2 ?4 w) S1 \! v) H5 E. p1 I
答案:____________
! R+ L+ V5 u- V3 t+ Q& m5 U% c
2 K& e# V7 g, d# m! {
) U; S4 g8 M5 z& Z7 K" M5.操作码缓存(opcode cache)能做什么?
/ G W' l& r/ B6 b# H5 i- U& x. U7 G- \3 j
A.把脚本编译成二进制对象,使它运行得更快4 c$ t/ k0 p; O3 J$ T
B.代替Zend引擎加快解释器的运行% S2 Y$ l$ m6 x4 k6 Z' @
C.缓存脚本输出以提高执行效率
9 D2 n) x0 ]5 ]3 A- v+ |2 vD.缓存解析器产生的中间码,以提高运行效率3 H: r5 ], F- m a+ u
E.在内存中缓存脚本,减少从硬盘中读取的次数
3 H7 U9 V+ A. t& ]; Z5 Z: ^3 [5 L* K! U
5 E' V% r7 X. ?* I9 y+ f
6.以下哪些情况容易造成系统资源枯竭?(双选)3 j0 J9 Q k- t! b, ?- @9 B
$ @" \3 h6 s1 D" ]1 b6 v2 |; F5 KA.RAM太小9 G$ _7 ]( R, z1 U! G# _) ~- F
B.使用了低带宽的连接
5 J6 D) k, V4 G+ \C.虚拟内存超过2GB) @6 k% h5 K9 E
D.允许同时运行太多的服务器进程& `- V- C* c$ q( c' G# z, }
E.以上都不对
2 C) o: P. q b) O3 o' U+ u. q' x, b" v4 s
* ~# w7 H9 _$ A# k! d7.以下脚本缺了些什么?(双选)
& H+ T9 B7 U3 ~% u5 o1 b-
- <?php
- $rs = database_query ("select * from mytable where id = " .
- $my_id);
- while ($a = database_get_data ($rs)) {
- var_dump ($a);
- }
- ?>
复制代码 5 V0 O6 B* @& {) G5 F
A.参数出口(Parameter escapement)
( Q& s! J/ x8 B: r. P( n, d FB.输出格式化7 f& p4 L/ d1 [! g8 S3 L
C.错误检查, j5 t1 R, q0 p* N V3 Z
D.一个SQL查询
# E1 H4 H" x- C0 h& X- T: D+ O, _E.以上都不对; H9 F# c# o1 F+ ^/ O0 X
4 l! P! w5 p2 S, @4 w! t; ~) C+ i/ p( {5 k
8.以下那种错误类型无法被自定义的错误处理器捕捉到?(双选)
0 z6 T6 v* [. n. z5 p8 y9 ]! G# D+ q
A.E_WARNING6 @/ @# U" D/ E) h* W% p
B.E_ERROR
! Z5 \! @8 q& N3 t5 uC.E_USER_ERROR
% m( K2 _/ t1 m( I( \D.E_PARSE
4 a3 m6 W! r! Q9 w. P1 J v0 X) \! vE.E_NOTICE/ r( f6 m. f; [: y4 a
. ^+ o( O8 m8 l. I* @0 d# K
5 R2 d& H' P) z8 R0 u7 x9.当需要比较一个常量和一个变量时,如何才能保证不会错弄成赋值?
" i6 q& x5 K' i) X3 r" i
8 _3 M* l# S9 n4 v& YA.把变量转换成int% {" d( O" a7 ]* o% y1 f& o; Y
B.使用全等比较符(===)
. T- z# w+ v% N9 B+ TC.确保常量是第一个操作数
$ b2 [! T( K% i7 N: \/ _' ^4 ]D.使用三元运算符
2 G& ^, J5 Y! X7 r- ?& K- FE.用括号把操作包起来9 W8 I( ^$ M( Z K8 X) G, z
9 i+ C% @4 l7 a: T! ?: u
3 W$ q! ~9 M- J/ }/ K: V$ `" H' S9 ]
10.要通过邮件给系统管理员发送错误信息,以下那种方法最简便?
6 A+ M F) t+ \2 x: `9 i2 ?5 N- G5 o# h2 o c
A.创建一个连接远程SMTP服务器的函数/ w- _! C* ?+ a' [7 }
B.使用mail函数! f" @+ T9 C3 n( S$ e
C.使用error_log函数
0 M7 c, J- E4 RD.调用sendmial程序5 b" o! }0 H2 z' l5 k% C5 H
E.使用webservice \0 U+ R' {7 V
! p! |6 a" s+ }* t: |# t
% m0 v7 z. R2 k. u c/ @
11.能否仅调用一个函数就关闭脚本内所有的错误报告?9 ~9 y/ D1 L% i9 T) D, b- W2 a
# U4 `& {8 G0 N3 f
A.能1 M% X. t3 ]/ E) k+ I1 I
B.不能% |9 x6 T5 e( P
* F! |. \0 x# K/ Z$ [$ m9 y
& g' T$ ^6 i) m4 Q' Y3 |12.概要分析器(profiler)是做什么的?# Q. k) q$ ]- a. a
) ^' P7 Q, l) C2 {A.创建关于脚本结构的档案
, E" `- n+ u' ]7 D, y+ U' y$ b! uB.把脚本转化成UML图
8 f c: s A+ m+ D* `: G; @C.精确测算脚本不同部分的运行时间! }& t8 ~/ f" E1 O" o1 z, _; ~
D.计算脚本通过web服务器执行时的维度
( r8 P( X+ R& s' H! {E.扫描脚本,识别由常见错误导致的bug& }/ l, S) k) e9 g# o
6 Q9 a4 d8 J! V& I* x- D( J! W9 @$ A; T- q& n( I+ M2 @. F
13.______能帮助识别和解决bug。/ E4 R9 L1 ]% E" I
7 e v- }+ `! E% X答案:____________
0 T& O6 n0 W( j+ K3 ?* h# Z3 ~
4 P. m/ y- C" K; x# M/ {8 A6 [+ m% U" F
14.trigger_error()和user_error()有什么区别?: Z) o- W9 K# U5 _2 I
0 ^8 m0 E, e) |; t4 j5 jA.trigger_error()允许脚本抛出系统级的错误
0 Z0 S6 M+ Q4 Z. E! B5 |B.user_error()允许脚本抛出系统级的错误
, L: k9 ~/ h2 Y* jC.user_error()不能被用在错误管理器中
* e8 r6 _7 j/ ?* P: Y7 ID.trigger_error只在PHP5中可用7 Y1 n/ V9 S; e, r1 v, m ~! ], s
E.没有区别: t G% n& j" [1 X9 e! X' C
* B7 y! W/ s/ g" L3 L! `5 H
7 E( S3 A6 n- V" W
15.______函数能返回脚本里任意行中调用的函数的名称。该函数同时还经常被用在调试中,用来判断错误是如何发生的。. g5 F' h8 u( a _8 l# O6 @& I- D
; c3 f( j& L A: G3 e4 { {& ?
A.print_r+ {" s2 m" W/ y+ }: g" f. x
B.var_dump2 b- v3 M1 d! z" { u/ g% v5 e- s3 h5 D& C
C.stack_dump, o$ [' r9 d6 m* Y/ h8 T
D.debug_backtrace
$ M6 G& @6 B% C6 m* @+ y' HE.以上都不对, p. m7 {; m9 G) C" z3 x
3 A4 D' J! M/ ~5 H% R
答案
j" o v) H' L3 d7 o- }
( C7 t0 L, \7 N/ R( l1.答案是E。三元操作符把每个if语句连到一起,作为&&操作的一部分。然而本题中,$x=1这个赋值只在第三个if为false时发生。如果第一个和第二个条件都不成立,$x=1就不会执行。这题对三元操作的应用有些极端,实际应用时,需要根据可读性来决定是否需要用三元运算符(本题这种情况就最好不要用)。9 O% h1 n* v8 C2 B* a
1 W3 d( \7 w, d% U- \7 V. Q2.问题是由第三方数据源传输缓慢导致的,而你无法控制这个数据源。你也许能在网络连通性上做些工作(假设问题出在你这一边)。还可以对接收到的内容进行缓存,这样能减少获取重复数据的时间。因此,答案是B和E。! T; J4 k8 `4 b9 @$ u0 k
7 n( m! ~" f0 @& H* [3 G# x
3.正确的选择是B和D。如果关闭错误报告、使用@抑错符和关闭错误日志,那么在你交付给客户的网站出现问题时,你将很难进行分析和调试。) s3 E! N* g3 b6 y6 ?; z
9 _) o, ? M0 T! v- B
4.这是在描述===操作符。3 W/ R9 U7 n' A- h- L6 P
; H' B( {( \; F' ^9 }- W3 G
5.正确答案是D。PHP脚本在执行时,将首先被解析成“中间”码(也叫opcode,操作码),然后解释器执行。操作码缓存出现在这两个步骤之间,对解析器的输出进行缓存。下次执行该脚本时,将缓存的输出直接送入解释器。这样就就不需要再解析一次了。. n9 \4 U% ^+ E+ s" g7 w9 I1 `5 \
- N7 M% T, W7 m
6.正确答案是A和D。如果RAM太小,进程间将出现资源竞争,服务器将大量使用硬盘交换。同样的,如果允许过多进程同时执行,也会使服务器频繁进行交换,导致速度下降。. l3 ?- \2 w( B) }- K
4 E' H0 B* l. h0 p; z9 T
7.正确答案是A和C。脚本不检验datebase_query()的调用是否成功,因此将持续执行下去,最终产生错误。此外,$my_id参数没有转义——可能导致代码注入(详见第11章)。
- S2 T+ o; w' v, C- a3 j# b) e% _8 _. j0 L+ ^4 ^" x7 ]
8.答案B和D正确。出现解析错误往往表示脚本中有语法错误,自定义的错误管理器无法捕捉到它们的原因很明显:错误管理器在脚本里,而现在无法解析脚本,管理器也就无法执行。类似的,E_ERROR表示有致命的运行错误出现,比如内存耗尽。因此脚本会立刻被中断,因为解释器无法执行后面的代码。 o9 L0 u9 l6 y6 a6 l7 O) O7 A& Y
/ W4 p) S x9 k6 M- S
9.答案是C。比较操作是一个可交换的操作(就是说结果独立于操作数之外),而赋值不是。因此,比如说,$a==10和10==$a是等效的,而$a=10和10=$a却不是,而且后者会导致一个错误,因为这不是一个合法的操作。确保常量在操作符前面,能保证你不会错误得将比较变成赋值。
* ?' g7 C" `4 W3 B: m. x
, j- ?: I' g9 u( P7 f10.答案是C。error_log函数能将信息送往一个指定的地址。尽管mail()也可以用,但error_log能自动给邮件添加标题,因此这才是最简单的方法。
7 N& Q7 G% N% P- M& a9 j8 c2 f
8 @! N( k) f- A5 a) M7 H11.答案是不能。error_reporting函数能关闭所有运行时的错误报告,但对解析时的错误无效,因为解析错误发生在脚本执行之前。+ G" A+ Y/ ~6 h) s5 N1 O2 \/ {
4 T( X: M4 \% d. x12.显然,答案是C。概要分析器(profiler)能监视脚本的运行,并记录单个部分的运行时间。它可以用来找出和解决瓶颈。# C! B- z' E# V# U, k6 A
& |% n) Q6 p! O: \% @7 y13.这是对调试器的完美定义!你可以用调试软件监视脚本运行,同时分析系统资源消耗,从而发现和解决程序缺陷。) S- H2 Q! Z( V' l) ~( n- u
, M* V! a( C' I( Z, e
14.trigger_error()和user_error()之间没有区别。后者其实是前者的别名。" F: W. u8 C/ v/ H7 E/ \; H6 X5 B
8 K& K9 v3 c7 A; l15.答案是D。题目是在描述debug_backtrace函数,它返回一个由所有在代码的特定位置调用过的函数名组成的数组。 |
|