  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14221
- 金币
- 2401
- 威望
- 1647
- 贡献
- 1349
|
[Zend权威认证试题讲解]第十二章 -调试与性能管理
作为一个开发者,无论你经验多么丰富,或者无论你多么努力,你的程序中总会有bug。这是生命中一个必然的部分,如同死亡与缴税(尽管并没有后面两个那么严重)。3 e/ w0 i ?7 l1 X5 z7 R. M
要想解决bug,首先要能找到bug。事实上,许多开发者花费了无数小时茫然得盯着代码,只是因为他们没有把程序的容错能力摆在首位。忽略了这个部分,那么期望一个没有bug的程序就是——不可能的。
h' H0 _% ^ E# H8 h! C; D% b6 h5 `本章测试题将考察你对调试和性能管理相关知识的了解,以及如何用PHP做好这两件事。
3 S" E- J6 g9 [" ]& m* h% P3 p& f3 y q8 Z2 X, P/ k
5 U5 p2 Z! ?2 H8 B7 f问题
( q# B9 f. E) y) ?, M8 y- a& [. y4 X( x- a* Z+ Q2 x
1.以下脚本如何用三元操作替代? 3 h0 Z% i! S/ Z( k+ D
-
- <?php
- if ($a < 10) {
- if ($b > 11) {
- if ($c == 10 && $d != $c) {
- $x = 0;
- } else {
- $x = 1;
- }
- }
- }
- ?>
复制代码 ' b9 c9 |) X: Q6 G
A.$x = ($a A. < 10 || $b > 11 || $c == 1 && $d != $c) ? 0 : 1;% |4 t. a3 `1 v( [9 L! i- l/ r- {
B.$x = ($a < 10 || $b > 11 || ($c == 1 && $d != $c)) ? 0 : 1;! a/ l o- _) q. f
C.$x = (($a < 10 && $b > 11) || ($c == 1 && $d != $c)) ? 0 : 1;
6 U2 H: u4 v3 p6 m/ OD.$x = ($a < 10 && $b > 11 && $c == 1 && $d != $c) ? 1 : 0;' O- `& x$ W. Y3 _& k
E.以上都不对
8 x- [+ _9 F1 t' L$ C4 n
0 m8 S1 j6 Z$ d6 O, F' `! I% S
2 ]7 @+ N$ C; w3 {2.有一个脚本由于要从远程获取数据,因而运行速度很慢,以下那种方法能对其进行优化?(双选)+ D6 o$ ?" a* ?; @( H" r
' i& k3 z6 N1 E0 |A.安装操作码缓存(opcode cache)$ h5 j, M: K+ I# m; M
B.优化或者升级你的网络连接
4 j' T6 N0 ~' N, tC.添置更多的硬件: g6 y9 o* k- t; W* s( y# A p6 C
D.增加服务器的可用RAM( h3 ]& x6 F8 Q9 c2 E: [+ j! `
E.使用连接缓存0 x1 `% L, Q5 O: Z. }
: S4 g$ T. V; s: w+ S; x: I4 y
; \3 X" Q, A6 ?& T- n3.架设生产环境下的服务器时,需要做哪些步骤?(双选)
% G: X2 B/ D# Z2 K, o b7 p9 H6 S. F$ a% y
A.关闭错误报告
& W1 m. h7 w4 O# kB.打开错误日志
' N0 M! D9 S9 w) {6 |' |C.关闭错误日志- ^ j+ E- ]' A. h7 x- C p, z8 c
D.关闭错误显示
3 _. i9 ]5 a9 ~- `& U) ~9 h' I) F. hE.使用@抑错符
; u+ K5 ~ O' z. y0 X7 K) V. t9 _& }5 ^% T5 A) V' [+ W+ m6 P9 F) `
7 {& }) Q. W+ ^9 b2 |1 |4.______操作符能对操作数的数据类型进行严格的比较?3 l) ^9 I, {9 W9 d
; h8 X% C5 r, ~) B
答案:____________* e" v) m) O- I: k5 m: z( J
: O/ V- b; b1 m
+ C. q5 W( z+ j; \6 A( i' @
5.操作码缓存(opcode cache)能做什么?
* G- \: E& |: Q) F* U5 h$ A
* M6 C1 b( C T) M. X/ j/ [A.把脚本编译成二进制对象,使它运行得更快
" V5 V: L& ^ B' x. m/ w$ _' Z0 |B.代替Zend引擎加快解释器的运行& y* C# [8 |6 `/ F) N" j, t: g
C.缓存脚本输出以提高执行效率6 v0 j/ z! W+ z( m
D.缓存解析器产生的中间码,以提高运行效率
* J; y$ @& A( @; EE.在内存中缓存脚本,减少从硬盘中读取的次数
3 I8 ~: Y* A0 m& d8 a$ X& b" ]& L8 m4 F6 X) B" _- k$ Y/ h+ \
8 A: K8 o0 Z7 o6 s v
6.以下哪些情况容易造成系统资源枯竭?(双选)
' c0 {. \, ^2 r3 c+ y8 Z' \) O9 p# n# `
A.RAM太小
* j( m# Q3 z* IB.使用了低带宽的连接
0 k1 L" @$ k. w6 {+ ^C.虚拟内存超过2GB
1 f# c Z1 R. k- bD.允许同时运行太多的服务器进程6 ]- \: G3 `/ i* w
E.以上都不对
( d- R* l: @% I- Y
5 r0 l" s5 {$ Z" U# j: b3 |# h! L
6 ?" ^; u8 \+ ], E0 R" h4 e8 Y- @7.以下脚本缺了些什么?(双选)
4 O* k% C; Z% {. v. _& S-
- <?php
- $rs = database_query ("select * from mytable where id = " .
- $my_id);
- while ($a = database_get_data ($rs)) {
- var_dump ($a);
- }
- ?>
复制代码
$ H1 v/ ]1 D# Z; e9 e# b, s2 i9 EA.参数出口(Parameter escapement). D2 [ ~& Q2 U" Z% U* l" c! k
B.输出格式化
: Y8 y! D: H' p% m5 V2 vC.错误检查/ h! C( B4 d4 c# N$ \8 q! U7 E
D.一个SQL查询# m% Q5 X; R3 m' D2 ^$ D
E.以上都不对$ F- s! h J9 ?9 ?
+ C( y8 h- U. ]' F: j, o% m
: [; u# O* y+ @* O( p2 D& y3 A5 j8.以下那种错误类型无法被自定义的错误处理器捕捉到?(双选) O- ]- }) O+ J0 z
+ W- \( S% Y2 w. B( P
A.E_WARNING
# N- a3 \: a5 C1 [B.E_ERROR
4 y: V3 O" ^( @: g) CC.E_USER_ERROR
2 _$ ~9 q3 T* k0 vD.E_PARSE* w( T# _1 N7 B, f- f
E.E_NOTICE
6 K. m1 s& `6 B0 T$ P+ E0 |' }6 Q) @
2 L& N; ~- s+ P. F$ _2 n5 ~& R9.当需要比较一个常量和一个变量时,如何才能保证不会错弄成赋值?9 S3 j- [7 i5 z" W" o& A/ T9 D
0 H1 t) f4 [, f5 ?5 J4 K
A.把变量转换成int$ k0 @! K+ v# O$ _7 U3 V
B.使用全等比较符(===)3 y0 c1 d# J! N. P/ g
C.确保常量是第一个操作数 h" g; C' Q* f9 q P" X! _
D.使用三元运算符
& E, s" Z- l0 o1 q8 {E.用括号把操作包起来) t8 d9 l9 n* Z, K) D, _
8 @! o. t, Q0 P2 D1 q2 H4 P# I
5 R# N1 Q% T9 x% J' [, @10.要通过邮件给系统管理员发送错误信息,以下那种方法最简便?1 [: r1 I: m6 {# K, S7 d# ^% O
6 k! F& a x" x- {4 K# |
A.创建一个连接远程SMTP服务器的函数
c5 m) N1 y5 `9 s G }B.使用mail函数
! C4 W; n: i* {C.使用error_log函数2 S: s+ N' q4 L
D.调用sendmial程序
& Z- `* c/ a: x k! `E.使用webservice @9 s- p6 u8 \7 h6 R' s8 G6 Z# \
7 s/ x2 o# L- x# X: ^% T
$ T3 m; U. N9 C, v! `" Y
11.能否仅调用一个函数就关闭脚本内所有的错误报告?
1 I/ G& K% j* |$ u |
, Y: x$ b' r8 kA.能) o' o9 a$ d# W" ~+ ~2 j
B.不能
: w3 J2 `6 g5 [+ z8 J2 W8 a0 o4 T! I7 c; {
% ~$ m# a6 A3 M8 z2 k
12.概要分析器(profiler)是做什么的?! A. s* _8 k2 m2 Q2 }$ q; o. e/ I
1 p+ ~% j( w) A# F( n4 k
A.创建关于脚本结构的档案6 ^+ w, N8 |* \% x, {- r- i
B.把脚本转化成UML图
( k; I5 V$ N" M$ JC.精确测算脚本不同部分的运行时间
8 |! K' ]: N) F7 B; {, FD.计算脚本通过web服务器执行时的维度( w6 {; F0 d$ \" c( t& J
E.扫描脚本,识别由常见错误导致的bug
2 C {: b9 w8 i. i" a
" ~+ r- v [$ J0 ~
' T& m1 m1 @$ y( Z1 |4 O, Q) F13.______能帮助识别和解决bug。
1 L& k/ o4 I+ y6 ?5 z4 [
$ d' A# X9 a" G6 j D4 ]! }9 n& D答案:____________
+ I8 g7 i# J* l* v/ v) Y- ^0 t9 t: i2 j* [% k3 h9 W1 A3 @
' e& t: l& J l* _! _0 H14.trigger_error()和user_error()有什么区别?
/ q" q( ^8 e5 o7 X0 m, l. \% V' w1 M) Q! h
A.trigger_error()允许脚本抛出系统级的错误
0 f9 e. ]. `. }+ f* M- b: R }8 EB.user_error()允许脚本抛出系统级的错误# e8 F0 B8 l' [+ B& N: s2 S
C.user_error()不能被用在错误管理器中$ q, z+ X; g8 L0 I2 y X( J- v5 Z
D.trigger_error只在PHP5中可用
- z% ]' N) Q) zE.没有区别9 f4 T0 w' f2 \6 o
0 b/ ~2 d* E( y( I' J; _/ \ a& u
' J7 N7 v; P0 L# k- K$ ]
15.______函数能返回脚本里任意行中调用的函数的名称。该函数同时还经常被用在调试中,用来判断错误是如何发生的。
/ v4 z E' ?% y8 M2 c
" c6 G1 m4 l1 {* M# V5 LA.print_r. z! ]0 s+ `: {7 I/ g
B.var_dump9 N9 Z6 ?& }& @$ W3 i6 b) t' A
C.stack_dump
7 Q# B' J( a2 {, ~D.debug_backtrace
* a: p; H$ [" W7 P: y8 CE.以上都不对
/ y3 G. y* e4 U$ u, t- L
W2 b# ~1 [3 `# R4 ~- `& n答案2 T) h% e3 G4 Y$ ?; _( S
$ R, v& h0 |' v5 O& E. p/ n1.答案是E。三元操作符把每个if语句连到一起,作为&&操作的一部分。然而本题中,$x=1这个赋值只在第三个if为false时发生。如果第一个和第二个条件都不成立,$x=1就不会执行。这题对三元操作的应用有些极端,实际应用时,需要根据可读性来决定是否需要用三元运算符(本题这种情况就最好不要用)。
* X/ S2 f# ` n0 H( v8 K% Q
. |2 b* U; u8 v; e- a! {2.问题是由第三方数据源传输缓慢导致的,而你无法控制这个数据源。你也许能在网络连通性上做些工作(假设问题出在你这一边)。还可以对接收到的内容进行缓存,这样能减少获取重复数据的时间。因此,答案是B和E。
7 D" |. u. W. J: p/ y) n
[& Y1 {, B. n/ O8 h3.正确的选择是B和D。如果关闭错误报告、使用@抑错符和关闭错误日志,那么在你交付给客户的网站出现问题时,你将很难进行分析和调试。
7 I6 i4 z6 Z* R- q' C; S2 _) u3 m" F" {
4.这是在描述===操作符。
/ q4 ?6 C+ f/ j; [: T+ V( |1 Q8 Q1 Y! e
5.正确答案是D。PHP脚本在执行时,将首先被解析成“中间”码(也叫opcode,操作码),然后解释器执行。操作码缓存出现在这两个步骤之间,对解析器的输出进行缓存。下次执行该脚本时,将缓存的输出直接送入解释器。这样就就不需要再解析一次了。
% O1 S" _$ s) q
% b# X |0 U" Q; D( @9 v6.正确答案是A和D。如果RAM太小,进程间将出现资源竞争,服务器将大量使用硬盘交换。同样的,如果允许过多进程同时执行,也会使服务器频繁进行交换,导致速度下降。' n/ j. H6 w; P# G' `
" x Y4 X4 @$ f$ S' e1 L
7.正确答案是A和C。脚本不检验datebase_query()的调用是否成功,因此将持续执行下去,最终产生错误。此外,$my_id参数没有转义——可能导致代码注入(详见第11章)。( T w: P/ v' u! t
% [0 J9 h. Z8 | I
8.答案B和D正确。出现解析错误往往表示脚本中有语法错误,自定义的错误管理器无法捕捉到它们的原因很明显:错误管理器在脚本里,而现在无法解析脚本,管理器也就无法执行。类似的,E_ERROR表示有致命的运行错误出现,比如内存耗尽。因此脚本会立刻被中断,因为解释器无法执行后面的代码。
1 u+ X- q: z' o$ n% ]8 H/ i5 y' k$ b, C y
9.答案是C。比较操作是一个可交换的操作(就是说结果独立于操作数之外),而赋值不是。因此,比如说,$a==10和10==$a是等效的,而$a=10和10=$a却不是,而且后者会导致一个错误,因为这不是一个合法的操作。确保常量在操作符前面,能保证你不会错误得将比较变成赋值。
% `5 D/ t. Y8 f. z& K! L1 I$ @3 K( \
10.答案是C。error_log函数能将信息送往一个指定的地址。尽管mail()也可以用,但error_log能自动给邮件添加标题,因此这才是最简单的方法。1 x/ G' B8 w! [; O2 n) j
( i* q: K. X+ h
11.答案是不能。error_reporting函数能关闭所有运行时的错误报告,但对解析时的错误无效,因为解析错误发生在脚本执行之前。
# R- o1 y9 c4 L0 d$ @+ K' C5 I' T' |( k0 n7 H
12.显然,答案是C。概要分析器(profiler)能监视脚本的运行,并记录单个部分的运行时间。它可以用来找出和解决瓶颈。, l7 J& }/ h. U U& S5 \/ x8 l4 r
: s8 c* S$ N. _/ X. I13.这是对调试器的完美定义!你可以用调试软件监视脚本运行,同时分析系统资源消耗,从而发现和解决程序缺陷。
% W& s2 S. ^0 K( I0 ~
( C+ a: |4 G. [1 B% s$ l14.trigger_error()和user_error()之间没有区别。后者其实是前者的别名。
+ J' A0 }0 H% N; E4 E* r, k7 s9 }) b. D
15.答案是D。题目是在描述debug_backtrace函数,它返回一个由所有在代码的特定位置调用过的函数名组成的数组。 |
|