  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14247
- 金币
- 2414
- 威望
- 1647
- 贡献
- 1362
|
[Zend权威认证试题讲解]第十二章 -调试与性能管理
作为一个开发者,无论你经验多么丰富,或者无论你多么努力,你的程序中总会有bug。这是生命中一个必然的部分,如同死亡与缴税(尽管并没有后面两个那么严重)。' X$ C/ N% B0 ^6 ^
要想解决bug,首先要能找到bug。事实上,许多开发者花费了无数小时茫然得盯着代码,只是因为他们没有把程序的容错能力摆在首位。忽略了这个部分,那么期望一个没有bug的程序就是——不可能的。
) a6 D ]$ d, t) k7 I本章测试题将考察你对调试和性能管理相关知识的了解,以及如何用PHP做好这两件事。
$ X) M( W2 j7 M. s
$ h# ]- [1 b/ f) `" d- I, I8 d6 }1 Z# P r6 ^! |. x0 B$ T
问题
# Q1 T- l+ S4 X. G5 O
5 L/ ?/ e: ^7 J6 N1 v' }1.以下脚本如何用三元操作替代? + \/ g2 p, _4 u! [
-
- <?php
- if ($a < 10) {
- if ($b > 11) {
- if ($c == 10 && $d != $c) {
- $x = 0;
- } else {
- $x = 1;
- }
- }
- }
- ?>
复制代码 % y) Y3 G g" f$ `# E& e9 h0 ]
A.$x = ($a A. < 10 || $b > 11 || $c == 1 && $d != $c) ? 0 : 1;
: V5 |5 O% J% m6 d& nB.$x = ($a < 10 || $b > 11 || ($c == 1 && $d != $c)) ? 0 : 1;; S, M- H# P4 @, [9 k8 x; c
C.$x = (($a < 10 && $b > 11) || ($c == 1 && $d != $c)) ? 0 : 1;
# o! G% s3 u9 K3 O1 p) R9 F6 [D.$x = ($a < 10 && $b > 11 && $c == 1 && $d != $c) ? 1 : 0;6 F1 G D. E+ p8 J3 ?5 T+ r
E.以上都不对
; z3 \$ K/ [# V
6 Y9 y( z8 r9 W. `& R. o& i n8 `! ?9 l
2.有一个脚本由于要从远程获取数据,因而运行速度很慢,以下那种方法能对其进行优化?(双选)# y# [1 P2 F' p E
* }/ r5 v2 i" C7 @" L' YA.安装操作码缓存(opcode cache)2 Q# [+ \2 k# S3 S3 D
B.优化或者升级你的网络连接2 I v5 d* v$ Q; Q3 c
C.添置更多的硬件 U: A2 d" M& Y# q. K# q
D.增加服务器的可用RAM8 {- z# I& o0 Q! u: ^
E.使用连接缓存- g6 | b2 G+ z6 W
) m# C2 z* {& ^+ O* K6 a$ A
: {$ |+ z( Z8 K! u3.架设生产环境下的服务器时,需要做哪些步骤?(双选)
+ O9 l% Z5 O& b& X" p' a
: L, _0 W& @" ^+ P% Z+ pA.关闭错误报告
1 ^$ g; n3 x P- s% e- t3 jB.打开错误日志& k- j3 h% W, S( n( G; E$ |
C.关闭错误日志
8 k; j1 m! j' J+ u' fD.关闭错误显示
, I' [# U& Y% G8 _1 R% g0 }1 iE.使用@抑错符
( H7 F- F" y3 E
k* f# q- T+ ^6 h6 B/ g1 {, _3 R3 F& {
4.______操作符能对操作数的数据类型进行严格的比较?. n: a" d4 R) ]3 ?+ x) {( S
, U- M4 L- e' j5 t
答案:____________7 {8 l+ C4 f4 h: }" X/ N( |
# T$ W; x. N$ F$ n" F
w) ^% n& o; l
5.操作码缓存(opcode cache)能做什么?, R2 ~( d4 f5 F: N" T! o
% h8 B& b4 \/ J* w6 O( ~5 C, W# iA.把脚本编译成二进制对象,使它运行得更快
+ O+ b0 r: t; c; B8 vB.代替Zend引擎加快解释器的运行. l; t5 ^7 P2 W0 z
C.缓存脚本输出以提高执行效率8 Q8 a4 `4 N2 ~0 A
D.缓存解析器产生的中间码,以提高运行效率. _" _$ I: |; R6 t; c7 n8 j! m' n. v" j1 m
E.在内存中缓存脚本,减少从硬盘中读取的次数
8 A) c0 U% B- o3 h9 D
+ M) t9 u( }& @ S( a5 |6 l2 s: o6 o- }- ]- H+ H
6.以下哪些情况容易造成系统资源枯竭?(双选)
: v- A# O7 j; ~
5 h9 [7 t1 P8 i( @% O8 w* \A.RAM太小
6 |1 d1 b) L- P; OB.使用了低带宽的连接
3 r% Q, k2 ~ a% G4 O4 JC.虚拟内存超过2GB5 O4 k# B" T, E3 F! _4 J- C
D.允许同时运行太多的服务器进程# R* q( ?7 [$ d+ g, T3 [2 ? j
E.以上都不对) y) |; G: o' O/ M1 @
) m3 ] K5 p3 W5 j5 J2 w: p h |8 F- k% y. Z8 }! S+ E3 m
7.以下脚本缺了些什么?(双选)
# t& U b, s* m9 O8 i-
- <?php
- $rs = database_query ("select * from mytable where id = " .
- $my_id);
- while ($a = database_get_data ($rs)) {
- var_dump ($a);
- }
- ?>
复制代码
6 Q7 ^0 l+ F [& R. ~ [A.参数出口(Parameter escapement)
6 n6 d# H1 v# \6 |/ oB.输出格式化' |6 u5 G( K% V2 V
C.错误检查: L1 L: n* E9 h9 z
D.一个SQL查询
3 v7 @" X5 B! x jE.以上都不对: j9 a: l& d7 B' G+ Y
, S$ b( r9 K9 \' P! Z
$ ^* X5 t' Z% Y* ?- D4 j7 O) r
8.以下那种错误类型无法被自定义的错误处理器捕捉到?(双选)9 R" p' O9 U2 X) Q6 S& _/ @+ x$ O
8 f \& A. J5 O6 D$ }A.E_WARNING
6 J3 S6 R, Z/ \' ?$ [B.E_ERROR
# X3 J4 S3 r" o- GC.E_USER_ERROR
8 d/ b! a! V$ nD.E_PARSE: L! r g8 n- a3 i% H( X( u+ ]
E.E_NOTICE
+ p9 X" \1 |' Y- c" X1 y1 V8 l- i
6 R5 r. c" B0 B& \
& f7 A+ ~2 h! Z' [9.当需要比较一个常量和一个变量时,如何才能保证不会错弄成赋值?% k% @" e) u8 F- B1 q/ d7 i
0 P' y% A0 @8 l
A.把变量转换成int
$ l# D, |7 L$ e0 g; ]. d" Z* vB.使用全等比较符(===)
* T) S% s' G8 ^/ m% `C.确保常量是第一个操作数. G% M, e# ?; j$ Y( G
D.使用三元运算符
9 i' i& Y+ n6 `( IE.用括号把操作包起来
0 F- w6 h6 N( i+ F! _* A+ e% R
2 z4 }' Q' U1 D9 Y b6 Z, c9 ~# v+ b9 J% w8 E- _
10.要通过邮件给系统管理员发送错误信息,以下那种方法最简便?
' w- L" d$ ~' a# l1 z; s4 v, s' }6 P
A.创建一个连接远程SMTP服务器的函数" u/ k1 n6 {* i& ?( u) V, R
B.使用mail函数
; O+ l' F7 f" ` U" IC.使用error_log函数
4 W- O% Y5 L o4 zD.调用sendmial程序
' u R0 y- S/ n; {E.使用webservice
- w2 U: t* T+ [( x1 C$ m+ o! a* U# u4 f3 k* P3 W+ z* ~
1 Q3 _, X+ j4 G) A5 ]2 j11.能否仅调用一个函数就关闭脚本内所有的错误报告?6 H/ W! k+ C1 s' @+ d: W
K6 }5 S9 | W% w! j! H. PA.能1 ]# H$ X$ ~: K: Y) o. B; {& k
B.不能
; ?8 i/ r ]* ?5 l& M/ T2 R/ S3 Y
) K- k0 I/ c1 s e9 d+ ^12.概要分析器(profiler)是做什么的?1 N/ ^! @/ A o) J+ C5 S
+ v) A: ?5 S/ D i$ e( k5 xA.创建关于脚本结构的档案2 T- S l/ A$ Y5 h$ [: M" I% ^
B.把脚本转化成UML图
* v& c% Q7 n! \ j* JC.精确测算脚本不同部分的运行时间
$ Y3 e* e+ o+ I/ t3 n5 ~8 sD.计算脚本通过web服务器执行时的维度) Y$ E+ Y% \$ }/ W; s4 a- B2 f
E.扫描脚本,识别由常见错误导致的bug) j* _6 `. c& X1 a3 i- C
# d a0 {, K! W# y3 x8 [9 y2 _0 ^, D3 `& N0 o: q3 X
13.______能帮助识别和解决bug。+ J' a* e G' j( {
; R6 U. j3 q6 v' t% |
答案:____________0 a- u& j, m! D' K: d
# \5 X B& C+ i" w
& Z' ~, V- a' Q6 l; L0 Y8 t14.trigger_error()和user_error()有什么区别?* j- ?4 n4 ^: r
# w }2 x% h' J
A.trigger_error()允许脚本抛出系统级的错误
- c+ r/ R) }. z$ ~* G3 YB.user_error()允许脚本抛出系统级的错误6 \6 p" K) ^% ]: s
C.user_error()不能被用在错误管理器中
% @* V' x! ?* B) @D.trigger_error只在PHP5中可用8 I. W, W7 p; J. p
E.没有区别
* Z$ q3 W9 a+ M- T8 x( ~- j
) k- F2 \- u3 d; p" ?6 Z" S- v
, Q$ n* p9 n9 M& v1 X$ X15.______函数能返回脚本里任意行中调用的函数的名称。该函数同时还经常被用在调试中,用来判断错误是如何发生的。5 |: K! f2 B1 E/ A, b6 T2 t Y& U1 W
3 \" T: N# ]- ^/ i5 _
A.print_r
2 [/ k( J9 N5 c( m6 i# dB.var_dump/ D6 y4 R3 M; @* ]" R3 Z8 a
C.stack_dump8 N( ?; q, P7 r+ E
D.debug_backtrace3 n$ e$ O0 w7 X2 H
E.以上都不对
2 u, v3 J% C' y3 ^9 g* ^! R$ N- x
( D q2 l: }' m G4 O/ y6 o' F9 t答案6 O/ K6 b# J. q$ R9 g
4 T0 C" X) B8 X7 P
1.答案是E。三元操作符把每个if语句连到一起,作为&&操作的一部分。然而本题中,$x=1这个赋值只在第三个if为false时发生。如果第一个和第二个条件都不成立,$x=1就不会执行。这题对三元操作的应用有些极端,实际应用时,需要根据可读性来决定是否需要用三元运算符(本题这种情况就最好不要用)。8 S. Z( e W% F% o
9 r5 g! q( X- I* I! O# {, h4 p2.问题是由第三方数据源传输缓慢导致的,而你无法控制这个数据源。你也许能在网络连通性上做些工作(假设问题出在你这一边)。还可以对接收到的内容进行缓存,这样能减少获取重复数据的时间。因此,答案是B和E。4 f. p+ D, D% y$ l* H2 `6 K
$ |% \" U8 s$ n4 ~: T) y3.正确的选择是B和D。如果关闭错误报告、使用@抑错符和关闭错误日志,那么在你交付给客户的网站出现问题时,你将很难进行分析和调试。' X, m6 ~. d! x9 D
& j c& r1 w3 H7 n! ~, C1 T j4.这是在描述===操作符。
I+ y& I) u2 t3 y. v0 \$ k7 J% v3 G7 w- p, V/ \- S2 K& l
5.正确答案是D。PHP脚本在执行时,将首先被解析成“中间”码(也叫opcode,操作码),然后解释器执行。操作码缓存出现在这两个步骤之间,对解析器的输出进行缓存。下次执行该脚本时,将缓存的输出直接送入解释器。这样就就不需要再解析一次了。
/ R! l4 V7 `' Z( X0 o3 `
& S5 ]. F' u$ k( A# ^2 O6.正确答案是A和D。如果RAM太小,进程间将出现资源竞争,服务器将大量使用硬盘交换。同样的,如果允许过多进程同时执行,也会使服务器频繁进行交换,导致速度下降。& `* E% L" l+ r- |
6 s8 n" U* U5 g4 R7.正确答案是A和C。脚本不检验datebase_query()的调用是否成功,因此将持续执行下去,最终产生错误。此外,$my_id参数没有转义——可能导致代码注入(详见第11章)。
( M" y, D0 `( I
3 n0 J# ^+ g2 h- @8 Q3 y8.答案B和D正确。出现解析错误往往表示脚本中有语法错误,自定义的错误管理器无法捕捉到它们的原因很明显:错误管理器在脚本里,而现在无法解析脚本,管理器也就无法执行。类似的,E_ERROR表示有致命的运行错误出现,比如内存耗尽。因此脚本会立刻被中断,因为解释器无法执行后面的代码。( P: e) `; r8 n
0 Y7 F" k9 A2 o* Q9.答案是C。比较操作是一个可交换的操作(就是说结果独立于操作数之外),而赋值不是。因此,比如说,$a==10和10==$a是等效的,而$a=10和10=$a却不是,而且后者会导致一个错误,因为这不是一个合法的操作。确保常量在操作符前面,能保证你不会错误得将比较变成赋值。
, O4 \7 H2 f! N2 o4 }' U8 {9 n3 O3 d4 k$ G( b
10.答案是C。error_log函数能将信息送往一个指定的地址。尽管mail()也可以用,但error_log能自动给邮件添加标题,因此这才是最简单的方法。( ^: V$ R' X( }, g
( v4 \7 z7 f6 P+ a2 C/ ~5 W
11.答案是不能。error_reporting函数能关闭所有运行时的错误报告,但对解析时的错误无效,因为解析错误发生在脚本执行之前。
7 g3 m- f, \; s9 |: h( \" x. l* o" w( r' }- u+ G n0 O
12.显然,答案是C。概要分析器(profiler)能监视脚本的运行,并记录单个部分的运行时间。它可以用来找出和解决瓶颈。. F6 B1 R5 n# H# y7 b
S1 Q. p) Y- H3 H13.这是对调试器的完美定义!你可以用调试软件监视脚本运行,同时分析系统资源消耗,从而发现和解决程序缺陷。) E/ ^$ n [" m! t. R; `9 T
; m* Y o+ L) y% |6 T& t
14.trigger_error()和user_error()之间没有区别。后者其实是前者的别名。2 }( R3 k* P8 N
7 }7 ~- x( y6 ~* B
15.答案是D。题目是在描述debug_backtrace函数,它返回一个由所有在代码的特定位置调用过的函数名组成的数组。 |
|