  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14221
- 金币
- 2401
- 威望
- 1647
- 贡献
- 1349
|
[Zend权威认证试题讲解]第十二章 -调试与性能管理
作为一个开发者,无论你经验多么丰富,或者无论你多么努力,你的程序中总会有bug。这是生命中一个必然的部分,如同死亡与缴税(尽管并没有后面两个那么严重)。. x* g+ c, v' t
要想解决bug,首先要能找到bug。事实上,许多开发者花费了无数小时茫然得盯着代码,只是因为他们没有把程序的容错能力摆在首位。忽略了这个部分,那么期望一个没有bug的程序就是——不可能的。
# I# ]- r( [: }! t本章测试题将考察你对调试和性能管理相关知识的了解,以及如何用PHP做好这两件事。
: v. y; [9 Q$ i) K% ~$ ]0 ?) V2 O X: I- w- o- `; |9 D' @ G
# @( q. o1 U9 J4 W问题0 G7 u$ t T4 |, s
- G( w7 c V- T$ d! A: j5 n1.以下脚本如何用三元操作替代? . i/ b7 b/ G2 J- v0 ]0 N
-
- <?php
- if ($a < 10) {
- if ($b > 11) {
- if ($c == 10 && $d != $c) {
- $x = 0;
- } else {
- $x = 1;
- }
- }
- }
- ?>
复制代码 ' ^. w# u" M0 {6 A7 B9 T
A.$x = ($a A. < 10 || $b > 11 || $c == 1 && $d != $c) ? 0 : 1;
. n" K9 w7 m6 C; jB.$x = ($a < 10 || $b > 11 || ($c == 1 && $d != $c)) ? 0 : 1;- y. y7 ~$ s& g
C.$x = (($a < 10 && $b > 11) || ($c == 1 && $d != $c)) ? 0 : 1;; L8 A9 }0 v5 k8 d7 t6 _5 V
D.$x = ($a < 10 && $b > 11 && $c == 1 && $d != $c) ? 1 : 0;+ f( Y, m" H! u& d
E.以上都不对
6 x" P3 _: l/ c5 I7 Z
: c$ [2 `( \+ X* R0 R( _" x5 P' J% [
- c2 V- Z* E5 `- T. E1 _! v, e$ P2.有一个脚本由于要从远程获取数据,因而运行速度很慢,以下那种方法能对其进行优化?(双选)
6 L0 ?; g5 V$ ^: ^" S/ E
. k, |/ R: O" }) GA.安装操作码缓存(opcode cache)- j, P" U: L4 L3 i6 s
B.优化或者升级你的网络连接1 m) G4 I! `" g/ p( n, e
C.添置更多的硬件
. f: w9 g3 p% V1 J8 |D.增加服务器的可用RAM4 B; ^2 P4 c ^7 v; ^
E.使用连接缓存2 w" m' \: C% ?/ f
) ~- B6 M0 |+ f) C5 h; K6 C* E% m+ C
3.架设生产环境下的服务器时,需要做哪些步骤?(双选)% x8 ^& [$ ~ X- J0 j. l
. \: y0 Q- x& o% NA.关闭错误报告$ c M9 t# K4 k3 |
B.打开错误日志/ f4 ~8 C" W7 x. t
C.关闭错误日志4 {3 J! H1 k1 h
D.关闭错误显示
i I2 B* p+ i, HE.使用@抑错符
4 U2 n- a4 l, l: u; n" L
& Z" p) O b! y, E( M3 _3 i6 k w" T# i' b7 L
4.______操作符能对操作数的数据类型进行严格的比较?
& Y& p" b1 n: H' h3 r
: Y+ n% D0 a& B, X* W0 B* x答案:____________
: G. Y3 i3 \% X4 o* \5 P8 y+ d7 d( p* K- K& B
2 k: ^8 p0 x0 K: P* c
5.操作码缓存(opcode cache)能做什么?3 s! y1 K; z5 \' k
- m4 e) [3 s9 c% t, E) H6 u
A.把脚本编译成二进制对象,使它运行得更快
- E+ T2 n3 ?6 W% @B.代替Zend引擎加快解释器的运行
8 m; x! j, K6 k" `C.缓存脚本输出以提高执行效率% G! n8 U' u7 @* b/ h
D.缓存解析器产生的中间码,以提高运行效率
& \( s5 b7 A4 n' cE.在内存中缓存脚本,减少从硬盘中读取的次数4 u! c9 p/ S% s; Z
: y7 l, A! Q/ |5 j- A! I2 P
: i$ ?( O, e. a- Q* j) O
6.以下哪些情况容易造成系统资源枯竭?(双选)
; _0 B. @ H: [& V) }* r5 f* Y/ A6 K
A.RAM太小$ `: l( X2 b' S' P
B.使用了低带宽的连接; k0 o. t* U8 m
C.虚拟内存超过2GB L L+ D5 p+ `, |- E9 X, j
D.允许同时运行太多的服务器进程( k& }' b5 M; O" k
E.以上都不对
, U: x9 p% e! U" s" Q# [* T3 c9 P* f5 \6 t+ @$ p; ^9 C0 S2 R
: ^4 x5 W- D' I! R5 b# I7 d7.以下脚本缺了些什么?(双选)
8 T6 I( `" c: S+ k% u5 i4 n& L0 }( C-
- <?php
- $rs = database_query ("select * from mytable where id = " .
- $my_id);
- while ($a = database_get_data ($rs)) {
- var_dump ($a);
- }
- ?>
复制代码
. a! j7 e9 r1 Z8 [1 ZA.参数出口(Parameter escapement): w& x" t7 I- T5 {1 H# R7 c6 W
B.输出格式化+ l9 \& j7 `3 ~, [2 l
C.错误检查- e- ]7 I. \" @; c0 Z
D.一个SQL查询! {0 L5 n- A7 C5 q
E.以上都不对
p' l( J: C1 [$ c! t7 [6 L9 [- g
" c, Y5 H& @6 R6 D8 U: T Q0 i1 ~( [' h) E9 a" u* ~3 o
8.以下那种错误类型无法被自定义的错误处理器捕捉到?(双选)
5 [1 v. x3 a* V5 d6 Q- o8 S1 h
: \* v% T6 ]' m$ G* X* z5 jA.E_WARNING8 A1 F8 o! f" Z T! |4 ]$ f
B.E_ERROR' g& y( ?' S- {+ x- L' e& l: D
C.E_USER_ERROR
+ r" M/ _2 x+ {1 ID.E_PARSE
7 V/ k- c3 I+ z0 C8 s5 GE.E_NOTICE. W' b' i* X% s: X
8 {, T! V! P& F/ s
+ d0 @" K2 B+ Y2 d, Y9.当需要比较一个常量和一个变量时,如何才能保证不会错弄成赋值?! ^. \5 k6 P- _7 w8 B
/ M+ p4 F# V1 a! U1 H2 M" a X! n
A.把变量转换成int( V% y7 k6 }- C. t
B.使用全等比较符(===)+ R7 y% D7 S- f P7 l! Z0 f* H
C.确保常量是第一个操作数" h' ]1 p( z- |. e, r1 f$ {
D.使用三元运算符 D- V* q9 B8 ^$ v3 V
E.用括号把操作包起来
( g3 m0 Z# t+ [ z r, W' K' e
9 ]7 d0 j3 O" S
4 O5 p4 _8 \- B1 N# M7 p! N10.要通过邮件给系统管理员发送错误信息,以下那种方法最简便?
" k8 r: t) V' k) ?' ^/ o" F
+ A6 O# @7 l- MA.创建一个连接远程SMTP服务器的函数% P* r- m5 O) \& B! a
B.使用mail函数
! q$ F% p" |6 iC.使用error_log函数
# p' w7 f: u+ @ T$ W- o- rD.调用sendmial程序) W0 e: Z" E( X% H1 J
E.使用webservice2 C# P( r$ d$ i! Z$ u: z9 \4 M
2 J/ E g- b3 \8 l; _, m& S; }( ]
! n$ ]5 k6 k1 n8 M; r
11.能否仅调用一个函数就关闭脚本内所有的错误报告?
+ `4 f' M$ Q$ s& V4 M1 t
2 M5 H1 _, R5 R# C4 u V; ~A.能
) C" e# g% k7 n8 QB.不能. V1 z/ q0 c0 T
, Q, a/ F/ `" k/ U) u" {3 G
' H, p+ ^+ W! o12.概要分析器(profiler)是做什么的?
- w ]) ?# }4 d3 H: Q" ~! F, z) D& `% F) P) t, Y5 W! @! d5 x* o
A.创建关于脚本结构的档案+ ?& D5 H# f( }8 r6 I
B.把脚本转化成UML图
% E. ^, \5 s. B% P& S0 y2 KC.精确测算脚本不同部分的运行时间
: M5 X) H) E- pD.计算脚本通过web服务器执行时的维度9 Q2 | o; h, D& P
E.扫描脚本,识别由常见错误导致的bug4 d" m3 B3 F4 \
2 j9 r1 Z$ Z( Q( e& M7 C# p
. x, a/ g1 R$ v! Y13.______能帮助识别和解决bug。
" V- A# x" p. V& o( A# n3 G
) |2 O3 v9 D+ z; k* {) l答案:____________9 D; P( p5 @9 f0 N
2 z$ ?2 \6 ~& B5 @0 \$ \- W. f
( }" W5 t) Y5 S8 u5 Z14.trigger_error()和user_error()有什么区别?( k i2 [) r, }; L' n. \9 z0 B5 i
7 G8 l7 N2 y% u/ y1 X8 i9 m
A.trigger_error()允许脚本抛出系统级的错误
$ x" v$ G1 H7 z3 R2 s1 i7 W& tB.user_error()允许脚本抛出系统级的错误" _ p; u4 X) d$ k' v, ^5 M9 e6 w
C.user_error()不能被用在错误管理器中
0 x Y; N/ j2 B+ w# N5 M, bD.trigger_error只在PHP5中可用
- \8 y2 R0 ~" K2 T m3 FE.没有区别9 F) q, O: d; M& C+ x( E0 V+ T
) x7 [8 P) }8 S, g
! a. Q) t' I' E1 k2 N& z" W- F! V
15.______函数能返回脚本里任意行中调用的函数的名称。该函数同时还经常被用在调试中,用来判断错误是如何发生的。3 ]4 {7 E4 y p9 }, A0 @ o9 [) ?4 \
+ \! J, P8 x" r+ s1 r
A.print_r
5 ~! \' z( r4 P6 v$ e" W- QB.var_dump- P: ^9 l3 f s/ s) i; K2 J
C.stack_dump$ E5 f, l* `6 B# L# ]; Q; j; p7 Z
D.debug_backtrace
7 }! x9 @6 l% q+ L0 P6 uE.以上都不对
+ E* Q/ X9 V* M6 N
5 {6 ?9 q1 `3 L; M答案
3 b. S" f3 D1 E8 l
3 {6 V; l" ^" a* Q& g6 ^1.答案是E。三元操作符把每个if语句连到一起,作为&&操作的一部分。然而本题中,$x=1这个赋值只在第三个if为false时发生。如果第一个和第二个条件都不成立,$x=1就不会执行。这题对三元操作的应用有些极端,实际应用时,需要根据可读性来决定是否需要用三元运算符(本题这种情况就最好不要用)。$ H* L) j3 V8 y9 K8 v" n# k$ N, _
6 h; c; H0 @' |4 R! E. u) [8 \) p2.问题是由第三方数据源传输缓慢导致的,而你无法控制这个数据源。你也许能在网络连通性上做些工作(假设问题出在你这一边)。还可以对接收到的内容进行缓存,这样能减少获取重复数据的时间。因此,答案是B和E。
1 A C( G, ?) A" g" c5 [% e' z
9 n1 G6 g5 c; b7 m7 k3.正确的选择是B和D。如果关闭错误报告、使用@抑错符和关闭错误日志,那么在你交付给客户的网站出现问题时,你将很难进行分析和调试。7 E! |+ }2 D B4 t
" r( c* t/ ^, C! Y) r$ g
4.这是在描述===操作符。
( j x& T) I( [5 r. }. A% j
! A, t7 i- M6 K8 ^# m5.正确答案是D。PHP脚本在执行时,将首先被解析成“中间”码(也叫opcode,操作码),然后解释器执行。操作码缓存出现在这两个步骤之间,对解析器的输出进行缓存。下次执行该脚本时,将缓存的输出直接送入解释器。这样就就不需要再解析一次了。: S) R! m9 O( _6 J0 }" b/ \
4 _4 A( V- i+ e+ Y. {6.正确答案是A和D。如果RAM太小,进程间将出现资源竞争,服务器将大量使用硬盘交换。同样的,如果允许过多进程同时执行,也会使服务器频繁进行交换,导致速度下降。6 U K, }' Z( ]% U
3 o1 N$ ^' w& y) Q* Z) u7.正确答案是A和C。脚本不检验datebase_query()的调用是否成功,因此将持续执行下去,最终产生错误。此外,$my_id参数没有转义——可能导致代码注入(详见第11章)。
; u% U; P5 {6 t) U3 v }
z2 Q3 }* s, q! |8.答案B和D正确。出现解析错误往往表示脚本中有语法错误,自定义的错误管理器无法捕捉到它们的原因很明显:错误管理器在脚本里,而现在无法解析脚本,管理器也就无法执行。类似的,E_ERROR表示有致命的运行错误出现,比如内存耗尽。因此脚本会立刻被中断,因为解释器无法执行后面的代码。8 u# g2 p) `4 L$ b" d- U' F* ^! {
, G" c) ]' b. z: c9.答案是C。比较操作是一个可交换的操作(就是说结果独立于操作数之外),而赋值不是。因此,比如说,$a==10和10==$a是等效的,而$a=10和10=$a却不是,而且后者会导致一个错误,因为这不是一个合法的操作。确保常量在操作符前面,能保证你不会错误得将比较变成赋值。6 U& t# _6 B; {: ] e
& k) X: D' i' E/ D: b7 ]
10.答案是C。error_log函数能将信息送往一个指定的地址。尽管mail()也可以用,但error_log能自动给邮件添加标题,因此这才是最简单的方法。! z7 E* ]0 m1 e. i" z& S
/ C% K0 I$ Z8 L11.答案是不能。error_reporting函数能关闭所有运行时的错误报告,但对解析时的错误无效,因为解析错误发生在脚本执行之前。+ r+ T3 g$ X. c% L4 a0 Y, `
7 [2 {! {- B& e- \, a6 T; u12.显然,答案是C。概要分析器(profiler)能监视脚本的运行,并记录单个部分的运行时间。它可以用来找出和解决瓶颈。* ~1 j1 ?" y. Y6 g1 G
* H; G5 K& b6 G' i \
13.这是对调试器的完美定义!你可以用调试软件监视脚本运行,同时分析系统资源消耗,从而发现和解决程序缺陷。# g. h/ t3 k* u0 Q4 {+ A1 \
3 a3 G% ^2 D) Q& [
14.trigger_error()和user_error()之间没有区别。后者其实是前者的别名。
5 M0 }6 S0 l" z. k) S6 C. c* }
& T, o) A" m+ r' ?15.答案是D。题目是在描述debug_backtrace函数,它返回一个由所有在代码的特定位置调用过的函数名组成的数组。 |
|