  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14247
- 金币
- 2414
- 威望
- 1647
- 贡献
- 1362
|
[Zend权威认证试题讲解]第十二章 -调试与性能管理
作为一个开发者,无论你经验多么丰富,或者无论你多么努力,你的程序中总会有bug。这是生命中一个必然的部分,如同死亡与缴税(尽管并没有后面两个那么严重)。6 t0 t6 d, J9 z3 d- w( S5 `
要想解决bug,首先要能找到bug。事实上,许多开发者花费了无数小时茫然得盯着代码,只是因为他们没有把程序的容错能力摆在首位。忽略了这个部分,那么期望一个没有bug的程序就是——不可能的。
/ U! ?& N$ l6 r. O u# d; o1 S本章测试题将考察你对调试和性能管理相关知识的了解,以及如何用PHP做好这两件事。
, _- m6 o$ e+ T. W* w% m7 J5 I* G, ^ D' z# q
3 N# l) Y: }( C5 {) [$ {
问题, K" a+ Y7 Y# `9 E3 g4 h
7 G+ ~3 y _. ]+ P1.以下脚本如何用三元操作替代? . a( m$ u+ E0 g6 Y6 a4 Y2 L
-
- <?php
- if ($a < 10) {
- if ($b > 11) {
- if ($c == 10 && $d != $c) {
- $x = 0;
- } else {
- $x = 1;
- }
- }
- }
- ?>
复制代码
7 Q- _3 U5 j) c; H# r4 B% DA.$x = ($a A. < 10 || $b > 11 || $c == 1 && $d != $c) ? 0 : 1;/ c, f5 {! [# Z) w B% ` T
B.$x = ($a < 10 || $b > 11 || ($c == 1 && $d != $c)) ? 0 : 1;
) t# X9 W [$ l3 i) ?8 SC.$x = (($a < 10 && $b > 11) || ($c == 1 && $d != $c)) ? 0 : 1;1 d* T* _+ [' }8 g
D.$x = ($a < 10 && $b > 11 && $c == 1 && $d != $c) ? 1 : 0;4 z3 a0 B, h- Z! n' D6 N
E.以上都不对 u- X; A% Q7 y" s
& ?2 k. ~7 C2 R$ c0 E
+ ]# ^4 R$ Z! e2.有一个脚本由于要从远程获取数据,因而运行速度很慢,以下那种方法能对其进行优化?(双选)0 d9 j, P* J. E% k% ]; Z
1 V% _9 M' C9 Y3 J
A.安装操作码缓存(opcode cache)
$ u) K/ x/ M7 b- P* C1 OB.优化或者升级你的网络连接
8 `: I6 j0 \5 y$ iC.添置更多的硬件
5 q2 b; I; [8 V% cD.增加服务器的可用RAM$ f2 ?! a3 h$ n: N
E.使用连接缓存 m! I1 F2 X; [" G9 m9 D
0 k& O5 L) _* b+ X7 x0 p/ r: L8 \" k& V6 k0 R, q
3.架设生产环境下的服务器时,需要做哪些步骤?(双选), F4 j. _* M/ i3 g4 e3 t2 R
/ ^/ u2 ~& R9 l5 _' P2 O3 w# g
A.关闭错误报告% M5 E9 E; f, S3 c$ F, n
B.打开错误日志
. H6 C1 }( o4 Y0 V* n7 d/ XC.关闭错误日志+ Z* N# j5 r& i) c, Y: D
D.关闭错误显示0 a' \! Q a0 Z+ |6 T& y
E.使用@抑错符
$ c3 a! Q0 \5 A# x6 N
$ q( b, `' W: t# `
# P/ q5 }7 P& o6 M+ K$ H4.______操作符能对操作数的数据类型进行严格的比较?
4 l8 m9 J* Z- f2 F b+ \7 i" z; ?" e y! C
答案:____________) `* f1 v0 M6 v2 B
% x9 {3 k! }2 o& J
) S( s- N0 f) F8 d5 R; K/ ]2 ]5.操作码缓存(opcode cache)能做什么?5 M9 X6 V# S/ [7 w
: p K3 e) r9 B L1 jA.把脚本编译成二进制对象,使它运行得更快
% W/ d5 `2 K* s; |+ Z; QB.代替Zend引擎加快解释器的运行
) o( H) H: Z! m- q u+ @C.缓存脚本输出以提高执行效率* U" x$ N5 O' U
D.缓存解析器产生的中间码,以提高运行效率) W8 f3 w% T! I6 `1 J0 n
E.在内存中缓存脚本,减少从硬盘中读取的次数
5 G! l4 Y0 H) Q1 A' K
) m) Q* A- v8 t1 E9 z+ V
" j8 B+ l2 M; I0 `6.以下哪些情况容易造成系统资源枯竭?(双选)
; O. N6 ?+ U. k! B& X7 q) m
% S9 Z, m0 `' ?A.RAM太小0 _9 T8 \; Q- u% }5 x# J
B.使用了低带宽的连接/ i9 x+ K! j9 e0 ]4 x
C.虚拟内存超过2GB
* Y2 J# D3 q% y! g( z" ED.允许同时运行太多的服务器进程
* }* h$ x: v& K; J7 G n: PE.以上都不对
( C+ E {' g9 U8 Q' n' Y5 d
7 P/ s' |$ r/ j8 f( d A- ~3 |- r$ ~# R% d4 G7 D
7.以下脚本缺了些什么?(双选)
$ t9 l* x7 E% X! ^1 h' C; s-
- <?php
- $rs = database_query ("select * from mytable where id = " .
- $my_id);
- while ($a = database_get_data ($rs)) {
- var_dump ($a);
- }
- ?>
复制代码
9 |7 a% Y# H0 Z' |$ TA.参数出口(Parameter escapement)
# N7 U* S2 e) R/ X7 m9 S: W% yB.输出格式化
$ \& @/ ^- ]6 P9 { R8 P6 o0 zC.错误检查0 n- @5 f- X3 _
D.一个SQL查询% K1 ~" O4 t z
E.以上都不对
+ }; j' Q8 l; o2 a( o; a/ C. ]$ l y9 U7 ]) c" [! ^" a% i4 I9 c$ m/ O# {
( V% o' c9 m; p9 W9 X b1 Q* l
8.以下那种错误类型无法被自定义的错误处理器捕捉到?(双选)0 ?7 n# w2 @$ n! |
+ |! g* r8 M! A. ?3 R: ?A.E_WARNING$ S, V# ^# j5 e! I7 t
B.E_ERROR
D# _' S" Q9 z# Y, v& AC.E_USER_ERROR1 \! R" e! v- `& L$ r$ c, _( z0 i
D.E_PARSE# Q h1 W5 H; _: W- `1 s
E.E_NOTICE3 ~' U& M) E% O9 q/ G
t- x% p$ T8 w1 Z! |
$ p! H' c( _( G" q) l: V- _, c9.当需要比较一个常量和一个变量时,如何才能保证不会错弄成赋值?
" U* a% @9 i" q; ]2 @
) A- F4 h% O# k. ~( p1 {: G5 EA.把变量转换成int
2 x( Y/ Y# \5 V) _$ w& aB.使用全等比较符(===)
6 u) f. m; ]# r/ N' I' |' ^% t7 w' fC.确保常量是第一个操作数
6 C7 Q$ B& Y3 N5 q) ?3 u0 D; k0 VD.使用三元运算符
9 [1 K4 [5 e) Q5 @& YE.用括号把操作包起来( i V! | h5 w' G
3 l3 B+ G" K0 s' X$ r; o
9 z/ Y. \2 z0 P: K$ E10.要通过邮件给系统管理员发送错误信息,以下那种方法最简便?. _( \8 r3 q1 @& H1 k ?
7 h5 y" y# e3 B% g$ jA.创建一个连接远程SMTP服务器的函数
6 i8 c/ r, L) oB.使用mail函数
1 d1 }, Z) Q% z- b+ c6 PC.使用error_log函数
7 i6 q/ Z q$ t/ ~5 XD.调用sendmial程序, r0 b3 A8 }! L. R% d2 D+ X
E.使用webservice. F: ]2 R$ r! }# V
/ D4 c: ]* E* b# b1 ?- f
5 O1 u2 y3 I6 X" V& I3 l" f$ F0 R; x11.能否仅调用一个函数就关闭脚本内所有的错误报告?& G8 g. ^7 P5 T3 J& Y: @) u
$ \/ `, A9 v. a
A.能; v% O+ k2 M( [3 b/ X9 D: {
B.不能! {6 G. B$ g) v7 Y/ w
- x% a( X( c% h7 g+ i2 U
5 }* ]. J/ k: `9 o12.概要分析器(profiler)是做什么的?2 o' {; }- ?1 G
% p0 W' c: s7 T3 Q1 HA.创建关于脚本结构的档案
' C4 w+ l7 P8 EB.把脚本转化成UML图
- Q, @( U( N v$ c% H+ Y7 ]C.精确测算脚本不同部分的运行时间. s4 P C3 \6 y
D.计算脚本通过web服务器执行时的维度
3 I. p9 T( N* d& Z+ }8 L A0 h9 yE.扫描脚本,识别由常见错误导致的bug
; D/ b+ _# h- j/ h2 w$ O, l7 u4 K
" y' D- X: }& G2 p
, V0 _1 z I. n. b8 v/ U13.______能帮助识别和解决bug。9 A* N# a- Y. Y& Q
! m$ O6 [' E' k" I1 c8 n
答案:____________
' w' u! F* s5 z; k* p/ ]- j" S; S, ]" r4 d2 I. U' S- R
$ d8 Y: A$ B2 ?3 v) E14.trigger_error()和user_error()有什么区别?
: {4 J2 _/ U0 `# z
4 o" h, N$ h+ y" e0 E: L! {( k1 p" HA.trigger_error()允许脚本抛出系统级的错误+ n+ o8 A! ]8 N9 ^
B.user_error()允许脚本抛出系统级的错误
, l# I5 X3 \+ B; u- A) R* @C.user_error()不能被用在错误管理器中
- J- w+ c( j' G, J8 ]$ p, CD.trigger_error只在PHP5中可用/ l! Z7 r' N8 w' `
E.没有区别
& n: y. w& h: G+ q+ M9 F2 N4 E+ o' Q8 z: i: ^) L4 R
+ n# M! C$ A7 H/ w2 `
15.______函数能返回脚本里任意行中调用的函数的名称。该函数同时还经常被用在调试中,用来判断错误是如何发生的。
- X9 f$ G' ?2 t7 H/ p) C
# P* O2 `# w8 [A.print_r7 T/ q1 u; @3 b; A; E3 v0 P2 k
B.var_dump* L: G7 I3 {$ T, `) n) e2 h
C.stack_dump% r! F6 m C8 H
D.debug_backtrace% H8 b& k& {0 J
E.以上都不对5 l# n; t# ^% c
: u9 d. i/ p& j# A f# K答案- e) R% l$ j1 N, Z, e
5 J1 J) ~/ m Q. K1 r1.答案是E。三元操作符把每个if语句连到一起,作为&&操作的一部分。然而本题中,$x=1这个赋值只在第三个if为false时发生。如果第一个和第二个条件都不成立,$x=1就不会执行。这题对三元操作的应用有些极端,实际应用时,需要根据可读性来决定是否需要用三元运算符(本题这种情况就最好不要用)。
, z/ u$ W+ s9 v% v( g8 d) v; X7 `- u2 Y9 U7 g% G
2.问题是由第三方数据源传输缓慢导致的,而你无法控制这个数据源。你也许能在网络连通性上做些工作(假设问题出在你这一边)。还可以对接收到的内容进行缓存,这样能减少获取重复数据的时间。因此,答案是B和E。, _. t# W5 ?/ E: Q/ d+ E
+ C5 C* v* U+ r0 r. A) f
3.正确的选择是B和D。如果关闭错误报告、使用@抑错符和关闭错误日志,那么在你交付给客户的网站出现问题时,你将很难进行分析和调试。" p/ w/ l6 e" v. f5 m5 g2 [) E2 ~
" ]3 w: i% g- y) T% O: f4.这是在描述===操作符。" Q6 G* b% f; M
: H0 O, O7 R9 r7 g" h; ^/ p% v5 ^
5.正确答案是D。PHP脚本在执行时,将首先被解析成“中间”码(也叫opcode,操作码),然后解释器执行。操作码缓存出现在这两个步骤之间,对解析器的输出进行缓存。下次执行该脚本时,将缓存的输出直接送入解释器。这样就就不需要再解析一次了。
- @9 Q& K! K/ J! O7 w# _$ B$ A
6.正确答案是A和D。如果RAM太小,进程间将出现资源竞争,服务器将大量使用硬盘交换。同样的,如果允许过多进程同时执行,也会使服务器频繁进行交换,导致速度下降。6 X$ r" I* L; s1 N! _! r1 w$ D
( o& z3 g8 E7 L e2 g8 \% u( I; s
7.正确答案是A和C。脚本不检验datebase_query()的调用是否成功,因此将持续执行下去,最终产生错误。此外,$my_id参数没有转义——可能导致代码注入(详见第11章)。& [+ w+ ]+ }* s4 b1 R
9 [# @) [* s3 U" V5 Y& w8.答案B和D正确。出现解析错误往往表示脚本中有语法错误,自定义的错误管理器无法捕捉到它们的原因很明显:错误管理器在脚本里,而现在无法解析脚本,管理器也就无法执行。类似的,E_ERROR表示有致命的运行错误出现,比如内存耗尽。因此脚本会立刻被中断,因为解释器无法执行后面的代码。3 k: L% f+ h: l, f+ ~' E+ T
$ W( T: x( r7 j4 M" S1 i) Z+ v7 U+ m9.答案是C。比较操作是一个可交换的操作(就是说结果独立于操作数之外),而赋值不是。因此,比如说,$a==10和10==$a是等效的,而$a=10和10=$a却不是,而且后者会导致一个错误,因为这不是一个合法的操作。确保常量在操作符前面,能保证你不会错误得将比较变成赋值。
+ U! C+ h' z; p' ^9 W
; o$ B0 [8 I* s/ a$ g0 m10.答案是C。error_log函数能将信息送往一个指定的地址。尽管mail()也可以用,但error_log能自动给邮件添加标题,因此这才是最简单的方法。
. D8 B) U' W/ e2 c- z
' J8 S2 m: D# z2 X11.答案是不能。error_reporting函数能关闭所有运行时的错误报告,但对解析时的错误无效,因为解析错误发生在脚本执行之前。4 v, w+ [1 M5 p, K C
) @5 a6 q/ x2 T12.显然,答案是C。概要分析器(profiler)能监视脚本的运行,并记录单个部分的运行时间。它可以用来找出和解决瓶颈。& D' N. M0 {4 ] z# {
4 @0 [ r- z) m
13.这是对调试器的完美定义!你可以用调试软件监视脚本运行,同时分析系统资源消耗,从而发现和解决程序缺陷。
a. E! R8 G/ p+ y r: v9 c
3 O' u7 j: a0 i& q% z14.trigger_error()和user_error()之间没有区别。后者其实是前者的别名。
2 e+ S- @: A% G* @, t9 _7 Z: z* w) B* D& i6 b
15.答案是D。题目是在描述debug_backtrace函数,它返回一个由所有在代码的特定位置调用过的函数名组成的数组。 |
|