  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14221
- 金币
- 2401
- 威望
- 1647
- 贡献
- 1349
|
[Zend权威认证试题讲解]第十二章 -调试与性能管理
作为一个开发者,无论你经验多么丰富,或者无论你多么努力,你的程序中总会有bug。这是生命中一个必然的部分,如同死亡与缴税(尽管并没有后面两个那么严重)。+ S$ T: P! ]9 ~( k) ] a x
要想解决bug,首先要能找到bug。事实上,许多开发者花费了无数小时茫然得盯着代码,只是因为他们没有把程序的容错能力摆在首位。忽略了这个部分,那么期望一个没有bug的程序就是——不可能的。8 u: X6 E; ?. b: G, a
本章测试题将考察你对调试和性能管理相关知识的了解,以及如何用PHP做好这两件事。4 r( m2 m2 l* `; H( U) V0 a9 t
% [9 p4 ]) m- d# h- i' L; {1 |( S: ~
# w8 h$ k! v6 ?% O3 N8 ~问题
: e$ ?% b1 \, L5 n' x% ^( p" Q4 K( m9 I5 W8 G2 n( D- b! y: E
1.以下脚本如何用三元操作替代? 8 n5 b/ g: ?$ D- |; y. c9 O
-
- <?php
- if ($a < 10) {
- if ($b > 11) {
- if ($c == 10 && $d != $c) {
- $x = 0;
- } else {
- $x = 1;
- }
- }
- }
- ?>
复制代码
P% Y0 G9 N+ B' c! YA.$x = ($a A. < 10 || $b > 11 || $c == 1 && $d != $c) ? 0 : 1;* t' y5 {# P- R. K3 }
B.$x = ($a < 10 || $b > 11 || ($c == 1 && $d != $c)) ? 0 : 1;
5 Y) @ e& S8 f6 \$ S9 j8 pC.$x = (($a < 10 && $b > 11) || ($c == 1 && $d != $c)) ? 0 : 1;( v) I1 o; T Z! }% X7 a
D.$x = ($a < 10 && $b > 11 && $c == 1 && $d != $c) ? 1 : 0;
: i7 d" L: G" F: j* N8 DE.以上都不对
' M; q2 H4 j" t% n7 o3 w0 c" `5 _9 e: E) d0 w
3 [; x' C% u! F8 ~; i) v4 L9 E2.有一个脚本由于要从远程获取数据,因而运行速度很慢,以下那种方法能对其进行优化?(双选); g; T1 O- |1 ^. J* t; [
) J4 @4 ]+ `" _- C0 Q. q3 a; kA.安装操作码缓存(opcode cache)4 b0 ]* O8 Q" o: {, O0 q
B.优化或者升级你的网络连接
, O! V8 p6 |6 m! aC.添置更多的硬件 R6 D( i0 a) p& g
D.增加服务器的可用RAM! L- R0 i s+ ]4 I
E.使用连接缓存& G9 C/ t# \; J. q9 {
* |1 d k8 p! N% V( ^3 s
$ x& T$ j2 a+ s) Q+ P3.架设生产环境下的服务器时,需要做哪些步骤?(双选)+ I8 q2 _ p8 P
, l9 Y. P# z& B8 g" T
A.关闭错误报告
0 b. E7 z6 \& h3 j' }: d9 H# ^B.打开错误日志
8 n" T" |5 W3 e- f& bC.关闭错误日志7 T$ B) W$ E3 Q% J/ b/ q% Z. @, k O
D.关闭错误显示
2 K$ t3 [$ D. QE.使用@抑错符
* O( O+ x9 n5 |: P5 U2 B4 `' Q6 W9 u. l( [$ y. ]: T [
: @2 s; N# Q8 w$ R+ N4.______操作符能对操作数的数据类型进行严格的比较?9 L8 I* v+ L, M, e+ @; Y- ~4 v
2 B8 t- {4 J. j2 ^8 ?/ T8 C答案:____________6 K) P) i" y/ ^$ c1 l5 W$ O
; ^' U8 U) U- s5 ~! `- M2 D; O
: y4 H8 z* w9 F
5.操作码缓存(opcode cache)能做什么?( o, ?6 A3 L' N, W( X
; s8 R9 D! D6 R \( F% g
A.把脚本编译成二进制对象,使它运行得更快7 p) o; W4 d. `3 J+ t! j2 r
B.代替Zend引擎加快解释器的运行 G) h) j' R: W4 v0 I8 H) h
C.缓存脚本输出以提高执行效率
6 l2 ?) X0 ]3 `8 j# {7 g# D+ S; TD.缓存解析器产生的中间码,以提高运行效率# O- U" r" d2 S
E.在内存中缓存脚本,减少从硬盘中读取的次数' F3 ]" g* }2 l2 d% ^% `% q. c
6 g+ H# a" n5 }/ q( }
! o4 p8 L' s7 {: E+ r# U6.以下哪些情况容易造成系统资源枯竭?(双选)
, j5 q1 ?3 B9 |# X* t
& a8 S5 N: l/ b" z/ M; M! y) fA.RAM太小0 `# i1 w3 p: P: j$ n9 }) c0 i7 _
B.使用了低带宽的连接7 d* C% Z" U# p& g+ ?& a( S3 F
C.虚拟内存超过2GB
/ D" t/ Z9 q1 a) k8 P) V+ _D.允许同时运行太多的服务器进程
4 r0 P0 M X' bE.以上都不对
* e% K6 p. `/ ^8 I0 i, I! i- C! |# G7 G
; F$ X9 ?, X& Y& @( j: F; Q7.以下脚本缺了些什么?(双选) $ o/ P& _3 H2 q# _+ s
-
- <?php
- $rs = database_query ("select * from mytable where id = " .
- $my_id);
- while ($a = database_get_data ($rs)) {
- var_dump ($a);
- }
- ?>
复制代码 5 `4 a/ r D# p G" h
A.参数出口(Parameter escapement)" `# Q3 D5 z8 o
B.输出格式化
9 P( {" `. |8 ~$ ~C.错误检查
' q( I6 g/ x( o6 l( _8 JD.一个SQL查询
/ ~* S; \0 d! q& gE.以上都不对( B% V/ X. |9 P! k1 o
1 W. M1 B$ V$ h) g( b9 X; [1 O2 v. [4 d3 |' h1 _
8.以下那种错误类型无法被自定义的错误处理器捕捉到?(双选)
/ M, c5 f. S. R% w- [ m3 h1 ]
! f- r6 j; \4 ]6 [# IA.E_WARNING) ?1 h8 p0 A% D
B.E_ERROR3 a( ?1 U- W6 K6 W4 E5 e$ m2 [
C.E_USER_ERROR
) F L& r) ?5 |, ^2 f/ v! H1 |+ [D.E_PARSE
" `: r0 i6 j# @) U( @E.E_NOTICE
( p( p8 E+ H! Y! T( w6 r) X1 I: p' F+ k$ R
3 K d+ U; ~, w! g) x8 w2 x: Z" L* R
9.当需要比较一个常量和一个变量时,如何才能保证不会错弄成赋值?0 \; `% V% i2 f! g: q9 A8 o1 H
) {! N. d/ H/ x, HA.把变量转换成int
! C+ h) L1 w' R( m3 Z! h3 a% lB.使用全等比较符(===)
4 e* {: s7 ~! L. R0 {9 xC.确保常量是第一个操作数, N. V/ w f* t: Z) y) R$ K
D.使用三元运算符
2 {5 v2 k) F9 `6 y% tE.用括号把操作包起来/ x0 `- F4 `& c5 d
/ K z" M$ h+ S8 j2 T# N% j2 ~7 z' n' g$ n6 N
10.要通过邮件给系统管理员发送错误信息,以下那种方法最简便?
: ]1 _1 e6 ~- C; ]
+ L0 v0 d& g0 KA.创建一个连接远程SMTP服务器的函数 F+ B3 ~( _ }
B.使用mail函数
6 O8 L. `3 m' C K6 d- H/ PC.使用error_log函数& y5 k: J0 v2 R5 b: f
D.调用sendmial程序
& {3 d0 \/ o2 H# q7 a5 EE.使用webservice3 J2 {5 H* _' C2 f2 C
; ]% A' i8 Y% X4 S8 x: ^
. l( O& D2 Q* D& }1 @1 h" r6 h$ B11.能否仅调用一个函数就关闭脚本内所有的错误报告?* B) @" @& @! T/ n
5 W1 v( r. w Z" d+ T& K. l# s" P F# PA.能
+ ]( b2 @6 [! g& zB.不能
& y/ j# f. Y) T0 G) {" F ?, N7 I9 m
; G6 y v2 D! e/ ?1 \3 |8 b+ j' ~2 C0 G6 P- i3 x
12.概要分析器(profiler)是做什么的?6 o( a# H0 _: t1 z0 V
" q: s8 b5 C% N3 }( i) `
A.创建关于脚本结构的档案
4 i- p D0 D& f8 G1 U1 F9 OB.把脚本转化成UML图, N6 Z) a% S& p7 @6 d- X
C.精确测算脚本不同部分的运行时间' \7 i1 M! O7 g6 ~" L. @
D.计算脚本通过web服务器执行时的维度
; T: M: c2 g3 d) b EE.扫描脚本,识别由常见错误导致的bug, z7 d' E! D7 j1 u4 b! l
2 y. C& ~, w% O# N: q1 F+ o* D: x" S/ i S2 q# D
13.______能帮助识别和解决bug。
7 T& O: N$ v4 x) o
* x: k- }4 [ }2 Y' [答案:____________
% }5 ?- Z; S4 i. ]4 \0 O' f5 H- P$ `6 K) C6 k
0 ?& i/ |4 j% a, s14.trigger_error()和user_error()有什么区别?, N, n) Y" d4 Y s# ~% J
% s' P: l9 v wA.trigger_error()允许脚本抛出系统级的错误
/ Y) K/ ^7 @3 m8 s4 h- o+ GB.user_error()允许脚本抛出系统级的错误) @6 w0 c) c u( y. c
C.user_error()不能被用在错误管理器中
6 d) `/ A9 T: p3 p' M, E0 SD.trigger_error只在PHP5中可用/ u) g+ }2 [3 q$ y% ] T. {4 s( B0 ?
E.没有区别
2 Z% F* P& h3 a. [ O# p/ B& E5 l8 A: g8 I& [: ^7 i1 g9 g
+ D' H# g- M/ }8 ?15.______函数能返回脚本里任意行中调用的函数的名称。该函数同时还经常被用在调试中,用来判断错误是如何发生的。
4 `0 Q5 a( f. d; e5 W0 f! ~% B$ d9 p* ^; A1 I6 f; u8 l' q
A.print_r
; q( z- ^- Y I' O3 B' J: xB.var_dump# l; F% c. K0 R# s( R6 w/ S; b" ?8 o
C.stack_dump
4 e" _" _2 A$ X0 }. V5 OD.debug_backtrace" y; b7 I0 X0 V7 q" I" b& H
E.以上都不对. y$ E. N2 O$ Z( D" c5 M; s p
) \$ V- Y. Q4 R5 C0 P答案
2 d @% t5 x2 H' A
( y% H8 c/ ~2 B0 C+ P! G D1.答案是E。三元操作符把每个if语句连到一起,作为&&操作的一部分。然而本题中,$x=1这个赋值只在第三个if为false时发生。如果第一个和第二个条件都不成立,$x=1就不会执行。这题对三元操作的应用有些极端,实际应用时,需要根据可读性来决定是否需要用三元运算符(本题这种情况就最好不要用)。7 P' S( i9 R( H0 U$ f5 _4 D5 @" v
& r$ f" S% h! e# m/ f2.问题是由第三方数据源传输缓慢导致的,而你无法控制这个数据源。你也许能在网络连通性上做些工作(假设问题出在你这一边)。还可以对接收到的内容进行缓存,这样能减少获取重复数据的时间。因此,答案是B和E。6 u: W6 h: J# i; l) S7 j
2 v& w' O$ _. c& s- }
3.正确的选择是B和D。如果关闭错误报告、使用@抑错符和关闭错误日志,那么在你交付给客户的网站出现问题时,你将很难进行分析和调试。, T4 h' o4 Q$ m, E" d( V0 v* J% `7 ?
/ e( e% H J# J4.这是在描述===操作符。
) N- L2 q2 n2 F2 L
- V% {, M8 L# ^' C5.正确答案是D。PHP脚本在执行时,将首先被解析成“中间”码(也叫opcode,操作码),然后解释器执行。操作码缓存出现在这两个步骤之间,对解析器的输出进行缓存。下次执行该脚本时,将缓存的输出直接送入解释器。这样就就不需要再解析一次了。5 ^% q: H/ ~/ A1 J5 k8 u+ i5 V8 X
: l4 w# V2 q$ W4 K+ U
6.正确答案是A和D。如果RAM太小,进程间将出现资源竞争,服务器将大量使用硬盘交换。同样的,如果允许过多进程同时执行,也会使服务器频繁进行交换,导致速度下降。( O5 i6 t6 k) }( |
$ \2 n% T$ C2 e6 _9 I" `: f1 s# h7.正确答案是A和C。脚本不检验datebase_query()的调用是否成功,因此将持续执行下去,最终产生错误。此外,$my_id参数没有转义——可能导致代码注入(详见第11章)。5 E) X: w3 o& @% F
/ M. t8 Z$ G& R- n) G) k; a: S
8.答案B和D正确。出现解析错误往往表示脚本中有语法错误,自定义的错误管理器无法捕捉到它们的原因很明显:错误管理器在脚本里,而现在无法解析脚本,管理器也就无法执行。类似的,E_ERROR表示有致命的运行错误出现,比如内存耗尽。因此脚本会立刻被中断,因为解释器无法执行后面的代码。0 S6 G' v. [4 f+ w1 l% n6 U
) n- V2 g1 p: d, g6 x. p
9.答案是C。比较操作是一个可交换的操作(就是说结果独立于操作数之外),而赋值不是。因此,比如说,$a==10和10==$a是等效的,而$a=10和10=$a却不是,而且后者会导致一个错误,因为这不是一个合法的操作。确保常量在操作符前面,能保证你不会错误得将比较变成赋值。
- G6 W" w( N W3 T. Z( L
: I) F# \( n1 v3 \2 Z- q& C1 x10.答案是C。error_log函数能将信息送往一个指定的地址。尽管mail()也可以用,但error_log能自动给邮件添加标题,因此这才是最简单的方法。: w/ [7 C8 b% y
8 I* ~! F- L3 c/ _, E4 m3 p+ w) N
11.答案是不能。error_reporting函数能关闭所有运行时的错误报告,但对解析时的错误无效,因为解析错误发生在脚本执行之前。- r3 ^/ u9 o8 q
$ `/ S9 Q, h3 @7 {' [" \- r12.显然,答案是C。概要分析器(profiler)能监视脚本的运行,并记录单个部分的运行时间。它可以用来找出和解决瓶颈。
, w& b' o( T- d) f; _2 \$ X
8 I% i) o+ h" d# q! _3 V13.这是对调试器的完美定义!你可以用调试软件监视脚本运行,同时分析系统资源消耗,从而发现和解决程序缺陷。
7 ? M# Q" V/ P# O
' Q% x% J8 ^7 P0 W* G/ |14.trigger_error()和user_error()之间没有区别。后者其实是前者的别名。
2 V* n0 R' m, l, r( k5 b
( o: b( w& {$ ?& E15.答案是D。题目是在描述debug_backtrace函数,它返回一个由所有在代码的特定位置调用过的函数名组成的数组。 |
|