|
  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14443
- 金币
- 2507
- 威望
- 1647
- 贡献
- 1455
|
[Zend权威认证试题讲解]第十二章 -调试与性能管理
作为一个开发者,无论你经验多么丰富,或者无论你多么努力,你的程序中总会有bug。这是生命中一个必然的部分,如同死亡与缴税(尽管并没有后面两个那么严重)。 V A* q) G5 `3 V7 t
要想解决bug,首先要能找到bug。事实上,许多开发者花费了无数小时茫然得盯着代码,只是因为他们没有把程序的容错能力摆在首位。忽略了这个部分,那么期望一个没有bug的程序就是——不可能的。
7 F" i8 c; U) ?- K. [3 r9 i本章测试题将考察你对调试和性能管理相关知识的了解,以及如何用PHP做好这两件事。/ Y$ m: a) q" Y1 P" e9 o; [, P! `. f
( n0 q8 ]. v# u6 C8 W8 y2 V5 F4 o5 }/ o; E1 G( d% {
问题
+ ^! ~3 {, T3 H$ o# I: b0 i5 a# K; B& w! g( d* b, V6 ~
1.以下脚本如何用三元操作替代? 7 I* \! B0 j O0 V5 S8 _! |' v
-
- <?php
- if ($a < 10) {
- if ($b > 11) {
- if ($c == 10 && $d != $c) {
- $x = 0;
- } else {
- $x = 1;
- }
- }
- }
- ?>
复制代码
, w& f: V" N; a9 AA.$x = ($a A. < 10 || $b > 11 || $c == 1 && $d != $c) ? 0 : 1;4 h' N6 h0 n/ ~
B.$x = ($a < 10 || $b > 11 || ($c == 1 && $d != $c)) ? 0 : 1;
% }5 S/ g7 J5 @/ jC.$x = (($a < 10 && $b > 11) || ($c == 1 && $d != $c)) ? 0 : 1;
7 t& \' p! ]; z5 Q# }1 rD.$x = ($a < 10 && $b > 11 && $c == 1 && $d != $c) ? 1 : 0;
h+ ]) E; ^ P9 b. d' nE.以上都不对7 ]9 j- V5 v" e+ J! {0 P) o
3 c. |; O: ]: m+ `! q
% K' a* V2 ^1 I6 g4 @' M2.有一个脚本由于要从远程获取数据,因而运行速度很慢,以下那种方法能对其进行优化?(双选)' x2 p& {: S7 ]* r, O% |0 ^" `
8 R y+ t( a. K5 z
A.安装操作码缓存(opcode cache)- i3 C `6 P" e9 Y4 r5 U. O
B.优化或者升级你的网络连接" k: x* @# T) V% p& f( r
C.添置更多的硬件) [6 Z( d: v; k+ \; ? Q
D.增加服务器的可用RAM
1 U+ E5 M5 M ZE.使用连接缓存& D1 b: ~+ `5 A6 a8 e0 a
' b8 W! X# x) z
: Y. L5 d: h1 n. K* V, A- o* @3.架设生产环境下的服务器时,需要做哪些步骤?(双选)
6 o; @4 t; h9 F, a" ~8 R( ?; P5 b5 t# u! g8 A& M9 g; y6 ~9 H
A.关闭错误报告 P( F. B7 Y) e, }
B.打开错误日志: {- B# |6 \" q
C.关闭错误日志4 s! Z3 L- S. T
D.关闭错误显示
' L- d6 H. r3 \- G; @" Q9 }( Z# ^E.使用@抑错符! |( W, ^' c# G* l) f# |5 D% ]( W% n* K
7 V1 l5 U) |5 B
$ t5 u0 }% F( ]; R6 Y! v4.______操作符能对操作数的数据类型进行严格的比较?" E; k" r8 }, H/ X
! a0 q! K N6 I3 c! r( Z( S答案:____________
7 O4 G" T; E' Z9 R# V0 u. a6 ]( H: S5 N5 q! @9 g
! U5 Q5 Q( u% w- A' ^2 E* W X
5.操作码缓存(opcode cache)能做什么?
N* `2 v- r; j4 L& D* R; k, w2 F+ y3 ~7 S$ f% ]! C- Q r
A.把脚本编译成二进制对象,使它运行得更快
3 J* w0 d6 l, X" L, Y# f# iB.代替Zend引擎加快解释器的运行$ z2 N( `# ]" G8 A D- x: w, G% ~
C.缓存脚本输出以提高执行效率3 u' `8 l' z! s2 E0 [8 l' |
D.缓存解析器产生的中间码,以提高运行效率' z0 n- O1 q- U9 o4 K4 [
E.在内存中缓存脚本,减少从硬盘中读取的次数
x$ ]0 U# c" }' G' y$ a7 C) M# m' O
/ i6 y4 u7 c8 M6 y8 s0 Z0 E& d
6.以下哪些情况容易造成系统资源枯竭?(双选)
/ Q3 _, m2 o. u9 i. ~# c- y, V& ?) T$ u1 z: q% R6 V
A.RAM太小* a& G0 O& {. ?! w) Q( G1 {! Z
B.使用了低带宽的连接
2 g; C) v: {" {! }1 A- x) BC.虚拟内存超过2GB
0 W' \% m+ o: Z. G9 P% g1 pD.允许同时运行太多的服务器进程3 l7 E, d& \* u4 S7 }# f) ~
E.以上都不对
5 R, y% y" \6 n7 P8 H+ H1 o! V/ r" Y1 E
3 Y. ~# ~' j7 S% z- \
7.以下脚本缺了些什么?(双选)
7 {6 u# r) e7 S# f8 j-
- <?php
- $rs = database_query ("select * from mytable where id = " .
- $my_id);
- while ($a = database_get_data ($rs)) {
- var_dump ($a);
- }
- ?>
复制代码
: }# o8 g$ F5 c# I5 K. `A.参数出口(Parameter escapement)( v/ v5 N. i8 A& G) ]
B.输出格式化
* @9 Q3 w; E/ @1 L: S2 HC.错误检查' Q5 W$ K* t8 C
D.一个SQL查询
( R1 G: M5 l% Q; R" Y+ r+ aE.以上都不对
+ a$ w, m% x2 i- s" i" h# z, c
; i$ b+ }& r; n( G% F5 c7 `8 @- M3 f2 T
8.以下那种错误类型无法被自定义的错误处理器捕捉到?(双选)
8 i, W" c/ v7 n- R' _/ x9 J2 _5 f4 g
A.E_WARNING1 f0 g$ D( @. w2 p$ W! X! `
B.E_ERROR0 Y' \" J0 ]5 x7 S8 a) ^$ t& Q$ f
C.E_USER_ERROR
& u- D9 E2 _: `. Z) PD.E_PARSE
8 z0 X( U$ C' W I. b; DE.E_NOTICE
" i: M+ z) { s' x% T
/ y; x- Y- | h* R0 r2 C" M3 u, O
2 C1 s4 ^: A; M/ Q) d) d" E9 b0 z9.当需要比较一个常量和一个变量时,如何才能保证不会错弄成赋值?9 ?+ i6 ]+ n! b- U
5 ?) b1 @& v; _. D+ |% TA.把变量转换成int
/ S+ b4 i: s# T; p+ t! M! @B.使用全等比较符(===)! K1 K5 c D' O
C.确保常量是第一个操作数, n: F& K0 M @% b$ r& O) q* C
D.使用三元运算符& D- \, F2 S3 S6 [
E.用括号把操作包起来
) s# S& s# I. b1 ^: K2 L) S
, s, }3 k( l4 ^7 c9 H9 u
2 i' E+ x2 {( Y0 \( C! z! \4 M# w5 b$ a10.要通过邮件给系统管理员发送错误信息,以下那种方法最简便?
, y7 V- I# x! L& R
/ L$ q6 W6 p' k7 bA.创建一个连接远程SMTP服务器的函数" a. X! C9 D2 l9 C% \4 q6 ^
B.使用mail函数
; L' p& r, O7 b- {6 f7 ?* tC.使用error_log函数2 d' l/ o/ f9 u( [: L: O$ |
D.调用sendmial程序7 x; W7 i+ P" f- ~- ~' }2 k+ s
E.使用webservice
. ~7 Z* |8 V/ D, ~$ g+ c5 ?% ]5 x! ~/ a% x7 Y7 E* o
! Q9 N& D5 K8 X0 r6 z5 d% l11.能否仅调用一个函数就关闭脚本内所有的错误报告?! Y3 H, H3 W0 D1 k1 e
0 T# B& L" F1 l: IA.能% a: e4 \: ` ], s
B.不能
/ y) h) F8 E) J9 q. @1 i
5 ]& Z9 W7 A' v! @- t! W6 u9 [! k4 G9 p7 ]9 Y% |
12.概要分析器(profiler)是做什么的?
- {6 v. f2 B+ N+ l. j) `( F" ]( K
A.创建关于脚本结构的档案4 a* Z" Z4 V* m. B
B.把脚本转化成UML图
& x+ N0 {; l0 D% d, Q KC.精确测算脚本不同部分的运行时间
9 H" X/ `# ]7 j, f$ ` JD.计算脚本通过web服务器执行时的维度, O! r# y9 y+ k* _1 Z
E.扫描脚本,识别由常见错误导致的bug8 m3 Q* }' H" z( m
$ B4 \1 v- x% w, p1 i+ Z
5 l7 w+ ]1 H* l) _% J# D) R13.______能帮助识别和解决bug。* Q# j7 n0 G0 {" j& I( x% h
* @! M# c i: o, E/ x答案:____________' v0 k, s# r% v( Q
. A3 v; H' N7 [/ S% T2 h
8 h- [. i$ T6 i5 I3 O5 {! i14.trigger_error()和user_error()有什么区别?+ L9 s" g5 y0 K9 z( f
/ J, K* p) W) @* H/ s6 n; s
A.trigger_error()允许脚本抛出系统级的错误1 B: u6 `) x8 O, J
B.user_error()允许脚本抛出系统级的错误
( f- @3 s; X6 @6 I4 `0 OC.user_error()不能被用在错误管理器中
3 h6 B0 D! I& q* {4 AD.trigger_error只在PHP5中可用; g2 |: Z2 @* t% E0 o+ z' r9 E
E.没有区别
' _% G5 V6 }4 I4 @' ~ @2 d
2 t8 b# g' e/ h- V3 R5 \: K; _0 v. Z8 V; H" H( u0 j6 O: C7 M# ?
15.______函数能返回脚本里任意行中调用的函数的名称。该函数同时还经常被用在调试中,用来判断错误是如何发生的。( p. ~9 R$ s# O6 ^# ]% _* t
/ M6 e! k0 g0 @
A.print_r0 D/ |3 P' G/ J" o
B.var_dump
3 I9 x, x4 Y+ M, ? G A% M I# L- w1 ?C.stack_dump! w8 W8 T( U( N6 Z, `
D.debug_backtrace
6 X% D8 h& V# j; B0 w- D4 kE.以上都不对0 Z/ e7 U \9 {) Z6 J- y& W% A$ x
+ i8 S- ?4 V1 n$ N答案
7 F. l/ z6 |* i P1 E
' P7 A P& s4 H; s: e3 H& `& ^1.答案是E。三元操作符把每个if语句连到一起,作为&&操作的一部分。然而本题中,$x=1这个赋值只在第三个if为false时发生。如果第一个和第二个条件都不成立,$x=1就不会执行。这题对三元操作的应用有些极端,实际应用时,需要根据可读性来决定是否需要用三元运算符(本题这种情况就最好不要用)。
7 V2 J8 t& z4 m
3 y H& u4 Y2 w1 ~$ x/ W* m2.问题是由第三方数据源传输缓慢导致的,而你无法控制这个数据源。你也许能在网络连通性上做些工作(假设问题出在你这一边)。还可以对接收到的内容进行缓存,这样能减少获取重复数据的时间。因此,答案是B和E。
2 V# O4 I! o5 m; J( W+ y! D( V& Y1 C
. A( a/ t; D2 @5 \' a# R3 }3.正确的选择是B和D。如果关闭错误报告、使用@抑错符和关闭错误日志,那么在你交付给客户的网站出现问题时,你将很难进行分析和调试。* ^- q" O* H6 b9 F
) \8 R* n2 S5 i& Z
4.这是在描述===操作符。2 F2 \6 @% `8 T3 x% _
( ?$ ~/ H# w: Y2 D6 E) M+ b
5.正确答案是D。PHP脚本在执行时,将首先被解析成“中间”码(也叫opcode,操作码),然后解释器执行。操作码缓存出现在这两个步骤之间,对解析器的输出进行缓存。下次执行该脚本时,将缓存的输出直接送入解释器。这样就就不需要再解析一次了。
* E% ^9 \6 m9 M
0 L9 \3 _1 Z- c6 Z; e; r: B6.正确答案是A和D。如果RAM太小,进程间将出现资源竞争,服务器将大量使用硬盘交换。同样的,如果允许过多进程同时执行,也会使服务器频繁进行交换,导致速度下降。
8 m1 I; N6 q6 T. e! a1 t$ c. y ~! x8 h7 L4 O7 v/ g1 r8 o
7.正确答案是A和C。脚本不检验datebase_query()的调用是否成功,因此将持续执行下去,最终产生错误。此外,$my_id参数没有转义——可能导致代码注入(详见第11章)。
/ X9 [2 r$ E" y: \, b+ R8 Q. X& F6 V2 t4 t7 [, O
8.答案B和D正确。出现解析错误往往表示脚本中有语法错误,自定义的错误管理器无法捕捉到它们的原因很明显:错误管理器在脚本里,而现在无法解析脚本,管理器也就无法执行。类似的,E_ERROR表示有致命的运行错误出现,比如内存耗尽。因此脚本会立刻被中断,因为解释器无法执行后面的代码。
7 j& R/ Y3 Y4 f
2 ^: L* i+ f! x' D; a& U9.答案是C。比较操作是一个可交换的操作(就是说结果独立于操作数之外),而赋值不是。因此,比如说,$a==10和10==$a是等效的,而$a=10和10=$a却不是,而且后者会导致一个错误,因为这不是一个合法的操作。确保常量在操作符前面,能保证你不会错误得将比较变成赋值。) v" W2 Q: b, N% L
7 y# ~# D$ w. ]! H+ D9 n10.答案是C。error_log函数能将信息送往一个指定的地址。尽管mail()也可以用,但error_log能自动给邮件添加标题,因此这才是最简单的方法。
3 e* Z5 A- S. [) i# D0 g8 w: u* {
9 P* [* \2 j- l! f- |, r11.答案是不能。error_reporting函数能关闭所有运行时的错误报告,但对解析时的错误无效,因为解析错误发生在脚本执行之前。
. F$ y* y8 J! x% V3 c4 E6 ~- Z0 f# ~% A2 s% x2 Z
12.显然,答案是C。概要分析器(profiler)能监视脚本的运行,并记录单个部分的运行时间。它可以用来找出和解决瓶颈。
8 N0 @2 \! U$ c0 d1 H! {& z6 j" _9 u7 Q7 ]* I7 v
13.这是对调试器的完美定义!你可以用调试软件监视脚本运行,同时分析系统资源消耗,从而发现和解决程序缺陷。
/ V; x3 V) V% @* e* G+ B H2 F4 Y; m, R
14.trigger_error()和user_error()之间没有区别。后者其实是前者的别名。
* y/ G3 ]3 i/ Q1 Q+ L) k+ U- m. Z% C* F; T0 X) N
15.答案是D。题目是在描述debug_backtrace函数,它返回一个由所有在代码的特定位置调用过的函数名组成的数组。 |
|