  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14161
- 金币
- 2371
- 威望
- 1647
- 贡献
- 1319
|
[Zend权威认证试题讲解]第十二章 -调试与性能管理
作为一个开发者,无论你经验多么丰富,或者无论你多么努力,你的程序中总会有bug。这是生命中一个必然的部分,如同死亡与缴税(尽管并没有后面两个那么严重)。; ~1 q5 q9 c( \: u
要想解决bug,首先要能找到bug。事实上,许多开发者花费了无数小时茫然得盯着代码,只是因为他们没有把程序的容错能力摆在首位。忽略了这个部分,那么期望一个没有bug的程序就是——不可能的。
! w; N" P. I2 Q( A* @本章测试题将考察你对调试和性能管理相关知识的了解,以及如何用PHP做好这两件事。/ }& O0 R4 K% d# z4 x
9 P- Q# l/ S; `8 P4 e! l' A. T1 r! Z/ p# h4 T9 ?0 V
问题3 R6 d) g- H9 H1 c: t
2 e% Y. _: I2 ]0 n' h( J- F8 d1.以下脚本如何用三元操作替代? / l1 T5 q+ P. _
-
- <?php
- if ($a < 10) {
- if ($b > 11) {
- if ($c == 10 && $d != $c) {
- $x = 0;
- } else {
- $x = 1;
- }
- }
- }
- ?>
复制代码 % A" {" _+ ]& H# }, o' ~
A.$x = ($a A. < 10 || $b > 11 || $c == 1 && $d != $c) ? 0 : 1;
+ Y! f: A# K( B, Y0 ZB.$x = ($a < 10 || $b > 11 || ($c == 1 && $d != $c)) ? 0 : 1;
5 b' {9 G: l' g( N" IC.$x = (($a < 10 && $b > 11) || ($c == 1 && $d != $c)) ? 0 : 1;
" u8 @' t# H; q' E6 b% \; ]D.$x = ($a < 10 && $b > 11 && $c == 1 && $d != $c) ? 1 : 0;
* @9 [* G) {6 U$ \8 J+ z) h$ GE.以上都不对& g) F5 p! G5 F
8 B' l# ^ E$ ?% k) O: J Q- C+ `: B5 A& P8 M' q
2.有一个脚本由于要从远程获取数据,因而运行速度很慢,以下那种方法能对其进行优化?(双选)
0 {( Z3 ~1 ? W7 L# i1 ~6 u1 n6 H# B3 [5 q/ [% f$ L
A.安装操作码缓存(opcode cache)
, B" B! D3 D0 b$ G" zB.优化或者升级你的网络连接. B) J( M, F9 O) m1 J; s9 |
C.添置更多的硬件
1 V9 v/ |& I# t8 k3 FD.增加服务器的可用RAM& _/ T2 _0 k* e5 F3 y, j; z
E.使用连接缓存 K& {" ~6 X9 D- ~5 E, @7 [: H
) M7 J [6 u1 n) ^( L: ?
_' }+ `* p% O: o- I3.架设生产环境下的服务器时,需要做哪些步骤?(双选)
* t! C% t5 M' A c" r; a( O0 Z) g8 q: d5 q
A.关闭错误报告, E8 L# t; ^$ C' c+ C
B.打开错误日志7 q0 z- ~3 {- c) |# E' E
C.关闭错误日志1 W5 u7 U1 m/ E7 K
D.关闭错误显示
" w$ U) c: G' g( M9 X7 @" ]$ HE.使用@抑错符' ?' r7 }( z* R" @+ u
; \' L+ Q. W2 Z$ |) _% }
8 C- O# ?- i* s
4.______操作符能对操作数的数据类型进行严格的比较?
# D; M( c( k7 @# K& N$ f8 _! f8 |1 |& F! o V) [
答案:____________9 f% b4 |( d9 k* \
( U# O) e3 P W! h B' o. X/ m
! [! A+ r4 I0 `$ S3 t
5.操作码缓存(opcode cache)能做什么?
; Y: ?. d4 I" I+ |" J' K/ s& q2 }- u0 W0 }4 x
A.把脚本编译成二进制对象,使它运行得更快* A6 c0 {1 Z" |/ V' P0 j1 \( F
B.代替Zend引擎加快解释器的运行- d. D3 _% g e- c1 Z' l5 B
C.缓存脚本输出以提高执行效率% x# e G1 j! d& b. ?6 [# F
D.缓存解析器产生的中间码,以提高运行效率
X8 |" d) Q4 ]& q J) pE.在内存中缓存脚本,减少从硬盘中读取的次数+ l, m1 _' |: c: x# D' C
# b; f% `5 f' E P, r1 O* b: w( N: m& z% C
6.以下哪些情况容易造成系统资源枯竭?(双选), f) n2 }3 c# i ~3 i. h
- o; H& B" \1 L: eA.RAM太小9 F" @/ O4 g1 q/ c( u
B.使用了低带宽的连接
n* j5 b" B/ I, {8 g5 v# Z' \C.虚拟内存超过2GB9 ?% L4 P8 C# ^( |5 Z6 E
D.允许同时运行太多的服务器进程/ r) ]" y# L4 X3 b3 A
E.以上都不对
# j1 ?) B2 _4 n" P# J8 [ {
) ]6 }9 l- U* l! C' B& Y+ X, ^' G( [
7.以下脚本缺了些什么?(双选)
: Z m3 D$ a: ^- ^# T# j-
- <?php
- $rs = database_query ("select * from mytable where id = " .
- $my_id);
- while ($a = database_get_data ($rs)) {
- var_dump ($a);
- }
- ?>
复制代码
: \, U4 X- ^+ ~! _% gA.参数出口(Parameter escapement)
6 `% ?% I$ R5 wB.输出格式化
- r( R* b }! L) ]* }+ X1 }; }C.错误检查, T' P) F% }+ y$ K
D.一个SQL查询
6 a. V: G* a* Y- J4 v8 kE.以上都不对( Z+ J. j- N* w% N5 l8 c
' b5 _6 N6 ~! t2 T4 j, Z/ O1 F- r+ K6 m2 s$ c9 I7 F
8.以下那种错误类型无法被自定义的错误处理器捕捉到?(双选)' G8 n) x# n! |- o$ ~) ^0 u; u
5 j% D2 |4 i# Z$ h. \
A.E_WARNING
$ y. }2 E, [: b: RB.E_ERROR5 c4 _' }" i3 _ k+ Z! x; d
C.E_USER_ERROR. y( `$ ?9 w2 n6 p: k
D.E_PARSE
; p" o" g# u4 F+ P# WE.E_NOTICE- x, w$ E" n% U) F+ s
/ o, e) E/ [8 w/ Y; c4 a6 h
1 W3 |; [- Y- y2 u9.当需要比较一个常量和一个变量时,如何才能保证不会错弄成赋值?
! y( ?, p! t$ v
0 O3 i; G; e9 |A.把变量转换成int
; o: A& M. {. v" f* o$ WB.使用全等比较符(===)
7 o( W. m; x( A0 S9 pC.确保常量是第一个操作数
4 A0 u) f4 J# U% R! o4 _; p" N, VD.使用三元运算符2 U/ e4 ]. {1 E0 D6 O
E.用括号把操作包起来/ }; v# ~& [! Q6 @
- V$ @: @: j9 ]9 e
2 i" r- O7 E# [ B$ ?! S: }2 J10.要通过邮件给系统管理员发送错误信息,以下那种方法最简便?: D9 P6 Q# k! Z' \# ?
) V5 x$ a8 Y9 ~$ B
A.创建一个连接远程SMTP服务器的函数, V: A# L) _ d( h) e8 Y$ E
B.使用mail函数$ F f: L# P- r, k
C.使用error_log函数8 ` q P4 q- U+ ^$ N$ F$ q
D.调用sendmial程序
2 N+ ?7 ]: \6 ]* RE.使用webservice- r- f1 D$ x0 K D
- s9 O: H1 E8 ~+ R( A2 N: R3 ~' N1 X+ f; D [3 |' m' ]) S
11.能否仅调用一个函数就关闭脚本内所有的错误报告?7 i% u" r8 J8 ]+ k6 _* N
- E* B7 Q& r. a. Q; ^7 v+ G% fA.能
{1 ]! e1 {, d) E0 IB.不能
+ D n- M* d( a: o
+ j. t5 s9 T5 I/ f
9 A$ j( J' L& E& w: ^12.概要分析器(profiler)是做什么的?# ]7 v' s- c$ z9 Y9 ~ I* [
6 o) _, \$ R) w& Q6 V- u
A.创建关于脚本结构的档案. t) \2 B; c4 l
B.把脚本转化成UML图, |+ n8 N: \. [2 U
C.精确测算脚本不同部分的运行时间1 A* W5 a7 g- [4 I$ x
D.计算脚本通过web服务器执行时的维度
7 k a6 w1 y' P5 y6 C9 _' EE.扫描脚本,识别由常见错误导致的bug
) w% w5 k' y- J3 S( G
! n+ G! K# F1 ?
e/ O. W) q3 ?13.______能帮助识别和解决bug。
; h, k% Q, e- Y. x x! `8 f" o
+ p3 r, m: k6 a- V4 h$ c9 h答案:____________
4 G; B, Z" C! e9 l: }
$ }, P4 |8 a+ _, e* ?3 }% p7 l9 _. n. `5 g' p% \$ ~9 |
14.trigger_error()和user_error()有什么区别?$ o# f4 i9 |/ z/ o
B) {' T0 w Y
A.trigger_error()允许脚本抛出系统级的错误
9 l! m# j0 E+ j0 q+ D8 L; [ YB.user_error()允许脚本抛出系统级的错误
) e1 w9 p6 P# K: a" }" q# Q( EC.user_error()不能被用在错误管理器中
* V: @# J8 r0 h; Z1 M/ V E# G) kD.trigger_error只在PHP5中可用8 b6 ^" o4 m% |! {
E.没有区别
% W5 h3 z2 T* O& |5 o' R- s w3 N- C' g) E
1 [; {$ S9 J# b3 W; p15.______函数能返回脚本里任意行中调用的函数的名称。该函数同时还经常被用在调试中,用来判断错误是如何发生的。6 j+ u5 m" w, j- b$ z/ ^5 v
% r, y) h: F) ~( d, `A.print_r, x7 I! h4 A$ U8 u
B.var_dump+ m* l, `( ?- V. J1 c& n: m9 H' V
C.stack_dump
: v2 C; D W/ g6 s! q/ @( OD.debug_backtrace
: j* h) G5 @8 @: HE.以上都不对
/ C' x% d( O8 Z l* {0 Z$ \2 f0 U1 u( v3 r" o' N
答案4 ~/ `8 x8 z7 d
) X; I2 ^/ S: | ~4 J) M
1.答案是E。三元操作符把每个if语句连到一起,作为&&操作的一部分。然而本题中,$x=1这个赋值只在第三个if为false时发生。如果第一个和第二个条件都不成立,$x=1就不会执行。这题对三元操作的应用有些极端,实际应用时,需要根据可读性来决定是否需要用三元运算符(本题这种情况就最好不要用)。
j/ @& f! ~0 |- r( _7 D# H
V4 a: D% u9 N* N; Q" H0 X2.问题是由第三方数据源传输缓慢导致的,而你无法控制这个数据源。你也许能在网络连通性上做些工作(假设问题出在你这一边)。还可以对接收到的内容进行缓存,这样能减少获取重复数据的时间。因此,答案是B和E。
! O( U3 U- v5 Z, k
5 m4 n3 t" C" |& s, s3.正确的选择是B和D。如果关闭错误报告、使用@抑错符和关闭错误日志,那么在你交付给客户的网站出现问题时,你将很难进行分析和调试。' B; U' e7 o% G. C9 d
, t* u: \8 A5 r+ h5 p) R$ N2 p, w4 q+ R4.这是在描述===操作符。
9 a/ u5 G; `; G- w) l% t2 H8 _. A$ B- Z
5.正确答案是D。PHP脚本在执行时,将首先被解析成“中间”码(也叫opcode,操作码),然后解释器执行。操作码缓存出现在这两个步骤之间,对解析器的输出进行缓存。下次执行该脚本时,将缓存的输出直接送入解释器。这样就就不需要再解析一次了。7 f$ K. F c5 m/ c( U6 q
& H! R8 L( I4 |- I, O. f3 _6 Z& @
6.正确答案是A和D。如果RAM太小,进程间将出现资源竞争,服务器将大量使用硬盘交换。同样的,如果允许过多进程同时执行,也会使服务器频繁进行交换,导致速度下降。1 x' h2 [$ k# H' j3 Q/ Z0 z1 s7 A: `
% o* z$ z7 |1 ^, y' K, k' `4 i
7.正确答案是A和C。脚本不检验datebase_query()的调用是否成功,因此将持续执行下去,最终产生错误。此外,$my_id参数没有转义——可能导致代码注入(详见第11章)。
+ a9 H i4 T+ C5 @$ f1 l4 l1 U5 j4 V9 q; ^( N, h" R! r5 ]
8.答案B和D正确。出现解析错误往往表示脚本中有语法错误,自定义的错误管理器无法捕捉到它们的原因很明显:错误管理器在脚本里,而现在无法解析脚本,管理器也就无法执行。类似的,E_ERROR表示有致命的运行错误出现,比如内存耗尽。因此脚本会立刻被中断,因为解释器无法执行后面的代码。
6 N+ @$ d8 K7 \: i! m j+ }' _
8 I, }4 K. _: [+ q& T; ~. M9.答案是C。比较操作是一个可交换的操作(就是说结果独立于操作数之外),而赋值不是。因此,比如说,$a==10和10==$a是等效的,而$a=10和10=$a却不是,而且后者会导致一个错误,因为这不是一个合法的操作。确保常量在操作符前面,能保证你不会错误得将比较变成赋值。2 \6 s( u) }* X' V
2 {. u9 y w* X! e, g! { z
10.答案是C。error_log函数能将信息送往一个指定的地址。尽管mail()也可以用,但error_log能自动给邮件添加标题,因此这才是最简单的方法。
9 ^5 i/ ^9 [0 M2 A* D
/ m, r8 S; x, t9 N11.答案是不能。error_reporting函数能关闭所有运行时的错误报告,但对解析时的错误无效,因为解析错误发生在脚本执行之前。
7 u5 q. G1 }. @! c- Y& h+ i, `* [0 w0 @0 ~9 S) g4 y/ l) \8 ~; P# g; c
12.显然,答案是C。概要分析器(profiler)能监视脚本的运行,并记录单个部分的运行时间。它可以用来找出和解决瓶颈。
+ S( ` [, `, z& x
3 Q2 ?9 Q. k6 W: C13.这是对调试器的完美定义!你可以用调试软件监视脚本运行,同时分析系统资源消耗,从而发现和解决程序缺陷。. `2 M4 q' c3 Q
2 W" P; T7 D0 K& W
14.trigger_error()和user_error()之间没有区别。后者其实是前者的别名。
# M6 V T, e# Z% S" B8 }6 C1 z- K5 _5 A
15.答案是D。题目是在描述debug_backtrace函数,它返回一个由所有在代码的特定位置调用过的函数名组成的数组。 |
|