  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14219
- 金币
- 2400
- 威望
- 1647
- 贡献
- 1348
|
[Zend权威认证试题讲解]第十二章 -调试与性能管理
作为一个开发者,无论你经验多么丰富,或者无论你多么努力,你的程序中总会有bug。这是生命中一个必然的部分,如同死亡与缴税(尽管并没有后面两个那么严重)。7 P& X3 P" A8 v2 m6 x
要想解决bug,首先要能找到bug。事实上,许多开发者花费了无数小时茫然得盯着代码,只是因为他们没有把程序的容错能力摆在首位。忽略了这个部分,那么期望一个没有bug的程序就是——不可能的。
# r, y8 n, ~9 n% b1 Q$ m6 F) L2 X$ z本章测试题将考察你对调试和性能管理相关知识的了解,以及如何用PHP做好这两件事。
' |4 b6 a6 Q3 n/ }6 l' H8 j( x r4 B @
* L) y# z0 y q+ f
问题5 O; [" n# \& R- }% G
! `/ r* {. b& D7 U. D; B5 t0 \+ Y
1.以下脚本如何用三元操作替代? 8 r4 s5 E1 L7 z* Q8 T
-
- <?php
- if ($a < 10) {
- if ($b > 11) {
- if ($c == 10 && $d != $c) {
- $x = 0;
- } else {
- $x = 1;
- }
- }
- }
- ?>
复制代码
* H* u1 d: O; ]6 G2 vA.$x = ($a A. < 10 || $b > 11 || $c == 1 && $d != $c) ? 0 : 1;
7 ~% J& k% Z3 G. x$ _$ W: DB.$x = ($a < 10 || $b > 11 || ($c == 1 && $d != $c)) ? 0 : 1;0 L1 T0 a% Z8 k: E( n; v
C.$x = (($a < 10 && $b > 11) || ($c == 1 && $d != $c)) ? 0 : 1;
- w9 B1 e( Y9 x6 e+ D! \D.$x = ($a < 10 && $b > 11 && $c == 1 && $d != $c) ? 1 : 0;
A( g4 _: a1 f7 KE.以上都不对
$ S: w0 }% ^3 {! m3 v) Q$ C
7 Z) Y2 |$ `0 n( l g
$ r. s$ o! r9 i6 W& I9 E+ l1 v2.有一个脚本由于要从远程获取数据,因而运行速度很慢,以下那种方法能对其进行优化?(双选)
5 ?5 A1 Y% t, _# h. a3 d* h, {; G6 D3 g0 d7 F9 |% j. r
A.安装操作码缓存(opcode cache)0 Q0 z0 k- I+ m# D7 h V
B.优化或者升级你的网络连接
/ d& V! v4 M7 |% g( b0 C6 S2 n7 RC.添置更多的硬件
6 P6 Z8 [6 U5 b8 KD.增加服务器的可用RAM. D, d0 D8 y7 N
E.使用连接缓存" P. D7 f6 x0 h! H1 _
# U! r; p8 f: ]) S0 h
% `: M( H f5 w3 N+ b
3.架设生产环境下的服务器时,需要做哪些步骤?(双选)
" R% L6 {' K( D# x. H9 l+ X" t7 N" w4 d# f# M3 D% s7 }
A.关闭错误报告/ ^+ j1 s* d0 e, w% ~% ?' C w
B.打开错误日志* u1 v. |4 D5 f7 l/ t) } [
C.关闭错误日志
7 K3 ^+ v3 f1 XD.关闭错误显示
% K# k9 K: S; J" `& q: x9 tE.使用@抑错符1 Z5 O6 C* a' I( s0 {
; s2 d! K% P* T' C: q" p$ O
( u: T# r0 q4 k4.______操作符能对操作数的数据类型进行严格的比较?: I9 c) ]* v2 x
: d R- K: ~( T; U3 q% E) W* A
答案:____________: D- t6 q7 C) M# c9 @8 [% v
' w7 _& o! Q+ a0 ~
2 |. r& W, @" k. K6 [1 j8 ?) H, ~5.操作码缓存(opcode cache)能做什么?2 V- ?4 Y1 h% g6 _' J
( S2 q. V/ |/ N, P5 K+ N/ G. S9 E6 j
A.把脚本编译成二进制对象,使它运行得更快
& g( U! H& p% s6 \. }7 jB.代替Zend引擎加快解释器的运行1 s! e$ O: J1 }. ^0 L% o3 g$ @, a0 z
C.缓存脚本输出以提高执行效率# O8 j$ `! x% i' u! q3 a
D.缓存解析器产生的中间码,以提高运行效率
; C( X1 J0 T2 RE.在内存中缓存脚本,减少从硬盘中读取的次数8 {) F$ {( s) }% e4 w- B- X
" F- b2 A4 j" k: |- |
% E8 x8 k( k; J0 h
6.以下哪些情况容易造成系统资源枯竭?(双选)8 y# X, s$ ]9 y6 ]" l' t
- L3 N( w1 a, y' g( u, S4 rA.RAM太小& u; H3 J+ L/ O b9 \
B.使用了低带宽的连接
% h" ~: n6 R) j5 x& j8 WC.虚拟内存超过2GB
. k1 y7 l, V/ |- Z! v! pD.允许同时运行太多的服务器进程
& Y" K+ W6 d( h: S, ?+ s p: cE.以上都不对
1 @) X) H$ f' @0 o1 O: u+ y2 k
" Y4 Y: g3 y, \( j5 e
% Q/ O) O- R1 l* r% p4 d7.以下脚本缺了些什么?(双选)
P6 U; ?8 g0 I @( i8 e-
- <?php
- $rs = database_query ("select * from mytable where id = " .
- $my_id);
- while ($a = database_get_data ($rs)) {
- var_dump ($a);
- }
- ?>
复制代码 9 r" i; }" u( V9 ~
A.参数出口(Parameter escapement); B* K- ^& y) K
B.输出格式化, W1 P1 P2 S5 Z' W* n
C.错误检查/ x2 x# {! e& D! F' N
D.一个SQL查询
! {$ a9 X, Y3 o6 s/ fE.以上都不对1 a. @$ z9 ?9 s, s6 r
- q* ~; [: R: e! }
- l3 i L$ A0 J/ N% D7 @+ h8.以下那种错误类型无法被自定义的错误处理器捕捉到?(双选); W! G F8 y8 K& D+ {& o( E! s: V
0 p; O; _. Q. OA.E_WARNING* |0 B. B: q1 ]1 s; a
B.E_ERROR) Z$ @4 b. n% Y- N. F
C.E_USER_ERROR
: B5 J( c: o, x( v" q+ D' UD.E_PARSE7 z% X8 V1 b6 [6 W7 h, Z4 D
E.E_NOTICE9 Q* T5 f: c' _* Y) @
- @2 p0 |9 l4 E @
% q ]2 g+ b; A1 h/ J* [9.当需要比较一个常量和一个变量时,如何才能保证不会错弄成赋值?6 K: t0 @" t5 A
9 x4 D9 t: d* U' w# f6 b, v0 J- GA.把变量转换成int" v/ f# V' Q# r5 y# a
B.使用全等比较符(===)5 ~) C' M2 Z7 E
C.确保常量是第一个操作数& A$ h" j* \ f/ U/ W! n+ L- H/ p
D.使用三元运算符+ K! G8 e# ]9 i* q" ~. i
E.用括号把操作包起来
& O$ a/ C$ L& I- S% a; @3 E, w' Y. m$ j9 m+ r
. `) }5 G, m1 u7 g7 @
10.要通过邮件给系统管理员发送错误信息,以下那种方法最简便?
* J( B4 _' C! h; @5 H! E1 h* O9 a7 G( ?
A.创建一个连接远程SMTP服务器的函数
: T; ] P4 u7 d0 \' _2 b4 lB.使用mail函数
, F. U5 q! G) N+ Y/ i2 q1 h k0 yC.使用error_log函数
# ~' ]# V$ q+ P1 V) E+ oD.调用sendmial程序
- X! K; P8 w; |0 xE.使用webservice- O9 g& C1 r, W
0 Y! d; H1 ^6 x9 y0 l! e/ m) J
" c* m4 s b4 `' N2 {11.能否仅调用一个函数就关闭脚本内所有的错误报告?
1 J9 I L+ Y2 j/ @# t0 p u4 n5 d/ z5 C# ]7 C
A.能
% m1 \. q" k+ ]- X5 YB.不能" J0 N5 k) a5 R& w& b3 ?
: k7 n' _3 x$ I+ ~1 I( D& M
3 N( d9 f9 G( K% L
12.概要分析器(profiler)是做什么的?
( H- h& _. Z4 Q- U0 Z1 F7 v2 J: q+ v
A.创建关于脚本结构的档案
2 U S2 T5 ]) hB.把脚本转化成UML图4 f( Y5 M9 ~# Q' {9 k/ M7 n
C.精确测算脚本不同部分的运行时间7 }* E. w3 D2 U0 h) @
D.计算脚本通过web服务器执行时的维度* \# j. p9 a1 k$ P8 M
E.扫描脚本,识别由常见错误导致的bug
/ A2 }3 {. S3 u' i' P8 _1 L+ E: c8 L6 ?) {! _
' Q. W8 ?8 ^4 x: |% Y5 C
13.______能帮助识别和解决bug。
l- U7 E1 Z' C3 o9 I6 w E, C
; q O! y" c4 p答案:____________, T* E& ?; _6 L7 [2 |( G3 Z
; i# m5 `: w' M8 p( Q
8 K; O% E8 `4 x! \8 G14.trigger_error()和user_error()有什么区别?
2 M& z, d& R% T" u! g; Y8 b6 S) K: c
- M {# L, }& l0 iA.trigger_error()允许脚本抛出系统级的错误
N( M6 ]6 A' I! A6 RB.user_error()允许脚本抛出系统级的错误
p7 U. H& w: p: ^C.user_error()不能被用在错误管理器中
6 c# t* ?, p! b. j: s5 tD.trigger_error只在PHP5中可用
' e. d+ A) w+ ^. H5 Y, O, cE.没有区别
5 `! U, L- N0 U4 u- Q7 }9 t0 Z5 C: K8 [4 T! c. }, M& j
; R( Z9 C& z% S9 ]15.______函数能返回脚本里任意行中调用的函数的名称。该函数同时还经常被用在调试中,用来判断错误是如何发生的。2 o. |# p* @7 H( r* v% b$ m
# f6 j u+ o$ k. {! xA.print_r
( _" M' R0 y" I& K6 i7 h8 @B.var_dump/ |. b$ s9 ]2 A! a# j
C.stack_dump M; `% _2 U3 `" u
D.debug_backtrace
% I) S5 c7 @/ g5 l4 |7 ]; p: d" cE.以上都不对
" T) ~. [% Y# o
6 q4 m; t" B. b8 p* \% s答案( m! Y! v9 Q o# u7 `
- u/ l: U/ F9 k
1.答案是E。三元操作符把每个if语句连到一起,作为&&操作的一部分。然而本题中,$x=1这个赋值只在第三个if为false时发生。如果第一个和第二个条件都不成立,$x=1就不会执行。这题对三元操作的应用有些极端,实际应用时,需要根据可读性来决定是否需要用三元运算符(本题这种情况就最好不要用)。4 v! {& B$ |/ Q' V3 L; S0 F
( G" K3 O$ P& Z& ~* B" Y5 k4 s$ T
2.问题是由第三方数据源传输缓慢导致的,而你无法控制这个数据源。你也许能在网络连通性上做些工作(假设问题出在你这一边)。还可以对接收到的内容进行缓存,这样能减少获取重复数据的时间。因此,答案是B和E。6 J* c1 V9 R3 K! d2 P! f/ o
6 [9 c. ]4 o$ R* b) u3.正确的选择是B和D。如果关闭错误报告、使用@抑错符和关闭错误日志,那么在你交付给客户的网站出现问题时,你将很难进行分析和调试。
. g' U: ]. X- s. ?; G' }) c% m5 O( ~2 k9 T9 l: Y5 o
4.这是在描述===操作符。
0 ?, A9 W! ]& ?# M* K3 ?0 D( T- W! g/ K' e8 m
5.正确答案是D。PHP脚本在执行时,将首先被解析成“中间”码(也叫opcode,操作码),然后解释器执行。操作码缓存出现在这两个步骤之间,对解析器的输出进行缓存。下次执行该脚本时,将缓存的输出直接送入解释器。这样就就不需要再解析一次了。. x9 h; [! v) Y& ?
0 ~' m% @& M1 a6.正确答案是A和D。如果RAM太小,进程间将出现资源竞争,服务器将大量使用硬盘交换。同样的,如果允许过多进程同时执行,也会使服务器频繁进行交换,导致速度下降。
, D+ n2 S( ]# Z4 B; f$ }! r1 q; J, h. Y7 i3 W7 m
7.正确答案是A和C。脚本不检验datebase_query()的调用是否成功,因此将持续执行下去,最终产生错误。此外,$my_id参数没有转义——可能导致代码注入(详见第11章)。8 y" q2 }% |, b! [5 k9 {
' K0 R+ o9 O7 e/ _. j
8.答案B和D正确。出现解析错误往往表示脚本中有语法错误,自定义的错误管理器无法捕捉到它们的原因很明显:错误管理器在脚本里,而现在无法解析脚本,管理器也就无法执行。类似的,E_ERROR表示有致命的运行错误出现,比如内存耗尽。因此脚本会立刻被中断,因为解释器无法执行后面的代码。
* ^+ g* P t2 `* r& ^' X6 } i
9 u) X4 M e/ N9 [& K( Q; e5 \9.答案是C。比较操作是一个可交换的操作(就是说结果独立于操作数之外),而赋值不是。因此,比如说,$a==10和10==$a是等效的,而$a=10和10=$a却不是,而且后者会导致一个错误,因为这不是一个合法的操作。确保常量在操作符前面,能保证你不会错误得将比较变成赋值。8 o+ ^! ?: y9 Z+ l! A: H$ d6 w: O
9 f7 n) o0 ?( u
10.答案是C。error_log函数能将信息送往一个指定的地址。尽管mail()也可以用,但error_log能自动给邮件添加标题,因此这才是最简单的方法。
$ Q9 z( E+ z! T2 `; k/ N% m. s3 d/ w% z- k
11.答案是不能。error_reporting函数能关闭所有运行时的错误报告,但对解析时的错误无效,因为解析错误发生在脚本执行之前。 F2 B! L6 U. S6 J1 [
5 M; M ]. D/ L$ Y5 ?12.显然,答案是C。概要分析器(profiler)能监视脚本的运行,并记录单个部分的运行时间。它可以用来找出和解决瓶颈。 r+ U( K7 ]& I* p; }
4 m, ^( I7 h* t- I u13.这是对调试器的完美定义!你可以用调试软件监视脚本运行,同时分析系统资源消耗,从而发现和解决程序缺陷。
2 s8 ?$ I! d1 `) x" g
% U8 P1 I3 `# C2 ^14.trigger_error()和user_error()之间没有区别。后者其实是前者的别名。
; f6 a7 a' {+ f) ^' Y- m6 K4 C5 n. g& f) t$ m0 s
15.答案是D。题目是在描述debug_backtrace函数,它返回一个由所有在代码的特定位置调用过的函数名组成的数组。 |
|