  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14247
- 金币
- 2414
- 威望
- 1647
- 贡献
- 1362
|
[Zend权威认证试题讲解]第十二章 -调试与性能管理
作为一个开发者,无论你经验多么丰富,或者无论你多么努力,你的程序中总会有bug。这是生命中一个必然的部分,如同死亡与缴税(尽管并没有后面两个那么严重)。
& v, h# d1 b+ _/ H/ N" v, P要想解决bug,首先要能找到bug。事实上,许多开发者花费了无数小时茫然得盯着代码,只是因为他们没有把程序的容错能力摆在首位。忽略了这个部分,那么期望一个没有bug的程序就是——不可能的。) U' u0 s% O8 L w A" U, _
本章测试题将考察你对调试和性能管理相关知识的了解,以及如何用PHP做好这两件事。
5 S# V+ T3 j3 [( P* B) Z D. C, U) e: U8 _9 {+ a( D
" a4 [. l. J' [问题4 b b" i5 m3 S$ N7 z% {
# a7 w" h' W# q& z
1.以下脚本如何用三元操作替代?
4 b" Z- n" B$ L) t: G3 r# ]-
- <?php
- if ($a < 10) {
- if ($b > 11) {
- if ($c == 10 && $d != $c) {
- $x = 0;
- } else {
- $x = 1;
- }
- }
- }
- ?>
复制代码 6 Y: u5 _; [0 E4 ^
A.$x = ($a A. < 10 || $b > 11 || $c == 1 && $d != $c) ? 0 : 1;
% R" H$ I5 w2 m7 z* Z4 E+ @B.$x = ($a < 10 || $b > 11 || ($c == 1 && $d != $c)) ? 0 : 1;
+ T% A# z* m& i8 |: T0 _1 a; k1 AC.$x = (($a < 10 && $b > 11) || ($c == 1 && $d != $c)) ? 0 : 1;
4 [) j5 F' I e" bD.$x = ($a < 10 && $b > 11 && $c == 1 && $d != $c) ? 1 : 0;
8 f/ i% v3 i; WE.以上都不对' H, G# s. K1 e6 l
, L- @) F2 @5 z) V e9 e
& v: Z, e: `4 w) ]/ Q2.有一个脚本由于要从远程获取数据,因而运行速度很慢,以下那种方法能对其进行优化?(双选)
3 K: c( P% }# e$ | W3 Q& w
`8 ~5 K6 I3 w7 i3 zA.安装操作码缓存(opcode cache)
! J) N) Y' m& _( R5 `# S$ u; rB.优化或者升级你的网络连接* o) O, ~- [4 u; j+ o; B
C.添置更多的硬件
2 A) I4 L9 ~" T. S! B2 I. V* M6 w9 ED.增加服务器的可用RAM5 X0 G3 {3 b: `( P
E.使用连接缓存
- n r! O, m# K2 ]/ S, ]8 D, M [* Q
0 l+ d) ~+ V. ^9 f6 H' W, K2 [: ?( G' c! p+ M/ K% a& g2 k( C# g
3.架设生产环境下的服务器时,需要做哪些步骤?(双选)1 L, k; ?( m0 D: k# V
0 K c; i( S' M; _2 ^* K
A.关闭错误报告
$ e! E k7 J# }0 f4 }B.打开错误日志
! ]6 \0 p: {7 }* A1 F# UC.关闭错误日志
( [# x) v* C( g( _/ sD.关闭错误显示/ H5 [1 e' l: n, R* N1 y
E.使用@抑错符
, Z3 ?; f' d/ A: A' v7 z6 l; N) z* e/ S% g0 f- N# W
3 t! Q9 r) \* c
4.______操作符能对操作数的数据类型进行严格的比较?) S) @2 H2 _3 G/ }1 M! g+ R' w& L5 ^
% W3 `: Y! k8 a+ y+ {9 J
答案:____________5 ?& ^* V" [9 E% T5 J7 u& t8 O" m
2 j5 f9 n# V# @( y
. Y5 M+ `9 E. r% d0 O9 ~7 m5.操作码缓存(opcode cache)能做什么? G4 t: h9 p" C* Q, B) ~: }! Z
2 G1 M9 Q8 r+ C2 [8 dA.把脚本编译成二进制对象,使它运行得更快
0 o& t( A1 u! M) N. vB.代替Zend引擎加快解释器的运行, A# e8 A @3 L. h
C.缓存脚本输出以提高执行效率
. @) a; J1 V$ YD.缓存解析器产生的中间码,以提高运行效率6 p/ E- s- x' M3 M
E.在内存中缓存脚本,减少从硬盘中读取的次数( d- w4 i: F7 F6 z
! O! V- y) P; T) w* w. H6 ^
: r% s* H- @* B1 F
6.以下哪些情况容易造成系统资源枯竭?(双选). U& O7 d& J" ?6 f
5 @6 T0 d0 U* w3 f, z* z/ ?5 n7 FA.RAM太小3 u+ L+ E- Z: }9 G0 d
B.使用了低带宽的连接
, Q. a6 o5 V# sC.虚拟内存超过2GB
0 ~- R# ? S+ n' x9 U8 S0 SD.允许同时运行太多的服务器进程" w7 I. n$ d: B
E.以上都不对
( N. ]' a, G- n e8 k# h; }' W5 z: P0 \' ]7 _9 A. e
0 C# Z6 p* D8 Q- O! t
7.以下脚本缺了些什么?(双选)
, z# T$ d' K G7 a, C-
- <?php
- $rs = database_query ("select * from mytable where id = " .
- $my_id);
- while ($a = database_get_data ($rs)) {
- var_dump ($a);
- }
- ?>
复制代码
% X/ G; P3 [6 k3 y2 H0 B3 aA.参数出口(Parameter escapement)
% G M b5 ~3 b) [" x9 |6 RB.输出格式化, f0 M8 g8 F; @8 d* g" O2 c3 M
C.错误检查
# \# a6 l h+ {! r6 k* MD.一个SQL查询
5 K, }2 T4 }2 H! sE.以上都不对
$ Q' F$ I& Z) f- n! w0 V% w9 ]! u/ r" H; y; I+ M# T
7 y& x" E8 i: m: ?: E5 c4 @) g' G& H
8.以下那种错误类型无法被自定义的错误处理器捕捉到?(双选)
+ j0 d( u# t: A; A. q u. i1 w$ g
0 g/ E! W8 x6 AA.E_WARNING
, [3 ]3 t+ i) n9 |6 ]. B5 H$ Q& mB.E_ERROR# c; s$ c$ m1 A! Q8 t
C.E_USER_ERROR
0 q" K# h& M: ZD.E_PARSE
3 G! Z) c* n2 A' x. E6 tE.E_NOTICE
- r. t6 H, N/ [7 y$ O( D
" R+ D; U8 d# \( T% X4 V+ B
0 a. f5 u* `2 A* ?3 w$ h# \9.当需要比较一个常量和一个变量时,如何才能保证不会错弄成赋值?/ W9 _& _9 V% b9 E3 G4 }
# C& q0 o$ i7 I0 lA.把变量转换成int$ H: m, ~. |/ d3 n9 B. x; n7 X
B.使用全等比较符(===)# ]9 ]3 g9 ?8 T z$ a7 l
C.确保常量是第一个操作数
: p C% ^% P6 @0 N. TD.使用三元运算符4 X S8 P* h+ D p4 g$ p
E.用括号把操作包起来
2 Q' r+ q/ h' V% p' o9 g7 z' W F1 `& {
/ U d$ `% J% e! E& T& W5 |
10.要通过邮件给系统管理员发送错误信息,以下那种方法最简便?$ [8 O# l4 k& l) @' i/ x
: _ B% m# h' D" C" q0 U$ X
A.创建一个连接远程SMTP服务器的函数6 A8 w* T& o+ E% Z3 i) C' z
B.使用mail函数
+ g; s4 j" k& m/ w1 E9 uC.使用error_log函数
! Q3 j0 J0 [; N; h& jD.调用sendmial程序
" `$ d; ?( Y% y% CE.使用webservice
2 T8 m! X5 R9 s" g- e6 _$ d
5 W& N. n! N: k4 q% n+ z2 t# g
# f5 y7 R1 X8 R4 k11.能否仅调用一个函数就关闭脚本内所有的错误报告?
3 [9 {- o# D4 b U0 Y1 q0 K7 P& N& y3 {+ t- u; \6 H0 b/ Y
A.能
2 |' `' H1 I- Z+ @0 T1 iB.不能* T% X g4 s: c1 d4 D& T# g
1 s2 c% f& I+ k- d$ A
: a+ K8 O2 [: H) x
12.概要分析器(profiler)是做什么的?5 k- U2 N8 P* J, Z- I$ C. I
9 ]% H5 Y6 Z3 D' \0 |
A.创建关于脚本结构的档案! i. ?; E2 F% i! C! |
B.把脚本转化成UML图
/ E# j- s; Z. R, nC.精确测算脚本不同部分的运行时间
3 G$ h) j$ ~' Q4 y2 T( x- V6 E- V8 E7 {D.计算脚本通过web服务器执行时的维度
- @1 T) r* I( \2 v& |E.扫描脚本,识别由常见错误导致的bug$ I6 L/ Y9 q4 K! g, k8 I
9 h% p6 F% ]8 m3 `% L
# @7 S9 z+ F8 u% F
13.______能帮助识别和解决bug。" E g& y$ P a7 d" s
) x8 [* w7 w0 H, |6 C6 c
答案:____________* j/ A% e. p8 v) o9 e9 z
0 D9 S# G8 u, e& s& t2 q" P7 P* k
; g" @ s* z1 |" X: [' Y8 G7 A9 O14.trigger_error()和user_error()有什么区别?7 y, p4 D2 m1 O) {( q4 m" J9 r
9 F1 a/ l7 B& zA.trigger_error()允许脚本抛出系统级的错误
4 ~, g! C3 T* f2 `- Y @: T6 LB.user_error()允许脚本抛出系统级的错误# _8 v# g, V4 R3 G. Y) i
C.user_error()不能被用在错误管理器中
; x$ v2 x7 G/ J0 d0 OD.trigger_error只在PHP5中可用
8 X1 ^! Q, ^, V, \& WE.没有区别
* S5 \6 t4 j9 `+ ?* p! Q" V# j3 H7 u1 I+ T" h) v k( U& @, u
9 E2 \: d8 l& _3 O# L- r R15.______函数能返回脚本里任意行中调用的函数的名称。该函数同时还经常被用在调试中,用来判断错误是如何发生的。
4 G# L+ m3 @: Q5 }5 }% C0 e: [2 R: a% \# h0 P% r
A.print_r
7 g8 l4 a, I' w8 m4 TB.var_dump
l. o9 E% B1 E9 x8 QC.stack_dump
2 f1 w# ^' ]$ t1 K: xD.debug_backtrace
1 g* e& Z/ ~. d( g8 t$ jE.以上都不对
; V5 p5 a% Y; z: u/ G6 M1 L2 s- y. {
9 l7 b0 | R8 W2 e7 E答案
: E# L W B; \+ C5 ~! f, z3 D3 E7 V" f0 h+ _- A4 g: h
1.答案是E。三元操作符把每个if语句连到一起,作为&&操作的一部分。然而本题中,$x=1这个赋值只在第三个if为false时发生。如果第一个和第二个条件都不成立,$x=1就不会执行。这题对三元操作的应用有些极端,实际应用时,需要根据可读性来决定是否需要用三元运算符(本题这种情况就最好不要用)。
' x6 u7 U- F& ~+ ^* T' c# k
9 o9 I! O; a! i" j9 X2.问题是由第三方数据源传输缓慢导致的,而你无法控制这个数据源。你也许能在网络连通性上做些工作(假设问题出在你这一边)。还可以对接收到的内容进行缓存,这样能减少获取重复数据的时间。因此,答案是B和E。# b2 S0 B& E8 N8 i& p* f% h+ n
. n* [7 c/ T# H8 A( i( H+ j3.正确的选择是B和D。如果关闭错误报告、使用@抑错符和关闭错误日志,那么在你交付给客户的网站出现问题时,你将很难进行分析和调试。& x& p, o* p$ l3 V9 E
! Y( W, _! A2 C4.这是在描述===操作符。3 I1 J4 e+ \5 S" `$ R* F4 U. P* H! q
0 L. B' }. e. b6 l/ t' s( s5.正确答案是D。PHP脚本在执行时,将首先被解析成“中间”码(也叫opcode,操作码),然后解释器执行。操作码缓存出现在这两个步骤之间,对解析器的输出进行缓存。下次执行该脚本时,将缓存的输出直接送入解释器。这样就就不需要再解析一次了。2 W* Y; m# e, Y; c/ z
# l7 V8 q, P' J6.正确答案是A和D。如果RAM太小,进程间将出现资源竞争,服务器将大量使用硬盘交换。同样的,如果允许过多进程同时执行,也会使服务器频繁进行交换,导致速度下降。
$ c. @( E1 {. Y! T9 w) P
) ^* j6 s# u5 o9 S7.正确答案是A和C。脚本不检验datebase_query()的调用是否成功,因此将持续执行下去,最终产生错误。此外,$my_id参数没有转义——可能导致代码注入(详见第11章)。
) x' v* I8 ^6 _( |! j: `3 j& d! E) u6 `% e: U. b
8.答案B和D正确。出现解析错误往往表示脚本中有语法错误,自定义的错误管理器无法捕捉到它们的原因很明显:错误管理器在脚本里,而现在无法解析脚本,管理器也就无法执行。类似的,E_ERROR表示有致命的运行错误出现,比如内存耗尽。因此脚本会立刻被中断,因为解释器无法执行后面的代码。( b! d( N) [! R+ T9 x
0 r! t- E7 u4 R3 {2 G* g* h5 i, G9.答案是C。比较操作是一个可交换的操作(就是说结果独立于操作数之外),而赋值不是。因此,比如说,$a==10和10==$a是等效的,而$a=10和10=$a却不是,而且后者会导致一个错误,因为这不是一个合法的操作。确保常量在操作符前面,能保证你不会错误得将比较变成赋值。
u" m+ j! B5 ?8 m D
2 ]* Y" k, F: q: Q* C10.答案是C。error_log函数能将信息送往一个指定的地址。尽管mail()也可以用,但error_log能自动给邮件添加标题,因此这才是最简单的方法。
# v5 ~0 B& ]1 k4 G7 w" @. E! r( ]# f7 I# K1 J' T1 H* i
11.答案是不能。error_reporting函数能关闭所有运行时的错误报告,但对解析时的错误无效,因为解析错误发生在脚本执行之前。
$ _3 a4 H3 g1 o. K$ l* F, D
9 K- D! @. C& D& ] X! B, j12.显然,答案是C。概要分析器(profiler)能监视脚本的运行,并记录单个部分的运行时间。它可以用来找出和解决瓶颈。
9 N u2 Y" j9 i& @3 E0 E+ c/ h9 m' W/ _. M3 K9 s. N
13.这是对调试器的完美定义!你可以用调试软件监视脚本运行,同时分析系统资源消耗,从而发现和解决程序缺陷。7 z/ n% Z5 J( o) v9 E
( m6 ]$ D. U. u$ c14.trigger_error()和user_error()之间没有区别。后者其实是前者的别名。
. J8 |6 P2 {" z- q$ o: [# E( k( Q' |0 _! c) Z7 M/ q
15.答案是D。题目是在描述debug_backtrace函数,它返回一个由所有在代码的特定位置调用过的函数名组成的数组。 |
|