标题:
[Zend权威认证试题讲解]第十二章 -调试与性能管理
[打印本页]
作者:
admin
时间:
2008-5-30 14:32
标题:
[Zend权威认证试题讲解]第十二章 -调试与性能管理
作为一个开发者,无论你经验多么丰富,或者无论你多么努力,你的程序中总会有bug。这是生命中一个必然的部分,如同死亡与缴税(尽管并没有后面两个那么严重)。
: d: [. A( c% K9 a6 |9 ~. l
要想解决bug,首先要能找到bug。事实上,许多开发者花费了无数小时茫然得盯着代码,只是因为他们没有把程序的容错能力摆在首位。忽略了这个部分,那么期望一个没有bug的程序就是——不可能的。
) L' M8 n# w* @. @; t
本章测试题将考察你对调试和性能管理相关知识的了解,以及如何用PHP做好这两件事。
- i3 Y1 z8 m# L5 G- k7 m
# {" b+ h% h0 ^* x& Y9 o
3 E7 [5 a7 T; w+ n9 x1 p
问题
6 B, Y) e; G" p, I, T9 S
% Y% j$ i$ I: ]. o) H/ l/ P
1.以下脚本如何用三元操作替代?
0 a# T, U) k7 C/ {# h
<?php
if ($a < 10) {
if ($b > 11) {
if ($c == 10 && $d != $c) {
$x = 0;
} else {
$x = 1;
}
}
}
?>
复制代码
- p5 |' ]: n, G5 f T, m/ J4 m
A.$x = ($a A. < 10 || $b > 11 || $c == 1 && $d != $c) ? 0 : 1;
, Y Y/ ?$ a6 G' d3 s) z+ k4 [% I& C
B.$x = ($a < 10 || $b > 11 || ($c == 1 && $d != $c)) ? 0 : 1;
4 G: c! [8 ~/ D" `2 l/ |- I
C.$x = (($a < 10 && $b > 11) || ($c == 1 && $d != $c)) ? 0 : 1;
; [3 }. }0 T+ v, k8 Q+ o
D.$x = ($a < 10 && $b > 11 && $c == 1 && $d != $c) ? 1 : 0;
, C' M5 F2 Y# O$ r
E.以上都不对
2 X7 t$ |9 s6 K+ e
0 e+ K/ h3 h* ?0 K# v
8 D$ }$ }& O4 h0 c& V
2.有一个脚本由于要从远程获取数据,因而运行速度很慢,以下那种方法能对其进行优化?(双选)
& G1 o9 u9 k4 _+ x" T" A0 h i
) w! b" _% B' n* X* k; n6 K4 s
A.安装操作码缓存(opcode cache)
: d. h1 |4 z5 Y3 @6 c
B.优化或者升级你的网络连接
: d3 D1 ?+ H8 t0 l7 k; E' V
C.添置更多的硬件
2 T- i, F9 n3 o/ ~4 H& e% V1 h
D.增加服务器的可用RAM
6 W L8 a% b5 U4 ?) _
E.使用连接缓存
. ]4 x; U8 W1 Y0 p& X9 Q0 b! w _
5 |8 J' e6 b$ B1 |
& P$ l/ B- }3 ]/ T' @, i D
3.架设生产环境下的服务器时,需要做哪些步骤?(双选)
+ `1 f6 U4 Y0 S7 y6 r4 ~' \1 x
1 P5 g. z1 q; d2 W' w" X
A.关闭错误报告
4 Y; Q' P8 \! m1 Q
B.打开错误日志
8 X- a* _; B; x( k6 ?3 `3 q
C.关闭错误日志
7 L4 n: w8 @( ?5 m
D.关闭错误显示
' X+ A: h: F% w, Z$ Q s. W
E.使用@抑错符
& F- O9 O+ @/ i! T
# \/ b9 j4 w& P/ W2 v( q! u) W
& I( m) {- Q% b2 e
4.______操作符能对操作数的数据类型进行严格的比较?
* \5 _$ f- \0 b8 Y2 N+ K2 g+ V
" T* S H& P+ z" \7 @
答案:____________
5 F! v7 j# t9 G& _
2 c: c& D0 J8 I: g5 t8 x
/ a3 T% H/ F, P- }" ]* i6 X4 [
5.操作码缓存(opcode cache)能做什么?
$ L9 T$ d C$ o9 ^) S. @
2 d2 d. }& G- G n9 L
A.把脚本编译成二进制对象,使它运行得更快
5 F4 r8 Y5 O' B. s* D4 q
B.代替Zend引擎加快解释器的运行
4 e' C+ j$ h5 p0 _% p7 K4 B
C.缓存脚本输出以提高执行效率
! m7 z# H4 f7 o4 F
D.缓存解析器产生的中间码,以提高运行效率
( i# q! p+ r+ I, d% u! f9 d) S( i" J
E.在内存中缓存脚本,减少从硬盘中读取的次数
+ I* H. P0 e8 q2 }, E+ P
4 V3 V& K4 E; d9 L1 T( o
1 D Z* ~' V% G5 K" n+ \
6.以下哪些情况容易造成系统资源枯竭?(双选)
9 B8 Y; S! U! v) V9 g
# n( M8 o3 m/ {
A.RAM太小
: ^ @4 Q# a, F$ _! @0 m" q
B.使用了低带宽的连接
0 n" f, o B2 f; I2 F1 }* Q
C.虚拟内存超过2GB
9 R$ z' E' {$ Q, a$ Y; g
D.允许同时运行太多的服务器进程
7 h: P9 x8 N0 U7 I. {; A0 ^' i
E.以上都不对
1 o- @3 |* g7 ~# t& H
r: o- o7 J: S8 b0 M
1 ?7 C) b$ D3 v K/ L7 v8 y0 w2 j" V
7.以下脚本缺了些什么?(双选)
& ^0 s U$ D" I! i1 M4 d
<?php
$rs = database_query ("select * from mytable where id = " .
$my_id);
while ($a = database_get_data ($rs)) {
var_dump ($a);
}
?>
复制代码
7 T0 ~6 m" ?. e* Y1 K; s* U
A.参数出口(Parameter escapement)
8 ]9 W u9 _' v4 h C
B.输出格式化
& ?$ M1 O6 W/ S' a5 d/ N& S& K
C.错误检查
B) `& g! _8 S! Y6 _$ G
D.一个SQL查询
1 t% ^/ C3 ~ U' O
E.以上都不对
" k1 I H/ {' h* p; {- M0 \) | V
$ H. I$ X ^/ G3 |( W( W
9 u* a2 X9 s6 g% ]' s S* d
8.以下那种错误类型无法被自定义的错误处理器捕捉到?(双选)
0 I6 h0 C, {/ }. {4 Q8 H
, b9 @, Z1 y) P
A.E_WARNING
) E7 b" q. U6 G- }
B.E_ERROR
. t! j5 t+ ]( P( V
C.E_USER_ERROR
1 D2 G, y* O" ^9 H1 J
D.E_PARSE
% d% o2 ^1 Y/ K* L# G
E.E_NOTICE
, W! K/ F9 Z! K" T
& B* J0 z8 p4 r3 ^5 Y) K
! ~) i- P, D; Y8 I
9.当需要比较一个常量和一个变量时,如何才能保证不会错弄成赋值?
* r" N7 r& x* @8 G3 o w
) V. b/ k4 V2 ]. j% U
A.把变量转换成int
9 c2 f, ]5 w7 P& O' q8 i" z
B.使用全等比较符(===)
; G; a: M/ |" y( T
C.确保常量是第一个操作数
, T2 D' ~. ]7 Y
D.使用三元运算符
1 L3 y7 D' X9 I$ S1 S" u2 O
E.用括号把操作包起来
6 Z a, E' x5 Q8 A7 o8 W
6 C/ o$ n9 Y. e4 E0 I: d" B
; i* r- j' F5 A5 j: i, b
10.要通过邮件给系统管理员发送错误信息,以下那种方法最简便?
+ r- T6 _) C" T% q& n- Q
" f. x3 A% g6 U" _: I
A.创建一个连接远程SMTP服务器的函数
; H6 N: {, o% I$ {, ?0 n
B.使用mail函数
; D# u- p3 b# ?; F8 z
C.使用error_log函数
) _% [/ n8 A' f
D.调用sendmial程序
( x; h1 k s4 Q9 e9 q4 v; P
E.使用webservice
& |" }, j4 J* X9 G( K! T+ Z" h; ^
3 [4 H9 G6 v0 k& f4 H& I) k. K X
; i3 a9 \" |. M( @( Z- a" {( m
11.能否仅调用一个函数就关闭脚本内所有的错误报告?
$ D$ e5 p9 a' z% b
3 H$ i) c* B4 I: d4 S2 J/ m; L+ u
A.能
8 J1 I! t: {8 u! @# p) C8 _- [
B.不能
- Z# ~6 y6 _, [* y$ L
7 z6 @2 X# J1 o% c `
+ v0 O( y' m7 G
12.概要分析器(profiler)是做什么的?
& O4 X" J( D' O/ Q
8 z, w I% K) T$ W! l6 d* L
A.创建关于脚本结构的档案
7 m! l ~3 r/ C* Z
B.把脚本转化成UML图
" Y) {' q8 F) J( k% I7 E7 ]; ~
C.精确测算脚本不同部分的运行时间
" ? ~: _' A q( l
D.计算脚本通过web服务器执行时的维度
/ V) I N; P$ b
E.扫描脚本,识别由常见错误导致的bug
9 v1 h' H, [1 G; C" O# C% A! M% h
' @. q- l& O- X/ Q' K* v
4 R; k) N) N% h
13.______能帮助识别和解决bug。
: g5 Z: S/ J' S( B# f5 W2 \
, E0 y( E1 y- ~4 f$ }7 S
答案:____________
- U9 {1 W% u$ @" @# M% B/ T0 e
: B: B( r* Y2 y+ E
9 c# l) P/ h* k, l% Y* @1 Q! T" r
14.trigger_error()和user_error()有什么区别?
4 C+ _6 a" c: U' Z+ C3 Q
2 j' z9 d" ^" ]) K- l- {2 ^
A.trigger_error()允许脚本抛出系统级的错误
* |& F8 h4 B R/ m) @- M6 W
B.user_error()允许脚本抛出系统级的错误
# m: l/ z& ^7 d: }- `# A
C.user_error()不能被用在错误管理器中
7 ?. Y2 V2 N+ T( g5 Z, C7 ]
D.trigger_error只在PHP5中可用
$ ]; O$ ~- }) z# D- V
E.没有区别
9 ~2 f+ g! [5 u
' q0 n$ E% I* @% W% w0 a9 \$ @
% F5 z1 K3 b ~ b% y3 [
15.______函数能返回脚本里任意行中调用的函数的名称。该函数同时还经常被用在调试中,用来判断错误是如何发生的。
: a' @( Z: Y% E% O
( i: X, R) d. z
A.print_r
- K5 M6 \1 L, E7 m$ I: n# h+ z
B.var_dump
: q5 _0 Y ^7 X4 E% ?% l
C.stack_dump
! T7 D4 q2 P _0 ~3 C9 L U# Z
D.debug_backtrace
( ~0 p. ] ?$ [
E.以上都不对
$ b% i* l& T8 n5 S: g2 B
3 `7 H! I4 {3 _- X" @9 _* i; e/ {
答案
3 D" M( O8 ]1 }- U" v
0 J. H' f Z, S4 _$ f
1.答案是E。三元操作符把每个if语句连到一起,作为&&操作的一部分。然而本题中,$x=1这个赋值只在第三个if为false时发生。如果第一个和第二个条件都不成立,$x=1就不会执行。这题对三元操作的应用有些极端,实际应用时,需要根据可读性来决定是否需要用三元运算符(本题这种情况就最好不要用)。
: Y$ M( h2 ~ T
# u$ g2 \ @+ o j% u% \+ S) B* J
2.问题是由第三方数据源传输缓慢导致的,而你无法控制这个数据源。你也许能在网络连通性上做些工作(假设问题出在你这一边)。还可以对接收到的内容进行缓存,这样能减少获取重复数据的时间。因此,答案是B和E。
1 K% @ c% ~/ f
+ d$ M! R- {6 Q9 p
3.正确的选择是B和D。如果关闭错误报告、使用@抑错符和关闭错误日志,那么在你交付给客户的网站出现问题时,你将很难进行分析和调试。
' z4 t4 y8 s9 o# O3 M5 g
2 N% n! @9 L' [, }9 S
4.这是在描述===操作符。
. r! n0 h/ F; G' d* b
8 J, }# L9 [9 v* S- y$ {" B R: z
5.正确答案是D。PHP脚本在执行时,将首先被解析成“中间”码(也叫opcode,操作码),然后解释器执行。操作码缓存出现在这两个步骤之间,对解析器的输出进行缓存。下次执行该脚本时,将缓存的输出直接送入解释器。这样就就不需要再解析一次了。
6 d- ^, G8 | T. n
1 N! x8 a. _# v* h# L5 J* k% o( U1 |# I
6.正确答案是A和D。如果RAM太小,进程间将出现资源竞争,服务器将大量使用硬盘交换。同样的,如果允许过多进程同时执行,也会使服务器频繁进行交换,导致速度下降。
1 J0 u3 |# x: b) k
; }1 T7 ^; Y- [9 Q! |0 L
7.正确答案是A和C。脚本不检验datebase_query()的调用是否成功,因此将持续执行下去,最终产生错误。此外,$my_id参数没有转义——可能导致代码注入(详见第11章)。
8 B! O& |4 R* v7 y1 t) P
" `4 M( N. F- B
8.答案B和D正确。出现解析错误往往表示脚本中有语法错误,自定义的错误管理器无法捕捉到它们的原因很明显:错误管理器在脚本里,而现在无法解析脚本,管理器也就无法执行。类似的,E_ERROR表示有致命的运行错误出现,比如内存耗尽。因此脚本会立刻被中断,因为解释器无法执行后面的代码。
! G9 a# q: [& k$ D
% h3 q. d8 j) F1 \! E1 [6 m
9.答案是C。比较操作是一个可交换的操作(就是说结果独立于操作数之外),而赋值不是。因此,比如说,$a==10和10==$a是等效的,而$a=10和10=$a却不是,而且后者会导致一个错误,因为这不是一个合法的操作。确保常量在操作符前面,能保证你不会错误得将比较变成赋值。
) @7 W: `9 i% h
% u8 _1 V4 V$ K0 c$ V9 z
10.答案是C。error_log函数能将信息送往一个指定的地址。尽管mail()也可以用,但error_log能自动给邮件添加标题,因此这才是最简单的方法。
5 n/ g# V. x- c" [( @4 y3 \- q
( {+ ?: X8 N% d1 _8 t
11.答案是不能。error_reporting函数能关闭所有运行时的错误报告,但对解析时的错误无效,因为解析错误发生在脚本执行之前。
# J f8 x8 @; i" [, F, c
; k' _5 U7 P9 {; Z# m
12.显然,答案是C。概要分析器(profiler)能监视脚本的运行,并记录单个部分的运行时间。它可以用来找出和解决瓶颈。
, Z9 _0 {" i6 C
2 J: y% i: _9 ?+ M W( b, C
13.这是对调试器的完美定义!你可以用调试软件监视脚本运行,同时分析系统资源消耗,从而发现和解决程序缺陷。
, s6 R: H4 K' i* ^+ l$ x
2 P T# n/ @5 ~5 y
14.trigger_error()和user_error()之间没有区别。后者其实是前者的别名。
7 J3 ~ T4 f/ E) q$ `3 i
5 O7 K3 T) a' j# _' [; b
15.答案是D。题目是在描述debug_backtrace函数,它返回一个由所有在代码的特定位置调用过的函数名组成的数组。
欢迎光临 捌玖网络工作室 (http://89w.org/)
Powered by Discuz! 7.2