  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14189
- 金币
- 2385
- 威望
- 1647
- 贡献
- 1333
|
[Zend权威认证试题讲解]第十二章 -调试与性能管理
作为一个开发者,无论你经验多么丰富,或者无论你多么努力,你的程序中总会有bug。这是生命中一个必然的部分,如同死亡与缴税(尽管并没有后面两个那么严重)。4 ]/ I7 ~( f2 Z9 X
要想解决bug,首先要能找到bug。事实上,许多开发者花费了无数小时茫然得盯着代码,只是因为他们没有把程序的容错能力摆在首位。忽略了这个部分,那么期望一个没有bug的程序就是——不可能的。+ g# f. L/ g: {# M o( y, ]
本章测试题将考察你对调试和性能管理相关知识的了解,以及如何用PHP做好这两件事。1 C& Z8 Z0 O# R3 }& d d3 T; `" a
+ N/ z! B2 O- K, T% ~& D0 p
% \, D; v# p% U问题9 Q5 e+ N( E7 r& i' u- R/ W
: A# Q/ U. b& T7 v' j3 j1.以下脚本如何用三元操作替代?
$ \$ q! ~7 F% b6 U-
- <?php
- if ($a < 10) {
- if ($b > 11) {
- if ($c == 10 && $d != $c) {
- $x = 0;
- } else {
- $x = 1;
- }
- }
- }
- ?>
复制代码 : I& l+ `5 d/ K, a, U
A.$x = ($a A. < 10 || $b > 11 || $c == 1 && $d != $c) ? 0 : 1;
' q9 F8 j% Q8 C# L) S' T) PB.$x = ($a < 10 || $b > 11 || ($c == 1 && $d != $c)) ? 0 : 1;) }9 h7 e$ i5 a3 _/ S
C.$x = (($a < 10 && $b > 11) || ($c == 1 && $d != $c)) ? 0 : 1;" K* e0 V0 Y' f8 z/ n) j+ ?; K/ ^
D.$x = ($a < 10 && $b > 11 && $c == 1 && $d != $c) ? 1 : 0;
5 Q( @" T8 q4 Y# H. F4 ]! oE.以上都不对
7 N2 ]1 D1 R# J) c3 w) B/ s0 Z5 }( S$ a4 H) l X
, z; h, V- h1 T* h; T0 S
2.有一个脚本由于要从远程获取数据,因而运行速度很慢,以下那种方法能对其进行优化?(双选)8 b8 B3 c S! ~+ \4 ~. D) ^
p3 w: p& j: V' o- c/ QA.安装操作码缓存(opcode cache)' B1 P5 ?6 q3 ?: j2 T2 I
B.优化或者升级你的网络连接* J" e% a( f( F
C.添置更多的硬件/ T# t; M; }' `4 b& x
D.增加服务器的可用RAM% A1 ]7 u/ P7 O# j
E.使用连接缓存' D) ^$ u& Z% A$ V
, M) [: U& v% V
. x, |: ~3 G3 X3 K- t- F" [$ |5 C
3.架设生产环境下的服务器时,需要做哪些步骤?(双选)
# Z& n0 ^2 }, _# J' v
, s {# w& C; z7 m/ nA.关闭错误报告4 [1 Z+ O1 K4 e/ u9 g1 ]
B.打开错误日志
7 N: t* ?7 W' s+ v/ DC.关闭错误日志
0 i2 g x' O# d- P6 M& vD.关闭错误显示
3 ]) ?3 d" O: r% \" K& yE.使用@抑错符; M2 i9 U2 `' c: B' \: A1 x
9 Q$ Y3 Z" ^0 d) K; u2 |' z! N" N5 y- F
4.______操作符能对操作数的数据类型进行严格的比较?* W5 `- F4 L& _
, \% G2 ]- z1 @% Z答案:____________- X1 W$ _ ~2 G3 S$ S1 I. |! ]- p
2 `& ~- A* }2 D5 o4 Q+ |9 [' T
7 u5 i8 y9 O. Y# v! y o* V
5.操作码缓存(opcode cache)能做什么?/ R! ]8 P) H1 D; f: }
5 L. v+ a. h: p
A.把脚本编译成二进制对象,使它运行得更快% X" U( |, c* z+ q% Y+ J
B.代替Zend引擎加快解释器的运行
: {9 a' C) a6 KC.缓存脚本输出以提高执行效率
' S4 |! n* m G" OD.缓存解析器产生的中间码,以提高运行效率
' h" j2 s2 v1 b8 QE.在内存中缓存脚本,减少从硬盘中读取的次数- X. C$ ~$ o6 o% c0 Y& V
) h/ q- [3 N( K I
3 V( d" d/ D% ?9 K2 H6.以下哪些情况容易造成系统资源枯竭?(双选), V+ m9 r( n9 U3 ~+ u0 n# _5 K/ J
: ^9 ^* X. W- u6 ~1 a! ZA.RAM太小
% O, T( e: `& X9 w; g. Y0 G pB.使用了低带宽的连接
( T* W$ T1 m9 p$ JC.虚拟内存超过2GB
3 N; }& A- J5 N6 L9 k2 [/ k( d3 \D.允许同时运行太多的服务器进程9 r: h5 Q9 q9 x, f3 [! g F
E.以上都不对
, ]% l% R3 H# n$ y' ?+ J% | y
) A! ?" M Q- b$ U6 d) Q
4 V' z( t/ T$ ?6 ~7.以下脚本缺了些什么?(双选) 1 V1 C$ H- q9 f' P. p. G" B2 ?
-
- <?php
- $rs = database_query ("select * from mytable where id = " .
- $my_id);
- while ($a = database_get_data ($rs)) {
- var_dump ($a);
- }
- ?>
复制代码
H; w3 e, i1 z' uA.参数出口(Parameter escapement)
" G/ d8 a2 p+ t$ a% S' CB.输出格式化
) Y, ?3 ]3 l0 S' Z- x7 L( `3 YC.错误检查+ {/ K [$ W9 }$ ^' q
D.一个SQL查询- V$ n" `+ F& p6 G3 d9 |
E.以上都不对# G1 n6 ^ f. x$ f, A) Q% ~
* ~6 V, T9 p6 \6 Y J! f" ~$ f/ i7 ?: M
8.以下那种错误类型无法被自定义的错误处理器捕捉到?(双选)) s& o1 m1 W# h" h& {! {1 O7 n1 b
. R- E1 a6 ^3 e+ [+ {0 U3 k5 C
A.E_WARNING
' O n v) m% B) | \ ?B.E_ERROR: M+ n, z' V& A3 a* L$ ^1 w* P x
C.E_USER_ERROR9 Z% r' R% U; G V( a+ ?. x. z
D.E_PARSE
7 A/ _9 F, D8 X+ V: tE.E_NOTICE a7 n+ s8 F) Y5 `! C' J
5 a# K; |: g! W! I) G* p, t% Q: s) Q* j
9.当需要比较一个常量和一个变量时,如何才能保证不会错弄成赋值?
& w0 Z3 v, V: w. w
2 T# o) R. n( e% U) R' MA.把变量转换成int
- b7 q$ f& o' l7 Q) a* hB.使用全等比较符(===)
# |& h5 O2 m; D: s$ BC.确保常量是第一个操作数, _: C {+ j; s' o6 G
D.使用三元运算符
' b/ B' u& m) B: jE.用括号把操作包起来 s; J3 K2 H7 ~5 [4 a# V+ A
) j2 S4 V0 d+ S8 y0 N% s. m, Q# x3 Y
; q: |- ~% K) A9 Y4 F10.要通过邮件给系统管理员发送错误信息,以下那种方法最简便?) H, e" Z, @1 a
5 d0 ^5 u4 c$ j; ~A.创建一个连接远程SMTP服务器的函数8 K U/ p ?. `4 S# `
B.使用mail函数6 s m0 J1 q) a) t% ~$ Z( L
C.使用error_log函数+ z& c+ @8 h3 a L6 I
D.调用sendmial程序# S" h3 A5 T Q
E.使用webservice9 E3 Q/ {+ M% N0 @0 f
; d8 o: b/ R3 b: h# t; k# |
+ k K( x) S( T" }. d11.能否仅调用一个函数就关闭脚本内所有的错误报告?
: g1 l ~+ E* H0 L& A% b
6 b( h7 a% p7 }; uA.能( E1 C( z6 D% h
B.不能
5 e7 l# r+ _) @2 L J, Z* c4 B
, a% P: ^+ l- @- w$ ^( o9 ?
) M8 \! r! M* D0 h1 {3 ~12.概要分析器(profiler)是做什么的?/ m# d0 @0 l7 J0 J" V4 t
5 B9 v8 M* G0 M5 F u
A.创建关于脚本结构的档案+ r) I0 `7 ^- `9 x% O/ Z5 c
B.把脚本转化成UML图
; e! J3 ]! d' PC.精确测算脚本不同部分的运行时间( V" r- X4 D C& Y/ k& V0 x, I
D.计算脚本通过web服务器执行时的维度
; b. p8 {4 ^5 I# t6 I& FE.扫描脚本,识别由常见错误导致的bug' s, A$ X* @9 q" ~
, C* x5 C) |" ?4 \; [
( Z' K( R* F# I ]# K* e13.______能帮助识别和解决bug。: O! G( [8 h+ N2 C# r% L
( h. @# j$ M; F. R* f答案:____________ w0 A6 a" d2 B# W _8 e0 _
4 h$ l% [( ?) x5 ^. A3 w
* X% X) x7 ~7 n5 Y/ z& H1 N14.trigger_error()和user_error()有什么区别?
6 T1 ~, r# R' _, J) g( n9 \, K4 k6 o0 f
A.trigger_error()允许脚本抛出系统级的错误
5 U- T) h. g- k: D4 J2 bB.user_error()允许脚本抛出系统级的错误% L6 c" x) ], i4 M; _! z1 I
C.user_error()不能被用在错误管理器中
2 W" G F1 e% l m( h7 z cD.trigger_error只在PHP5中可用
* o' J6 @' ?' m2 C9 K2 R( AE.没有区别1 Z P2 ]# R) J4 ?- B
8 [- p1 l8 s- U
) u" q/ `6 o$ a* A# C
15.______函数能返回脚本里任意行中调用的函数的名称。该函数同时还经常被用在调试中,用来判断错误是如何发生的。; G- l. K' }! q7 M
0 B+ C# d3 r7 g3 ?+ K
A.print_r
! z. S! Y7 o% l* y) X9 QB.var_dump/ h' }( x( O1 `2 v6 N8 A
C.stack_dump
# t- b" U/ O2 X6 a' c GD.debug_backtrace
- A+ b: H# q8 G0 BE.以上都不对
/ C1 ?& \" t: w$ x O
9 o2 Q/ k+ C$ t答案: _/ m) F4 Y9 [$ |3 N9 _ i
/ o y2 m( P6 E; u
1.答案是E。三元操作符把每个if语句连到一起,作为&&操作的一部分。然而本题中,$x=1这个赋值只在第三个if为false时发生。如果第一个和第二个条件都不成立,$x=1就不会执行。这题对三元操作的应用有些极端,实际应用时,需要根据可读性来决定是否需要用三元运算符(本题这种情况就最好不要用)。6 n' s& S4 Z! g; I5 D
1 N( j( {3 E$ w; U2 g4 l7 `2 U/ B
2.问题是由第三方数据源传输缓慢导致的,而你无法控制这个数据源。你也许能在网络连通性上做些工作(假设问题出在你这一边)。还可以对接收到的内容进行缓存,这样能减少获取重复数据的时间。因此,答案是B和E。
: t0 ^6 J; ~' A. R2 r- ]6 `
( l l4 k ~+ h+ y3.正确的选择是B和D。如果关闭错误报告、使用@抑错符和关闭错误日志,那么在你交付给客户的网站出现问题时,你将很难进行分析和调试。
7 a% _' A( }; p: m* ]+ d( D4 {& i
6 m9 e7 F* m! H8 \9 }1 ?4.这是在描述===操作符。
4 I2 @! t7 T- H* W$ \
( B+ |) J [, V3 V: Z0 u4 K5 _5.正确答案是D。PHP脚本在执行时,将首先被解析成“中间”码(也叫opcode,操作码),然后解释器执行。操作码缓存出现在这两个步骤之间,对解析器的输出进行缓存。下次执行该脚本时,将缓存的输出直接送入解释器。这样就就不需要再解析一次了。+ S) y3 I+ q, q( Q
4 \5 b# r) l4 Y) P. R
6.正确答案是A和D。如果RAM太小,进程间将出现资源竞争,服务器将大量使用硬盘交换。同样的,如果允许过多进程同时执行,也会使服务器频繁进行交换,导致速度下降。
% ?5 }8 T( e" v9 W
* J4 T6 Z9 y7 S! @3 J9 d r* ]7.正确答案是A和C。脚本不检验datebase_query()的调用是否成功,因此将持续执行下去,最终产生错误。此外,$my_id参数没有转义——可能导致代码注入(详见第11章)。) W8 P' U! D2 ^2 S' T, r3 [
$ U2 G+ W* H R" g8.答案B和D正确。出现解析错误往往表示脚本中有语法错误,自定义的错误管理器无法捕捉到它们的原因很明显:错误管理器在脚本里,而现在无法解析脚本,管理器也就无法执行。类似的,E_ERROR表示有致命的运行错误出现,比如内存耗尽。因此脚本会立刻被中断,因为解释器无法执行后面的代码。8 Z# f$ a2 Z& a; Y) v6 v
* g! j9 ~2 |- p! K
9.答案是C。比较操作是一个可交换的操作(就是说结果独立于操作数之外),而赋值不是。因此,比如说,$a==10和10==$a是等效的,而$a=10和10=$a却不是,而且后者会导致一个错误,因为这不是一个合法的操作。确保常量在操作符前面,能保证你不会错误得将比较变成赋值。
- n5 ~4 `& @; u% N0 v( `
# x/ ?1 F" V9 n4 G10.答案是C。error_log函数能将信息送往一个指定的地址。尽管mail()也可以用,但error_log能自动给邮件添加标题,因此这才是最简单的方法。# `8 t. l$ q+ Y, I6 J: G
- U( Q3 A# o( I2 R) [/ o11.答案是不能。error_reporting函数能关闭所有运行时的错误报告,但对解析时的错误无效,因为解析错误发生在脚本执行之前。: `; `; E- C* ?, P% j
, t" B1 ]8 ] \8 C$ r: ]3 @8 m12.显然,答案是C。概要分析器(profiler)能监视脚本的运行,并记录单个部分的运行时间。它可以用来找出和解决瓶颈。9 s0 c, {7 H- R8 h2 a2 z' @ y: ^1 Q
! g" F: }* f" k+ X' `
13.这是对调试器的完美定义!你可以用调试软件监视脚本运行,同时分析系统资源消耗,从而发现和解决程序缺陷。
: q& k1 }. V' b9 f3 y$ ]- X3 B( E! {/ o$ z+ @* V) v5 T8 D
14.trigger_error()和user_error()之间没有区别。后者其实是前者的别名。
; x- T6 m/ D* ]1 B; U) o1 y4 G& a( R
15.答案是D。题目是在描述debug_backtrace函数,它返回一个由所有在代码的特定位置调用过的函数名组成的数组。 |
|