标题:
[Zend权威认证试题讲解]第十二章 -调试与性能管理
[打印本页]
作者:
admin
时间:
2008-5-30 14:32
标题:
[Zend权威认证试题讲解]第十二章 -调试与性能管理
作为一个开发者,无论你经验多么丰富,或者无论你多么努力,你的程序中总会有bug。这是生命中一个必然的部分,如同死亡与缴税(尽管并没有后面两个那么严重)。
) p* S% H7 e, m. [* C
要想解决bug,首先要能找到bug。事实上,许多开发者花费了无数小时茫然得盯着代码,只是因为他们没有把程序的容错能力摆在首位。忽略了这个部分,那么期望一个没有bug的程序就是——不可能的。
0 i3 S! m" u! f; C
本章测试题将考察你对调试和性能管理相关知识的了解,以及如何用PHP做好这两件事。
4 E+ h; K8 e4 f" i5 s
( v/ Q- }' E0 q$ X6 I
& \* ^* o4 y5 j1 _
问题
9 H0 B b9 R# G6 R4 x, K
/ t7 o" [: s. ^2 r
1.以下脚本如何用三元操作替代?
, X6 `, D3 [- z- X6 n
<?php
if ($a < 10) {
if ($b > 11) {
if ($c == 10 && $d != $c) {
$x = 0;
} else {
$x = 1;
}
}
}
?>
复制代码
! ^7 E% ]7 N1 T8 L
A.$x = ($a A. < 10 || $b > 11 || $c == 1 && $d != $c) ? 0 : 1;
: d8 X, ^' U/ h1 R% f1 W- L& y" k
B.$x = ($a < 10 || $b > 11 || ($c == 1 && $d != $c)) ? 0 : 1;
# K6 f: ]* N# X" S$ T$ M+ N# D
C.$x = (($a < 10 && $b > 11) || ($c == 1 && $d != $c)) ? 0 : 1;
$ j% f- L1 \9 v0 k. m
D.$x = ($a < 10 && $b > 11 && $c == 1 && $d != $c) ? 1 : 0;
' S, i. p8 K3 o2 s4 j, r
E.以上都不对
" x( e! Q! u/ C, S2 D0 ?; G) |" i
0 U" \5 J2 U8 b3 x( J) Z
8 b) {+ ]& \/ H5 x5 ?6 u
2.有一个脚本由于要从远程获取数据,因而运行速度很慢,以下那种方法能对其进行优化?(双选)
: m, S4 J) e% C( h% u/ ^
% w- g# {# t/ |! b/ i- R
A.安装操作码缓存(opcode cache)
+ v9 p( d4 \& L, _* m# m" m1 ?: O+ @! V
B.优化或者升级你的网络连接
& T5 l1 t3 F* ^; E# ^% l( A7 v" m
C.添置更多的硬件
$ d, q! M8 U3 w% ^0 W
D.增加服务器的可用RAM
+ g, Y# ]& P2 H1 r2 D# a: E% X; e
E.使用连接缓存
2 `* a0 w; X4 n
/ O5 O" y! F& `9 x2 V
3 C, Q! c: k5 Y; q+ I+ @' O r
3.架设生产环境下的服务器时,需要做哪些步骤?(双选)
. _7 t/ W: a) G& x# ~" n9 @
1 _" A. I, a( B# |2 A" m4 b. A
A.关闭错误报告
; G1 s+ ]$ p2 S& [5 C: w
B.打开错误日志
% L. }" N2 k& Z2 E
C.关闭错误日志
+ |7 u' }6 i0 ~* _ B
D.关闭错误显示
1 x" B5 D% ^; z( W, q0 l3 {
E.使用@抑错符
3 N# P* v! @$ _, S
' O% n- c6 H; X7 M
+ C+ h6 R+ \* y. |( h, ? u+ x4 ?- }
4.______操作符能对操作数的数据类型进行严格的比较?
5 z0 V- j4 _( ^) G' x
* G" M0 t" [/ y/ M: J# y
答案:____________
5 R4 A8 B1 H& X% T$ J% f
& y- Y5 x/ ~" t& s5 @; R0 ~
/ A8 }, L9 C# G. n5 G
5.操作码缓存(opcode cache)能做什么?
& N+ o4 S h, G) \0 c! B
8 ]. A$ }8 S& n+ Q" b# }1 Y+ s
A.把脚本编译成二进制对象,使它运行得更快
2 n; p$ R3 X: K; j3 U
B.代替Zend引擎加快解释器的运行
, c9 R7 |3 Q. N$ q8 e
C.缓存脚本输出以提高执行效率
: R3 d: d8 w: q/ [
D.缓存解析器产生的中间码,以提高运行效率
+ Y! k3 U; ~* z9 Q8 U. A
E.在内存中缓存脚本,减少从硬盘中读取的次数
- Z5 A; T' p+ }) Q( I9 |
5 N% E6 e$ ]: c/ h4 N- Q0 B, D
! x5 u6 A+ K* q9 N
6.以下哪些情况容易造成系统资源枯竭?(双选)
6 j9 u. _, Z C/ [7 t0 g. {4 K* J
* a8 i% ?, j1 h ?8 \: c$ n
A.RAM太小
8 ]# |/ d0 G$ u
B.使用了低带宽的连接
4 t. H) }6 T9 B+ T( Y
C.虚拟内存超过2GB
Z) u: ^, d' u1 I0 W
D.允许同时运行太多的服务器进程
2 Y9 H* |7 V u5 z* Q7 k
E.以上都不对
1 K2 I, s. f5 q% Q5 P3 l
! |; R8 d& k, R/ A/ F
8 w* h$ L* S! R
7.以下脚本缺了些什么?(双选)
# [9 X) X( a( e/ L( w
<?php
$rs = database_query ("select * from mytable where id = " .
$my_id);
while ($a = database_get_data ($rs)) {
var_dump ($a);
}
?>
复制代码
# x* X' w0 v) I4 t+ w
A.参数出口(Parameter escapement)
+ ~- u7 K# |+ n: Z
B.输出格式化
9 h0 m0 i( u4 b1 Z4 A0 B2 G% f! K
C.错误检查
( Q n+ a5 X' R6 e9 h
D.一个SQL查询
- G: V# \. p' J* p: E0 }) ?" I
E.以上都不对
# q3 F: s2 | X: X+ c" y0 y, s
! n# {. I! \6 e7 r. i0 e8 f
( O' M" h* |$ ~6 l
8.以下那种错误类型无法被自定义的错误处理器捕捉到?(双选)
/ l+ d5 N8 @; n! x$ g' t
5 a" r$ |/ _% `: M7 J3 m+ A# _2 W& }
A.E_WARNING
7 n6 @6 L+ Q; \2 w* x, K, D3 ]
B.E_ERROR
) @9 P% O7 N- B% {8 L5 k7 r
C.E_USER_ERROR
3 j6 t( B+ z6 N" I' K
D.E_PARSE
' P/ a4 s9 u: i
E.E_NOTICE
2 G0 b2 w6 R8 T- k" w x
~/ J" r& P$ N* o: ^$ u
. z0 `1 M: h2 h. d
9.当需要比较一个常量和一个变量时,如何才能保证不会错弄成赋值?
5 T8 Q8 H) f5 B* q0 a
# H4 j# Z* Y' _: ?8 X5 T
A.把变量转换成int
# O: l* T0 M: H/ E3 v+ Z
B.使用全等比较符(===)
- i2 ~; N v( i' I7 j7 S0 Z
C.确保常量是第一个操作数
4 I6 R+ l2 Q5 K- I- H
D.使用三元运算符
( `+ m4 [: E1 `" P% }' o
E.用括号把操作包起来
! X" f5 b* {0 t3 B% b2 {6 ?( P* y
2 \" O: v8 C- P4 I# e% W
" R( `3 {* o7 P ^9 l& x( J9 B
10.要通过邮件给系统管理员发送错误信息,以下那种方法最简便?
1 v6 m" F1 U+ p
3 n' h. g2 Q$ B! }- c( y/ ]' j' {
A.创建一个连接远程SMTP服务器的函数
% s3 O% G/ t) M5 _6 l5 w, ~+ Y
B.使用mail函数
- X4 _% y: B/ w
C.使用error_log函数
& P% ?$ ^; j' L1 ^8 S- p. U6 R/ T6 b
D.调用sendmial程序
* E: K* A$ n6 w
E.使用webservice
, u. _2 O. I3 k, [3 }" C" l
' {1 D5 G3 I5 ^
4 J5 S9 r# N3 g9 K
11.能否仅调用一个函数就关闭脚本内所有的错误报告?
1 ^+ Y$ H! L; K. M" b, f
+ I1 I6 P0 y O3 A( {3 O
A.能
1 x- v# ]+ w# e, q' ^- |
B.不能
4 M5 u% W$ Y3 R* F2 f; z
3 @* ^ f K! O8 M) r& r
2 |9 u* V/ f, h/ I
12.概要分析器(profiler)是做什么的?
3 a7 V: B, _8 n+ {( @1 N3 t
: s* J! q |% u( ^- V/ a! ]
A.创建关于脚本结构的档案
& v1 G9 |: Z- E
B.把脚本转化成UML图
* V# M9 a" m" C/ A& S6 V
C.精确测算脚本不同部分的运行时间
/ B. v, f4 ^, h+ V* q
D.计算脚本通过web服务器执行时的维度
; E# q6 ^8 s4 N5 o8 g: L# C
E.扫描脚本,识别由常见错误导致的bug
# i( l9 w; i# B2 t0 X4 k3 b$ c
0 X C2 U6 v9 W* p7 V
/ W# B* b: j0 X0 |! r) Z2 ~4 R
13.______能帮助识别和解决bug。
! N; G" i$ y/ S- [6 X
( k; A3 D* p q1 P% P8 h
答案:____________
/ t, x- B* N6 f7 e5 Z; @( g
. e9 T) X9 d1 u! N4 q
0 [4 {. k1 P4 Z6 @! K
14.trigger_error()和user_error()有什么区别?
5 `4 K+ }1 p2 D9 h+ e% I
4 v6 n- N; j: o. J* c$ Z
A.trigger_error()允许脚本抛出系统级的错误
4 A0 u. Z6 p- C" ~1 F% e) c L8 F
B.user_error()允许脚本抛出系统级的错误
) o: ` U4 `% V/ s- v. [; q
C.user_error()不能被用在错误管理器中
8 v x7 K( |% ~0 ?: x7 U/ b+ B
D.trigger_error只在PHP5中可用
4 U" @. }4 c6 `% H
E.没有区别
- N3 a! U6 A. L" N1 g0 W7 c/ V9 \
$ }6 Y7 p, _4 A
5 Q) m( m% p. ]
15.______函数能返回脚本里任意行中调用的函数的名称。该函数同时还经常被用在调试中,用来判断错误是如何发生的。
8 _4 N+ e# F3 S1 Q4 @$ Q& p; r9 F
. k) ?3 {4 w0 S' V# p# m( T6 c
A.print_r
) R9 P8 y# O3 Z- V
B.var_dump
0 y0 ~( k: h1 L8 L
C.stack_dump
8 r. t% n7 n }; `5 ~5 O6 ^. h
D.debug_backtrace
" b0 _3 m( H9 b0 i$ k& E
E.以上都不对
4 t2 w! i1 X8 i# {
! U- M3 d! j& e/ _2 ^9 M
答案
( {# A+ i( V" o- q
3 L! }& k7 w2 F2 B
1.答案是E。三元操作符把每个if语句连到一起,作为&&操作的一部分。然而本题中,$x=1这个赋值只在第三个if为false时发生。如果第一个和第二个条件都不成立,$x=1就不会执行。这题对三元操作的应用有些极端,实际应用时,需要根据可读性来决定是否需要用三元运算符(本题这种情况就最好不要用)。
' f3 \$ |5 a7 X- P7 \
2 Q9 Q5 m, s* d5 F0 f$ G7 r7 S
2.问题是由第三方数据源传输缓慢导致的,而你无法控制这个数据源。你也许能在网络连通性上做些工作(假设问题出在你这一边)。还可以对接收到的内容进行缓存,这样能减少获取重复数据的时间。因此,答案是B和E。
* ^+ J8 J* ~* a/ H
* R1 r5 `7 j6 [% _
3.正确的选择是B和D。如果关闭错误报告、使用@抑错符和关闭错误日志,那么在你交付给客户的网站出现问题时,你将很难进行分析和调试。
3 u6 |" u- m" ?; N o
3 y7 N1 S8 P w2 B. ]: @
4.这是在描述===操作符。
& M7 K8 Y; [+ a
# a+ }$ m3 F6 T! Q
5.正确答案是D。PHP脚本在执行时,将首先被解析成“中间”码(也叫opcode,操作码),然后解释器执行。操作码缓存出现在这两个步骤之间,对解析器的输出进行缓存。下次执行该脚本时,将缓存的输出直接送入解释器。这样就就不需要再解析一次了。
* i+ Q1 [: C0 f; C& c0 D
" Z, c3 t+ B8 h8 Y
6.正确答案是A和D。如果RAM太小,进程间将出现资源竞争,服务器将大量使用硬盘交换。同样的,如果允许过多进程同时执行,也会使服务器频繁进行交换,导致速度下降。
& @8 p* f. u( w6 G
8 P; Q( J" ? X5 S& u6 ?; C
7.正确答案是A和C。脚本不检验datebase_query()的调用是否成功,因此将持续执行下去,最终产生错误。此外,$my_id参数没有转义——可能导致代码注入(详见第11章)。
0 B' ^+ Q o3 c7 I; D9 T K% ~3 G! Q
( r7 Z) Z6 u4 u0 y+ l) L
8.答案B和D正确。出现解析错误往往表示脚本中有语法错误,自定义的错误管理器无法捕捉到它们的原因很明显:错误管理器在脚本里,而现在无法解析脚本,管理器也就无法执行。类似的,E_ERROR表示有致命的运行错误出现,比如内存耗尽。因此脚本会立刻被中断,因为解释器无法执行后面的代码。
! k! l4 V( R7 _( ?# [ M# z
$ k+ Y0 {" v! F' ?3 g6 [6 f% K
9.答案是C。比较操作是一个可交换的操作(就是说结果独立于操作数之外),而赋值不是。因此,比如说,$a==10和10==$a是等效的,而$a=10和10=$a却不是,而且后者会导致一个错误,因为这不是一个合法的操作。确保常量在操作符前面,能保证你不会错误得将比较变成赋值。
, m# X l5 g2 w3 y4 R, C
) ~( I8 A0 f2 i; s
10.答案是C。error_log函数能将信息送往一个指定的地址。尽管mail()也可以用,但error_log能自动给邮件添加标题,因此这才是最简单的方法。
0 ^3 ?' O+ j7 g6 |3 L
- v, K# c* _2 }; G. ]! Y; X
11.答案是不能。error_reporting函数能关闭所有运行时的错误报告,但对解析时的错误无效,因为解析错误发生在脚本执行之前。
, L4 s1 B# n, V; J% F
* E+ X& X3 Y( j1 b
12.显然,答案是C。概要分析器(profiler)能监视脚本的运行,并记录单个部分的运行时间。它可以用来找出和解决瓶颈。
7 w+ x. F" I! R9 A/ r; h, m
7 J/ j8 `, t2 l. |
13.这是对调试器的完美定义!你可以用调试软件监视脚本运行,同时分析系统资源消耗,从而发现和解决程序缺陷。
! d" A3 j8 ~: S
4 D$ }2 a) M0 j; h/ a9 k0 U; W' e$ g% t( V
14.trigger_error()和user_error()之间没有区别。后者其实是前者的别名。
' Q( ], i/ @' z
! l* K- @7 `/ x/ P9 I
15.答案是D。题目是在描述debug_backtrace函数,它返回一个由所有在代码的特定位置调用过的函数名组成的数组。
欢迎光临 捌玖网络工作室 (http://89w.org/)
Powered by Discuz! 7.2