|
  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14443
- 金币
- 2507
- 威望
- 1647
- 贡献
- 1455
|
[Zend权威认证试题讲解]第十二章 -调试与性能管理
作为一个开发者,无论你经验多么丰富,或者无论你多么努力,你的程序中总会有bug。这是生命中一个必然的部分,如同死亡与缴税(尽管并没有后面两个那么严重)。
# A3 w' w2 j6 B& p要想解决bug,首先要能找到bug。事实上,许多开发者花费了无数小时茫然得盯着代码,只是因为他们没有把程序的容错能力摆在首位。忽略了这个部分,那么期望一个没有bug的程序就是——不可能的。
% {, q) M# w0 g& U本章测试题将考察你对调试和性能管理相关知识的了解,以及如何用PHP做好这两件事。) Q/ _9 N7 O% ?' c, p
( P( i+ | W0 t& U7 y0 a! M) l) a7 t& h" y) x7 C
问题
4 B4 h/ t# e+ d0 O# h
. i3 A* J8 k2 f4 J: v* B1.以下脚本如何用三元操作替代?
; p' r2 e3 A( ]' y8 o* ]3 c-
- <?php
- if ($a < 10) {
- if ($b > 11) {
- if ($c == 10 && $d != $c) {
- $x = 0;
- } else {
- $x = 1;
- }
- }
- }
- ?>
复制代码 9 J4 m& x$ Y- m. x8 x
A.$x = ($a A. < 10 || $b > 11 || $c == 1 && $d != $c) ? 0 : 1;6 Y! e! I) g: L+ T% Q* {
B.$x = ($a < 10 || $b > 11 || ($c == 1 && $d != $c)) ? 0 : 1;
. \3 e1 ]3 ^0 w" `& SC.$x = (($a < 10 && $b > 11) || ($c == 1 && $d != $c)) ? 0 : 1;$ ^3 ^& e9 @9 w$ e+ I3 L) g
D.$x = ($a < 10 && $b > 11 && $c == 1 && $d != $c) ? 1 : 0;
2 r0 r$ ~0 m- w- P- lE.以上都不对 e h9 _: R4 r0 k6 ] |' a
# e7 h! s3 F7 ]3 h
/ Q* [! K# z2 z, n3 ~$ J2.有一个脚本由于要从远程获取数据,因而运行速度很慢,以下那种方法能对其进行优化?(双选)+ b6 L) h6 j4 F
6 N/ ]' K% [/ h( C
A.安装操作码缓存(opcode cache)9 v" x N: c3 N: P2 P
B.优化或者升级你的网络连接) S: R- O4 P3 u9 u
C.添置更多的硬件
, _3 }8 p7 @* r. T. f/ oD.增加服务器的可用RAM% p. C) u3 ^+ b9 G" z) i
E.使用连接缓存
8 b8 N/ @: [# J* F, x: f; ]/ j1 U% U& S. c" M" e8 Q
3 j8 R) e& E- l' I/ W- w
3.架设生产环境下的服务器时,需要做哪些步骤?(双选)% }1 A5 z& d3 S$ N+ b" C, R3 B
8 r8 m c) A2 m0 [ x6 TA.关闭错误报告
2 |: M- S; H; b: ~; W3 z( uB.打开错误日志" ?7 k) |4 C7 b7 s2 c8 V5 y; K
C.关闭错误日志
, O- Z- s' H0 e9 V2 o$ fD.关闭错误显示" U6 N3 p8 s* ], L
E.使用@抑错符
6 d+ r, `, \! H* c9 ~, A c |/ P# G6 P* n8 ^; x
# u8 l9 P6 H2 e- ^5 h6 T4 K) m
4.______操作符能对操作数的数据类型进行严格的比较?* D2 r* S& s" W: S# p
\$ F, }# \3 h) r答案:____________. s3 M) I) z1 F
3 A$ r2 V) P4 d) e: C+ [. {
, \* A3 ~, y3 B; P5.操作码缓存(opcode cache)能做什么?5 L* ^. \) `) m- j2 b
* @9 w. @) ?6 q/ D% A' h0 ?' R
A.把脚本编译成二进制对象,使它运行得更快5 E! C# D# Y/ e( a, E7 v4 V
B.代替Zend引擎加快解释器的运行* t- _/ }( G; O! }# |. y5 i2 x! c5 J
C.缓存脚本输出以提高执行效率$ F9 j. }& m! K$ p
D.缓存解析器产生的中间码,以提高运行效率) I4 d5 R8 g) _. g
E.在内存中缓存脚本,减少从硬盘中读取的次数
. G+ H! b5 q( [7 G6 d! X; {
6 e- {3 k! R; y7 A( {- O2 @9 ~9 }& P
6.以下哪些情况容易造成系统资源枯竭?(双选)
/ y' J# J5 `, f1 {
8 o m' |/ G3 }A.RAM太小
9 k! N* S3 I; X0 X% X7 I8 DB.使用了低带宽的连接) i) K7 Z# u' {8 K
C.虚拟内存超过2GB
* F5 s, J7 ^; L3 {- w0 sD.允许同时运行太多的服务器进程: X; E2 ^5 j% ]
E.以上都不对
4 b! V$ D+ w! r2 G$ ]
3 V/ N$ c; M& r, A9 t% ^9 C4 G6 C- |& s! V1 N- \% m
7.以下脚本缺了些什么?(双选)
5 ]3 G; ?3 t& @ C, ?3 G# i3 y M-
- <?php
- $rs = database_query ("select * from mytable where id = " .
- $my_id);
- while ($a = database_get_data ($rs)) {
- var_dump ($a);
- }
- ?>
复制代码
2 j; G4 e8 X& ` }: }7 B" zA.参数出口(Parameter escapement)
' w+ K) ?" `4 a9 i) H4 u% I& \# I. R4 h" m9 nB.输出格式化
' [: k( z. Y9 J2 jC.错误检查* d9 }# v" b) t/ w' x) C+ }/ _ S
D.一个SQL查询
/ [8 p D3 n6 Q+ M0 p3 Q YE.以上都不对& {5 c( y- x. x5 n5 V6 t4 N
! H+ T8 a0 T% J4 B
" ~3 R" w0 \/ e5 m4 v9 }
8.以下那种错误类型无法被自定义的错误处理器捕捉到?(双选)
/ Q5 n9 i/ {5 Z( p8 X9 p
1 a, j( f. f% Z1 ]) e2 m tA.E_WARNING
& P& W9 Q: M$ a TB.E_ERROR
( B7 s6 F/ N3 _C.E_USER_ERROR
' N" |4 o H8 x" ~. R: ~D.E_PARSE
. s. h0 ~" X8 z! ME.E_NOTICE
2 r9 A {6 V% z2 Q6 P' y- J/ j6 A9 K2 |
* j$ w: |4 ^, G* G1 C. J$ d
9.当需要比较一个常量和一个变量时,如何才能保证不会错弄成赋值?9 C5 y1 B* k5 q* Q* ^
3 ?. A2 i2 e3 x' O( n! T
A.把变量转换成int" `: x K8 W8 n* f! L& b: |
B.使用全等比较符(===)& q6 ]9 f) i' r5 r4 q R
C.确保常量是第一个操作数
3 k7 K8 O$ J3 P I0 Z3 v% KD.使用三元运算符
# H& W b! f* G9 e/ LE.用括号把操作包起来+ s* _) P7 S& {' ^
( Y2 E: S5 M& ?7 C' ?2 N, y0 x$ y9 s) N- s0 U
10.要通过邮件给系统管理员发送错误信息,以下那种方法最简便?
; q0 K$ {' E7 T/ y, b9 C: T8 t, @. w8 f$ ?$ f4 [
A.创建一个连接远程SMTP服务器的函数
. F5 {9 p4 A+ L, _B.使用mail函数
( h" ~, {: [& y; dC.使用error_log函数% B: f m+ p2 {5 h7 w0 o( e& j+ A
D.调用sendmial程序
6 J2 x3 \ |: s7 X" L |E.使用webservice
. m; h" C% U! Q2 w) J" g4 X% S' r
* {) F/ q' \. g$ j& k
2 \9 A% N. z1 b- \& q! ~11.能否仅调用一个函数就关闭脚本内所有的错误报告?
0 }# H! F9 ]& k- N3 e" ~: R
3 ?, |- K: g; S8 i7 qA.能% a4 f: y3 l6 k
B.不能 M. q/ ]/ N- W9 N
: ]( v. S( v+ `0 M3 f" ]6 ^5 O- M6 ]& |) h
12.概要分析器(profiler)是做什么的?: H: {# w5 A& y. j" q1 S& H9 T$ _
6 Y p3 K. b" u
A.创建关于脚本结构的档案 ^# B- Q1 n: P1 C5 k5 d
B.把脚本转化成UML图* }/ r/ N; V3 @/ J7 }2 _
C.精确测算脚本不同部分的运行时间3 j/ M. r' X4 m
D.计算脚本通过web服务器执行时的维度
: |. A" t! Q+ F0 _E.扫描脚本,识别由常见错误导致的bug' I6 e' S+ {6 F3 P8 G7 K
0 [( m8 }' j+ g( S d- p
* B8 |* T$ `2 `. m
13.______能帮助识别和解决bug。$ L; s0 i% d/ p* i8 @1 [
" U8 u/ i- c( i" R4 n答案:____________
' }2 R4 y1 `9 L: _4 U: {/ Y Z/ J' P* B# \7 a" o3 z% N
: H/ |! ?4 ~7 k4 C
14.trigger_error()和user_error()有什么区别?
c! \/ G6 b5 {( `- |1 z5 d1 n2 {' l! ?" y' @8 `
A.trigger_error()允许脚本抛出系统级的错误
; b; u; Z, X- t# G* z# T& ZB.user_error()允许脚本抛出系统级的错误
; f9 P, v2 p( V- T \C.user_error()不能被用在错误管理器中
( V7 t9 J; K3 f5 g' X& yD.trigger_error只在PHP5中可用; `7 j4 ~1 H% d$ k5 r. S
E.没有区别! D, O, {! F) f U
) P+ g! n( F$ Z% I3 d S% ^6 i+ ^7 l; m
15.______函数能返回脚本里任意行中调用的函数的名称。该函数同时还经常被用在调试中,用来判断错误是如何发生的。6 ~1 a4 T# l( H/ C4 H5 r9 ^
7 i; N. z' t* ?5 t) a7 t& o* `8 \A.print_r" y6 j: P. U# A2 w
B.var_dump
) X4 ]9 C3 N) E0 E" K& OC.stack_dump
' q# L% B) \4 E1 K) j4 c# Q" _D.debug_backtrace
" ~0 M( u g7 n6 TE.以上都不对$ O5 o5 o# d! ~$ u, D4 F0 E6 l" Q
4 G# t5 D+ n. f* B
答案
* r0 n, d) [0 g2 G# }6 N
. s2 n( A0 [) |; Z' N1.答案是E。三元操作符把每个if语句连到一起,作为&&操作的一部分。然而本题中,$x=1这个赋值只在第三个if为false时发生。如果第一个和第二个条件都不成立,$x=1就不会执行。这题对三元操作的应用有些极端,实际应用时,需要根据可读性来决定是否需要用三元运算符(本题这种情况就最好不要用)。
, q1 g/ ?/ \- ~1 `' J/ b
2 n4 P# N) T5 e$ V, Y" Q4 k) j2.问题是由第三方数据源传输缓慢导致的,而你无法控制这个数据源。你也许能在网络连通性上做些工作(假设问题出在你这一边)。还可以对接收到的内容进行缓存,这样能减少获取重复数据的时间。因此,答案是B和E。
# j" R" Y7 W; O D& g+ I2 G7 X8 w% h0 d+ {3 M3 G
3.正确的选择是B和D。如果关闭错误报告、使用@抑错符和关闭错误日志,那么在你交付给客户的网站出现问题时,你将很难进行分析和调试。% G7 c2 c! i7 V
$ E) h/ v7 J3 t7 f2 E3 _% P
4.这是在描述===操作符。
: S- U( L7 J0 }1 Q2 \
3 e5 A2 H8 ]2 R# c& p" ]. h3 p: J5.正确答案是D。PHP脚本在执行时,将首先被解析成“中间”码(也叫opcode,操作码),然后解释器执行。操作码缓存出现在这两个步骤之间,对解析器的输出进行缓存。下次执行该脚本时,将缓存的输出直接送入解释器。这样就就不需要再解析一次了。' h i/ O' g) S k# T! X
: k4 Y+ y* ?) q' |4 o
6.正确答案是A和D。如果RAM太小,进程间将出现资源竞争,服务器将大量使用硬盘交换。同样的,如果允许过多进程同时执行,也会使服务器频繁进行交换,导致速度下降。: K2 ?% l2 A" ^! y. b* x
3 ]0 N# Y9 m0 e& U3 t3 o$ A
7.正确答案是A和C。脚本不检验datebase_query()的调用是否成功,因此将持续执行下去,最终产生错误。此外,$my_id参数没有转义——可能导致代码注入(详见第11章)。
r3 v2 @5 r; w1 p6 f- L% Q' B: m1 E7 \' o
8.答案B和D正确。出现解析错误往往表示脚本中有语法错误,自定义的错误管理器无法捕捉到它们的原因很明显:错误管理器在脚本里,而现在无法解析脚本,管理器也就无法执行。类似的,E_ERROR表示有致命的运行错误出现,比如内存耗尽。因此脚本会立刻被中断,因为解释器无法执行后面的代码。
) s* B2 s3 U* o
" f- ]8 ~, M, M9.答案是C。比较操作是一个可交换的操作(就是说结果独立于操作数之外),而赋值不是。因此,比如说,$a==10和10==$a是等效的,而$a=10和10=$a却不是,而且后者会导致一个错误,因为这不是一个合法的操作。确保常量在操作符前面,能保证你不会错误得将比较变成赋值。
6 {+ `/ G; ^1 u* M
3 A$ l i& F( Q" ?9 E8 A10.答案是C。error_log函数能将信息送往一个指定的地址。尽管mail()也可以用,但error_log能自动给邮件添加标题,因此这才是最简单的方法。
$ _7 w/ T- {, x: h! x0 l' v0 r( m, F
11.答案是不能。error_reporting函数能关闭所有运行时的错误报告,但对解析时的错误无效,因为解析错误发生在脚本执行之前。; s$ N1 z* A2 X2 B4 v* x
9 x0 b, [ L6 F7 _3 f: c12.显然,答案是C。概要分析器(profiler)能监视脚本的运行,并记录单个部分的运行时间。它可以用来找出和解决瓶颈。1 S$ V1 Q+ y0 B
3 }7 E0 w4 F8 C7 F4 S* v# N13.这是对调试器的完美定义!你可以用调试软件监视脚本运行,同时分析系统资源消耗,从而发现和解决程序缺陷。% G2 ]3 J5 S) Q# y2 B1 o. L( D
' Q/ {6 c8 [4 D+ G! T& I3 x14.trigger_error()和user_error()之间没有区别。后者其实是前者的别名。
, _& `- a5 t- U6 o* g+ b) d0 ~: L. R% h. R; k H7 e
15.答案是D。题目是在描述debug_backtrace函数,它返回一个由所有在代码的特定位置调用过的函数名组成的数组。 |
|