|
  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14443
- 金币
- 2507
- 威望
- 1647
- 贡献
- 1455
|
[Zend权威认证试题讲解]第十二章 -调试与性能管理
作为一个开发者,无论你经验多么丰富,或者无论你多么努力,你的程序中总会有bug。这是生命中一个必然的部分,如同死亡与缴税(尽管并没有后面两个那么严重)。) C6 b5 R8 z% O! w) T' f, k$ \' V$ @
要想解决bug,首先要能找到bug。事实上,许多开发者花费了无数小时茫然得盯着代码,只是因为他们没有把程序的容错能力摆在首位。忽略了这个部分,那么期望一个没有bug的程序就是——不可能的。
; `2 F6 _8 b- z& @2 Y3 s本章测试题将考察你对调试和性能管理相关知识的了解,以及如何用PHP做好这两件事。2 c' w3 [8 J/ A
. e( h4 W+ @8 Q
; _3 O" V/ P& K2 R4 x问题7 ~3 v/ V' g& o0 Q* ]; i* u
1 c% |+ B% b, q9 K
1.以下脚本如何用三元操作替代?
4 d# H& o8 P" N( ^2 A-
- <?php
- if ($a < 10) {
- if ($b > 11) {
- if ($c == 10 && $d != $c) {
- $x = 0;
- } else {
- $x = 1;
- }
- }
- }
- ?>
复制代码
3 R5 u# q# n* B9 I( \" o# x! A4 F3 AA.$x = ($a A. < 10 || $b > 11 || $c == 1 && $d != $c) ? 0 : 1;
8 y+ `; z6 ]/ d2 P' F6 ^7 I1 eB.$x = ($a < 10 || $b > 11 || ($c == 1 && $d != $c)) ? 0 : 1;
1 @7 N8 e1 B5 O" BC.$x = (($a < 10 && $b > 11) || ($c == 1 && $d != $c)) ? 0 : 1;
* ~; s7 G2 F* c( c6 E- r" k. }4 n5 uD.$x = ($a < 10 && $b > 11 && $c == 1 && $d != $c) ? 1 : 0;; \! C! F% Y2 p: b# n) b3 z
E.以上都不对
0 J! [, Y- j( r1 a3 L3 i
, b. m: ]0 X* I& G' x1 S0 `* J" W* y' l5 B
2.有一个脚本由于要从远程获取数据,因而运行速度很慢,以下那种方法能对其进行优化?(双选) n/ ]( q E' u" G9 C: V9 F$ _
6 \4 r0 {6 ]% l. p; `( xA.安装操作码缓存(opcode cache)
+ k) V& O, s ]B.优化或者升级你的网络连接; P* U- q( p) t, [: x, U
C.添置更多的硬件
( M, K9 q2 d) N T vD.增加服务器的可用RAM- O- h2 X5 L. J
E.使用连接缓存
: H( S* b9 y! l* s# {, B1 \3 O' z* P9 F0 l# c
' D# L4 }' b! I# n" S5 R" u' g+ @% u
3.架设生产环境下的服务器时,需要做哪些步骤?(双选)$ C$ }) {; J l G7 x' }
& l0 ~0 K+ _: Y- v
A.关闭错误报告6 j) R* ^3 B$ G1 ~% |' w
B.打开错误日志- w5 `, }- ^0 s4 X
C.关闭错误日志
7 @+ ~6 D7 b5 g5 `8 VD.关闭错误显示
$ Y: \- c- b- I/ ME.使用@抑错符
/ S; b; f, D. d8 ?, ^% I
# Q4 h' M+ u6 @9 v7 ]! k$ L, u8 Z/ Q: S/ K, c
4.______操作符能对操作数的数据类型进行严格的比较?3 c F* W* U# m' c
7 Z5 e! @# O: |+ ^# [( i" M/ C. o答案:____________7 n% `. `1 b3 n) s4 E
$ `8 q# S% W+ f, x( }9 U- h1 b
( Y9 G% H5 p$ H0 Q5 t5 x& g2 m0 L: z
5.操作码缓存(opcode cache)能做什么?" l" _5 h& q- ?/ Y% F
+ o I, p+ R( u }1 Q5 O0 l0 ]8 yA.把脚本编译成二进制对象,使它运行得更快2 C3 ^6 W9 u" ]/ C6 @7 k
B.代替Zend引擎加快解释器的运行
% t: `# p3 A7 i. yC.缓存脚本输出以提高执行效率1 R+ L5 A* v- F; V. W. _) z/ I) V
D.缓存解析器产生的中间码,以提高运行效率
' Y* F( J5 o) j& @; d* FE.在内存中缓存脚本,减少从硬盘中读取的次数* v. @3 L1 C0 y+ ] Z
0 \/ t0 x9 ]; q+ A+ H
# Q- O+ H* O Z& v2 d8 F6.以下哪些情况容易造成系统资源枯竭?(双选)6 E7 O6 C, R$ X, z1 ~
6 M( k% o; _) T: ]; A4 { [: k
A.RAM太小
% R. a$ C& m4 `; dB.使用了低带宽的连接& U7 m" i% M- z" P y$ R2 P' Z
C.虚拟内存超过2GB
6 F6 M1 U, j* M' c6 gD.允许同时运行太多的服务器进程4 j# L& a, x+ Q
E.以上都不对
- F3 B( f& [, g
6 c4 X( I9 W5 W$ c+ w( U! L3 X' v
7.以下脚本缺了些什么?(双选) ' D ?4 s& s3 I
-
- <?php
- $rs = database_query ("select * from mytable where id = " .
- $my_id);
- while ($a = database_get_data ($rs)) {
- var_dump ($a);
- }
- ?>
复制代码
: ^, f) s: R1 DA.参数出口(Parameter escapement)
1 ^3 w: \2 s4 s1 QB.输出格式化
& _6 c# Y4 \! s z8 `% wC.错误检查5 J* e) y) [7 j4 [% |" O7 g
D.一个SQL查询( i( N# b3 V+ ]
E.以上都不对
- F Z6 @" ?7 K3 P2 e# c9 b7 P9 n( | s( U# ~; F/ @
8 l/ V! H8 W0 P! m" L8 v
8.以下那种错误类型无法被自定义的错误处理器捕捉到?(双选)
b; [) B f! m( W) C0 x* k2 G3 T8 [! G3 b9 a% ^, B: Z
A.E_WARNING9 V$ M0 H7 L& s/ F. z
B.E_ERROR8 z/ e. [; o7 S, x; h# U6 q
C.E_USER_ERROR
3 H; k4 j. r" iD.E_PARSE. h& v( y- k. J* w- o
E.E_NOTICE
0 Q" f: k+ k# i. }0 B3 ^# _5 k" z
6 X+ C! F2 R% |$ W. k. c
. V Q: H& G) j9 d5 H! b9.当需要比较一个常量和一个变量时,如何才能保证不会错弄成赋值?8 A9 ?9 M9 H0 k$ a0 k* U7 p2 N
' |9 `' B$ i, T0 }3 X! z
A.把变量转换成int, r9 B; g$ ?2 s! M) I" {
B.使用全等比较符(===)$ u: R4 R2 J, i; `2 Z
C.确保常量是第一个操作数' {) }" a' s1 p) p$ {% u8 l: @
D.使用三元运算符
* K$ h# a1 w- V$ v8 \+ cE.用括号把操作包起来
6 h$ V; p5 a" L/ g- K' k$ ?: E4 \+ E
; M4 B: t# U: z& h9 x! |5 Y) K1 R- h
10.要通过邮件给系统管理员发送错误信息,以下那种方法最简便?3 [! H% _" f. m. ^! a- A
0 k) c/ I6 |$ z( h: m! n
A.创建一个连接远程SMTP服务器的函数 ]7 Y/ l% B; @# F1 M* V
B.使用mail函数
7 ]7 N3 L1 S: I: h, T+ w3 ^) Z& dC.使用error_log函数 f5 q5 h2 q9 D0 ?5 {
D.调用sendmial程序
% P4 u$ j% }6 r% S' ?E.使用webservice
4 B9 z1 m% J! l$ `: d: b" D" Y9 C& E$ A" l: P% t5 _0 ~
0 y3 [6 |* _) g+ h+ t11.能否仅调用一个函数就关闭脚本内所有的错误报告?
4 U* r N( d* s6 z7 z! Q; q) l
A.能- x3 Y, D6 W4 @" q% L$ I, A) h" H2 _
B.不能+ {$ ? Q, g& \/ ~4 d/ `
0 t5 E) b3 k/ C& M, }5 I5 {5 C9 G, f M, l" B! v9 h7 z
12.概要分析器(profiler)是做什么的?
- Y2 T! ^* Q, V# Z' Q7 i' I: B
/ W6 @0 l- `% R5 G+ b$ f; nA.创建关于脚本结构的档案( h9 z& ?' j$ b8 Y6 {. d2 u5 m
B.把脚本转化成UML图; D \5 A* Y2 `& \5 S
C.精确测算脚本不同部分的运行时间
# j2 \5 ~7 s) e- z* l# _* ND.计算脚本通过web服务器执行时的维度
0 P1 X9 Q" _, zE.扫描脚本,识别由常见错误导致的bug
" C6 `5 [0 Z" u/ e# H" j n! t" y3 T$ a, P/ O0 L! F# r) [2 s
( i; f! K! p, S. W- i, G7 ?2 Z
13.______能帮助识别和解决bug。) M$ x _1 N7 @) `- L: q
7 R7 U) X O5 q3 b3 k0 D" _" ]. v答案:____________
+ E7 `# W+ C7 i1 {+ w' A- |% F. V0 M! ]7 Q' F" |4 V/ H+ R
1 Y, r% g0 T1 V+ j6 n- |% N0 _
14.trigger_error()和user_error()有什么区别?6 X% b/ O' v. p5 @8 w
" C8 e: K, h0 c+ p
A.trigger_error()允许脚本抛出系统级的错误- j# @8 @3 G+ g' D) ~, s
B.user_error()允许脚本抛出系统级的错误
; G; \% F2 w" {' T/ `C.user_error()不能被用在错误管理器中
9 M5 w6 V% K6 u4 J7 |/ b# {D.trigger_error只在PHP5中可用; q! e! l4 c- [; i6 P
E.没有区别0 ^+ c @) e& r; N3 ]
* l; Z4 P$ `& U+ u6 y
! ~+ [$ |6 w' o) i. x- J, c
15.______函数能返回脚本里任意行中调用的函数的名称。该函数同时还经常被用在调试中,用来判断错误是如何发生的。9 m9 X( x9 @" S4 F
+ R `& S" h* b% D/ _! m
A.print_r
6 _' C# T& M) t6 u/ S, MB.var_dump
6 l/ h0 {$ }7 ?! b! ~7 {C.stack_dump
, n' C3 Z4 m. F( [/ V, a9 T) zD.debug_backtrace
9 V9 J2 A# k' |" q# m* bE.以上都不对
* L& }0 U; ]9 l* ^
6 |1 [8 l4 w+ s: l0 ]答案9 C6 j, G4 W- f! |2 W% m' @
) f7 _: f" ~9 l% ?' b* c
1.答案是E。三元操作符把每个if语句连到一起,作为&&操作的一部分。然而本题中,$x=1这个赋值只在第三个if为false时发生。如果第一个和第二个条件都不成立,$x=1就不会执行。这题对三元操作的应用有些极端,实际应用时,需要根据可读性来决定是否需要用三元运算符(本题这种情况就最好不要用)。
c6 `% K7 \5 v6 T
( D: u* d4 [1 ]0 J! I5 I) M2.问题是由第三方数据源传输缓慢导致的,而你无法控制这个数据源。你也许能在网络连通性上做些工作(假设问题出在你这一边)。还可以对接收到的内容进行缓存,这样能减少获取重复数据的时间。因此,答案是B和E。0 M9 l# {! x3 @, x- S F& |% x
% D' V' o0 z- d0 i7 N& m3.正确的选择是B和D。如果关闭错误报告、使用@抑错符和关闭错误日志,那么在你交付给客户的网站出现问题时,你将很难进行分析和调试。% P% T* u- r( r
' W) s4 |) [+ d' J
4.这是在描述===操作符。" O5 t3 E1 ^# [% T$ K% {# M/ C( B
% q. w; C R& r( L; F) Q; V5 C9 J5.正确答案是D。PHP脚本在执行时,将首先被解析成“中间”码(也叫opcode,操作码),然后解释器执行。操作码缓存出现在这两个步骤之间,对解析器的输出进行缓存。下次执行该脚本时,将缓存的输出直接送入解释器。这样就就不需要再解析一次了。$ b( t% K( Q+ X# y* y+ S- U( G
6 Q5 q- ^7 I: j% ?2 U- g
6.正确答案是A和D。如果RAM太小,进程间将出现资源竞争,服务器将大量使用硬盘交换。同样的,如果允许过多进程同时执行,也会使服务器频繁进行交换,导致速度下降。
7 g4 J5 w7 K$ E5 R: b4 B
j3 e3 z) b5 W# ]- P5 T3 S7.正确答案是A和C。脚本不检验datebase_query()的调用是否成功,因此将持续执行下去,最终产生错误。此外,$my_id参数没有转义——可能导致代码注入(详见第11章)。3 {# J6 o- w9 ?; D$ U# r. }
* V/ ~" b# p/ F, p. g
8.答案B和D正确。出现解析错误往往表示脚本中有语法错误,自定义的错误管理器无法捕捉到它们的原因很明显:错误管理器在脚本里,而现在无法解析脚本,管理器也就无法执行。类似的,E_ERROR表示有致命的运行错误出现,比如内存耗尽。因此脚本会立刻被中断,因为解释器无法执行后面的代码。
0 H0 _+ k6 U4 ?/ W. M0 ^" |# T. ^9 g
9.答案是C。比较操作是一个可交换的操作(就是说结果独立于操作数之外),而赋值不是。因此,比如说,$a==10和10==$a是等效的,而$a=10和10=$a却不是,而且后者会导致一个错误,因为这不是一个合法的操作。确保常量在操作符前面,能保证你不会错误得将比较变成赋值。8 Y& J6 \. @, y) K
' W' W& e5 N+ D4 i% Y
10.答案是C。error_log函数能将信息送往一个指定的地址。尽管mail()也可以用,但error_log能自动给邮件添加标题,因此这才是最简单的方法。8 ~" i: ` M- X2 h; d
' n. Y; Q* n" q11.答案是不能。error_reporting函数能关闭所有运行时的错误报告,但对解析时的错误无效,因为解析错误发生在脚本执行之前。# Y9 N8 ^) o; |& j4 _8 L
5 t. o9 Y; y* u7 m5 y. X12.显然,答案是C。概要分析器(profiler)能监视脚本的运行,并记录单个部分的运行时间。它可以用来找出和解决瓶颈。
7 X3 ^- ~) q }6 e: \' V6 @4 v8 u- v
13.这是对调试器的完美定义!你可以用调试软件监视脚本运行,同时分析系统资源消耗,从而发现和解决程序缺陷。' F2 G, @5 H$ u, e/ @
. {3 q4 n0 c% A" N% ?$ ~1 g7 I H
14.trigger_error()和user_error()之间没有区别。后者其实是前者的别名。
2 m3 M+ p3 h, C2 Z& |2 e( Q
; M8 d: J V0 J( x5 L4 b- W( j& [15.答案是D。题目是在描述debug_backtrace函数,它返回一个由所有在代码的特定位置调用过的函数名组成的数组。 |
|