|
  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14443
- 金币
- 2507
- 威望
- 1647
- 贡献
- 1455
|
[Zend权威认证试题讲解]第十二章 -调试与性能管理
作为一个开发者,无论你经验多么丰富,或者无论你多么努力,你的程序中总会有bug。这是生命中一个必然的部分,如同死亡与缴税(尽管并没有后面两个那么严重)。
5 B9 ^2 K/ i# _5 h {要想解决bug,首先要能找到bug。事实上,许多开发者花费了无数小时茫然得盯着代码,只是因为他们没有把程序的容错能力摆在首位。忽略了这个部分,那么期望一个没有bug的程序就是——不可能的。
& Y! X: [5 ?8 p J, r8 c本章测试题将考察你对调试和性能管理相关知识的了解,以及如何用PHP做好这两件事。
4 g+ y' c0 c* y6 u2 x3 t
6 a( S1 k. v7 K/ y# K) c$ V9 P& f7 A# p5 n" x( J; o& ^
问题3 H1 {" h2 e$ b
. {- j% D; f% h8 e, l0 `0 d
1.以下脚本如何用三元操作替代?
9 J& D Q+ m+ ^/ A% m ]2 h-
- <?php
- if ($a < 10) {
- if ($b > 11) {
- if ($c == 10 && $d != $c) {
- $x = 0;
- } else {
- $x = 1;
- }
- }
- }
- ?>
复制代码 " g5 e. }7 x) W* K
A.$x = ($a A. < 10 || $b > 11 || $c == 1 && $d != $c) ? 0 : 1;
c" L3 r1 m3 l; H% ^B.$x = ($a < 10 || $b > 11 || ($c == 1 && $d != $c)) ? 0 : 1;8 o3 R) O2 p* u" s8 u( U' P
C.$x = (($a < 10 && $b > 11) || ($c == 1 && $d != $c)) ? 0 : 1;9 I7 h5 G. I$ L) V. O' n' t6 |
D.$x = ($a < 10 && $b > 11 && $c == 1 && $d != $c) ? 1 : 0;7 Y: @/ \# H% ?: \* X8 I6 a
E.以上都不对
" W2 k! U6 c8 z/ s# b- q6 {1 u+ y
* d+ m/ m3 D# F$ i2.有一个脚本由于要从远程获取数据,因而运行速度很慢,以下那种方法能对其进行优化?(双选)
* `0 R3 h: S; f" o8 \% o6 Z$ C6 Y( P; ` ?* i2 f3 M- Y
A.安装操作码缓存(opcode cache)! p0 j7 n i# {7 C8 `: B2 T3 m1 U" w
B.优化或者升级你的网络连接
N/ a& U& r, ^! f# p, kC.添置更多的硬件3 R9 v! t% y1 C8 c
D.增加服务器的可用RAM
- K. p9 i/ I h" t% z! v4 HE.使用连接缓存5 `* a9 H) U- c
, x, j% h5 W% b! c9 J
; T2 y, Z( }' k3 o; I! E3.架设生产环境下的服务器时,需要做哪些步骤?(双选), y! B. P, p3 X2 ^- ^& v2 h8 q8 R
3 `( c2 p3 D2 f) T F
A.关闭错误报告( p9 Z9 E3 g( V8 Y* R$ d5 S) y. T
B.打开错误日志
1 C. }+ q) W1 Z! P. p* ?C.关闭错误日志- M, f" S) Y( L) ~1 i3 L4 @+ w
D.关闭错误显示! I# H5 r: u8 A0 Y6 } W- e
E.使用@抑错符
7 j8 a2 G4 Y6 h$ M' K1 }
# c4 J [- J9 R! T2 y' X$ G% [" H- f( m0 Y
4.______操作符能对操作数的数据类型进行严格的比较?$ D3 b- N* Q; J* O4 X
. L/ P# ]% ?$ T
答案:____________
/ W; S Q" Y5 G0 O( a+ A S0 Q( m" X$ P0 N
% W% e& G, Q! E1 N5.操作码缓存(opcode cache)能做什么?
/ u* @- R, ?7 _: U2 E/ J
: M* \) s y0 z% W3 CA.把脚本编译成二进制对象,使它运行得更快- r, c, ^$ G+ D' b9 T# \6 F/ I% s& H
B.代替Zend引擎加快解释器的运行
& |# |0 L9 M, R4 lC.缓存脚本输出以提高执行效率1 o+ _% ]. ~: j
D.缓存解析器产生的中间码,以提高运行效率
. n+ p" o: Q. V- S& {9 DE.在内存中缓存脚本,减少从硬盘中读取的次数2 d8 y4 p8 M% ^' E4 \
8 j6 T' G9 t$ K* r. y
7 z# O- S4 |/ c* O- }6.以下哪些情况容易造成系统资源枯竭?(双选)4 M5 [' L2 q* h q+ ~9 Q% m
- A' W2 ~" A( @) V' v7 v
A.RAM太小, R/ L$ d M* f5 k3 M! ]5 g
B.使用了低带宽的连接) w$ ]3 S: R7 g- \
C.虚拟内存超过2GB- }1 G2 Y& f, x1 X o
D.允许同时运行太多的服务器进程
. V9 y: Y6 T+ a3 @% D% RE.以上都不对
) p4 e6 Z4 l4 e: o" d e& r% D0 ^6 H, k2 v3 V
. R" ^0 k0 Q) B* F( K
7.以下脚本缺了些什么?(双选) ( u6 t2 W) @: R8 R
-
- <?php
- $rs = database_query ("select * from mytable where id = " .
- $my_id);
- while ($a = database_get_data ($rs)) {
- var_dump ($a);
- }
- ?>
复制代码
- s# [0 y8 V7 a2 C2 O5 WA.参数出口(Parameter escapement)2 K1 d) M, r& ~, r/ S
B.输出格式化
; H( T O/ o8 v* T% p7 h, gC.错误检查5 ]4 d6 J* S' j: @8 g
D.一个SQL查询! A& ~1 T. P! W+ t; r% r6 h
E.以上都不对
' Y' M* u: a7 D4 L# [, K" z5 [$ r9 q3 _ K6 Z+ X1 m
0 F6 o7 c! c/ ~# c
8.以下那种错误类型无法被自定义的错误处理器捕捉到?(双选)9 ^- O8 B1 \9 y8 V3 d1 A% x
7 [5 r& [% H( S' HA.E_WARNING8 [ O# n& b+ ?- Z/ t) T! ^+ D
B.E_ERROR |2 \+ V6 m7 [' t* B
C.E_USER_ERROR5 V, _( `2 s2 w/ ?
D.E_PARSE: p4 K+ u( z2 {) p+ h
E.E_NOTICE
0 I! U; c8 v$ `( P) ~' X' K. Y) ~4 h% p! o+ F. V& M: @
+ X7 ~. n; ]* C% @+ [$ Q
9.当需要比较一个常量和一个变量时,如何才能保证不会错弄成赋值?
8 W. x: |' G- e d* k0 F" ^6 _3 K& i" m: o& e* i9 o+ I
A.把变量转换成int
' y; y3 n& r, Q7 A: iB.使用全等比较符(===)" x5 D/ d' A# j! p, ~
C.确保常量是第一个操作数
1 ~: n/ N9 m* D! u8 }D.使用三元运算符; h) U! D, H1 p# {7 ^
E.用括号把操作包起来
3 c/ h, O# j9 X) y' D. W! `9 R8 {2 @/ A8 c! p
6 k; Q2 I1 ]& V4 v- G9 y$ U10.要通过邮件给系统管理员发送错误信息,以下那种方法最简便?
' ?' ^$ Y+ q# [- @6 ?3 F2 H# C" t0 m ]) O4 k; t* @+ b
A.创建一个连接远程SMTP服务器的函数
+ m2 w: k/ Y3 Y( E$ _B.使用mail函数& B0 h; \+ G8 R# l% b0 |
C.使用error_log函数
$ t' R; z a( ~5 M4 VD.调用sendmial程序
7 [7 C V0 I T7 @) P! ~& TE.使用webservice
8 E' z/ x9 g8 B5 d2 L ]; n' e4 M: G3 X
: @( e! p% @+ g3 k0 l( {! X
11.能否仅调用一个函数就关闭脚本内所有的错误报告?' T2 A: O9 ?; \% f/ o, Y
+ I4 o6 J( V3 P* X l* [- d& e
A.能) T+ L) V4 v' o; `2 I$ r
B.不能
! |+ ?7 j' w- m: y& s. @% ?1 i+ g/ d/ G! {+ X
, C- q; z. q6 t2 ?7 H5 c5 ~7 [ O! M12.概要分析器(profiler)是做什么的?0 X( b f3 ?9 i
! m3 Z' t7 s8 w5 H: Q9 r& A
A.创建关于脚本结构的档案
: w* u" ~1 N0 K- F; @$ BB.把脚本转化成UML图0 r, U0 C# n0 P, ?7 H7 w
C.精确测算脚本不同部分的运行时间
6 [ E3 \7 m. K9 VD.计算脚本通过web服务器执行时的维度. g, a" ?* N9 \; K& Y
E.扫描脚本,识别由常见错误导致的bug
/ {8 v: N u5 `! `% c
8 I6 v+ v2 u ?2 _* M$ ]: g* [; N* P, ~( x' @3 |- s
13.______能帮助识别和解决bug。
) a( c- L; f, q! g1 H. D: E9 g
) f+ T4 H# o& D+ b答案:____________
9 x3 d u4 y( J2 }
! r, f6 T( t8 K( V4 L% i, h
2 [1 u, P8 `/ i4 L) X# |( ?0 g9 D14.trigger_error()和user_error()有什么区别?% L) X1 W& j7 M4 |/ w
/ s. \! O* y F9 v
A.trigger_error()允许脚本抛出系统级的错误1 T% [* r1 Z& T" g6 E2 l1 m& q! M
B.user_error()允许脚本抛出系统级的错误
1 `0 H" x2 i2 m* }C.user_error()不能被用在错误管理器中, A- X- p7 A9 ?3 }9 [
D.trigger_error只在PHP5中可用4 I& q. n I! G+ C9 c
E.没有区别0 H/ {/ X* k5 A0 A: |
$ F ?1 L9 u4 V' B( {
) C( w6 _, y; \4 r/ e15.______函数能返回脚本里任意行中调用的函数的名称。该函数同时还经常被用在调试中,用来判断错误是如何发生的。
8 g6 t/ h/ R8 d! y( t- \ J5 [3 A9 w8 W5 v! U) }
A.print_r
1 \) F# m/ N# }5 P WB.var_dump5 A2 ? W5 r$ C! \4 x% ^' x0 e* j
C.stack_dump
) Y: d5 X! ?9 D3 q2 O+ hD.debug_backtrace4 Q( w3 N" J1 A0 q- l q
E.以上都不对) s% P9 U% j1 R" h
7 o5 a5 O S& L答案
+ | k D9 h6 x. Q9 L
8 v# H; z: A/ R8 N) B1.答案是E。三元操作符把每个if语句连到一起,作为&&操作的一部分。然而本题中,$x=1这个赋值只在第三个if为false时发生。如果第一个和第二个条件都不成立,$x=1就不会执行。这题对三元操作的应用有些极端,实际应用时,需要根据可读性来决定是否需要用三元运算符(本题这种情况就最好不要用)。( P2 \4 z$ ^6 E9 A- [ ]2 \ j2 W% k
% d" f" q1 [: n1 N2 k. E
2.问题是由第三方数据源传输缓慢导致的,而你无法控制这个数据源。你也许能在网络连通性上做些工作(假设问题出在你这一边)。还可以对接收到的内容进行缓存,这样能减少获取重复数据的时间。因此,答案是B和E。1 `" ^' ^# h+ V' x/ |) j! G
3 o x( v- i' d# W8 s/ m$ U3.正确的选择是B和D。如果关闭错误报告、使用@抑错符和关闭错误日志,那么在你交付给客户的网站出现问题时,你将很难进行分析和调试。6 N0 A1 ^/ ]; m, G: `+ l( @
9 t; a% s+ J" e2 J4.这是在描述===操作符。
$ r: `. S& o6 |$ V, R/ F9 n1 @- z% |3 p
5.正确答案是D。PHP脚本在执行时,将首先被解析成“中间”码(也叫opcode,操作码),然后解释器执行。操作码缓存出现在这两个步骤之间,对解析器的输出进行缓存。下次执行该脚本时,将缓存的输出直接送入解释器。这样就就不需要再解析一次了。: K* T! G) k& I1 L, {6 R* D
+ v% z5 s a5 O1 ]. u# V0 y6.正确答案是A和D。如果RAM太小,进程间将出现资源竞争,服务器将大量使用硬盘交换。同样的,如果允许过多进程同时执行,也会使服务器频繁进行交换,导致速度下降。9 P/ |1 Z( {- {+ n. I
, J# d1 s$ b& U9 r! c7.正确答案是A和C。脚本不检验datebase_query()的调用是否成功,因此将持续执行下去,最终产生错误。此外,$my_id参数没有转义——可能导致代码注入(详见第11章)。/ T5 [2 Z* c' v7 |# D: u
9 e8 t9 a* ^1 ?4 o7 P& E4 U
8.答案B和D正确。出现解析错误往往表示脚本中有语法错误,自定义的错误管理器无法捕捉到它们的原因很明显:错误管理器在脚本里,而现在无法解析脚本,管理器也就无法执行。类似的,E_ERROR表示有致命的运行错误出现,比如内存耗尽。因此脚本会立刻被中断,因为解释器无法执行后面的代码。
% S8 h) }: q& x. I' W# Z( d) s3 u- m3 w$ ?
9.答案是C。比较操作是一个可交换的操作(就是说结果独立于操作数之外),而赋值不是。因此,比如说,$a==10和10==$a是等效的,而$a=10和10=$a却不是,而且后者会导致一个错误,因为这不是一个合法的操作。确保常量在操作符前面,能保证你不会错误得将比较变成赋值。
$ x. p1 x# h" q& m" Z9 k1 J, |; t) \- U3 W3 l
10.答案是C。error_log函数能将信息送往一个指定的地址。尽管mail()也可以用,但error_log能自动给邮件添加标题,因此这才是最简单的方法。
: r/ f2 n1 B( Y# c p4 \3 Q5 f8 u! @: q. h& j- w3 O
11.答案是不能。error_reporting函数能关闭所有运行时的错误报告,但对解析时的错误无效,因为解析错误发生在脚本执行之前。- \0 X" \& u5 g& Y; Z. a
0 [9 i: S% [1 S$ |7 v c
12.显然,答案是C。概要分析器(profiler)能监视脚本的运行,并记录单个部分的运行时间。它可以用来找出和解决瓶颈。
& i3 [: l9 P* w9 n- v8 Z$ K4 n1 q! J7 J6 C
13.这是对调试器的完美定义!你可以用调试软件监视脚本运行,同时分析系统资源消耗,从而发现和解决程序缺陷。
% Y3 B3 h7 f( m5 g2 ~
( e) r0 C* b* D8 O' ]14.trigger_error()和user_error()之间没有区别。后者其实是前者的别名。
A, @$ e, l s4 ?. Z l6 e' ~- p, V% J5 h& a* i* U
15.答案是D。题目是在描述debug_backtrace函数,它返回一个由所有在代码的特定位置调用过的函数名组成的数组。 |
|