|
  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14347
- 金币
- 2459
- 威望
- 1647
- 贡献
- 1407
|
[Zend权威认证试题讲解]第十二章 -调试与性能管理
作为一个开发者,无论你经验多么丰富,或者无论你多么努力,你的程序中总会有bug。这是生命中一个必然的部分,如同死亡与缴税(尽管并没有后面两个那么严重)。1 ^1 [5 d+ u: O$ j6 P8 p
要想解决bug,首先要能找到bug。事实上,许多开发者花费了无数小时茫然得盯着代码,只是因为他们没有把程序的容错能力摆在首位。忽略了这个部分,那么期望一个没有bug的程序就是——不可能的。
7 `2 d! \1 Y' g6 a, E本章测试题将考察你对调试和性能管理相关知识的了解,以及如何用PHP做好这两件事。3 u! I& S p9 a7 z' |9 g
0 l1 ~3 S7 Z8 S6 o; @
* i2 V$ E/ ?. |/ v g& \1 o' H: m问题
, ~$ M" S& z) W# n# d
! Y3 B* l) K* o4 X K6 c$ Y1.以下脚本如何用三元操作替代?
9 O8 ^5 V0 j9 q: i, D) | g-
- <?php
- if ($a < 10) {
- if ($b > 11) {
- if ($c == 10 && $d != $c) {
- $x = 0;
- } else {
- $x = 1;
- }
- }
- }
- ?>
复制代码
5 t, i; _% O8 f( X0 qA.$x = ($a A. < 10 || $b > 11 || $c == 1 && $d != $c) ? 0 : 1;
9 o5 [. e9 x; v% w" C7 wB.$x = ($a < 10 || $b > 11 || ($c == 1 && $d != $c)) ? 0 : 1;7 g, y$ n( i+ {; l* k9 u$ i8 m
C.$x = (($a < 10 && $b > 11) || ($c == 1 && $d != $c)) ? 0 : 1;
1 \: h/ s' t X7 t1 yD.$x = ($a < 10 && $b > 11 && $c == 1 && $d != $c) ? 1 : 0;! |( o q( Y9 [3 m
E.以上都不对
. |" T& t$ Y: B `# a) e* X. X* a# @ O0 X
, M! e' F5 G0 E5 `' s7 t$ Z
2.有一个脚本由于要从远程获取数据,因而运行速度很慢,以下那种方法能对其进行优化?(双选)
% d( t2 H& \2 \5 [
h( Y: X( _% Q; e$ J* i; BA.安装操作码缓存(opcode cache)6 I O: {& P, D1 j* ~0 P( V) [
B.优化或者升级你的网络连接$ s! n- ]) J2 P3 L; G9 S3 ]
C.添置更多的硬件/ L6 s* T' U0 H( e2 e: R! p
D.增加服务器的可用RAM& X) Q. L5 j+ X5 f% ]
E.使用连接缓存- M+ X! O0 X$ _6 x' E: Z7 C$ v' h( }
$ ~0 [. r8 R$ F9 l6 U+ g
- S/ {7 Y# m' |1 j$ w( s3.架设生产环境下的服务器时,需要做哪些步骤?(双选)
h$ e( P$ ^, j/ Q, l: B2 ?
2 {7 q; P, G& N+ L) Z# o- IA.关闭错误报告
: Z. X2 G* Z- c* ~! UB.打开错误日志
+ f/ H0 j! K4 G7 ^: a% z( M- qC.关闭错误日志
5 ]3 e: K; K7 R; X/ T3 W; h/ KD.关闭错误显示
- A2 z0 l5 j5 B3 IE.使用@抑错符
" h( f) _+ N8 Z" c9 u8 c5 d
9 T/ B7 k, X/ A, [9 V1 {
. p% p& Y9 L* |, W$ V- x$ J1 G, z$ h4.______操作符能对操作数的数据类型进行严格的比较?
, K! Y5 g5 g; V' M- e1 B, p
% _8 C4 o$ P8 J6 p# m答案:____________
: m1 J7 L# y( J. ]- P: X4 h( a: g+ c F( i8 f2 L5 M
( R% n9 e! M, T: I% X5.操作码缓存(opcode cache)能做什么?
) {3 Q" X5 V6 C6 e1 o3 _: ^. D: S$ O$ i+ [
A.把脚本编译成二进制对象,使它运行得更快% ]) j4 J% I" P+ R/ Z
B.代替Zend引擎加快解释器的运行2 G3 x. K; [2 s+ L; |
C.缓存脚本输出以提高执行效率
* R* w% w; Z$ K* u; zD.缓存解析器产生的中间码,以提高运行效率) n9 H; y. ]0 H5 g% q2 x
E.在内存中缓存脚本,减少从硬盘中读取的次数: m, {: R* b9 l
& C! r2 X. x9 g# H$ F X3 z; p! [$ P3 u; K2 N* t9 w
6.以下哪些情况容易造成系统资源枯竭?(双选)* W: M7 J1 M- N7 e. s) E; F5 {! u
: Q& x* Z) B! FA.RAM太小
- m" Z7 v- u) J7 ?1 v3 o3 EB.使用了低带宽的连接
J2 {5 J4 ]2 Q% JC.虚拟内存超过2GB
1 a* k# _8 y, I" g/ l2 a- I$ H4 ?& A. HD.允许同时运行太多的服务器进程
# C8 p3 l: _+ f- t; J. j" vE.以上都不对
; ]6 C* W8 O" p* D$ b X
0 Q9 |6 V- w2 H2 h" T3 Y+ k: l6 Y( ~/ @1 H# h4 u5 i* O
7.以下脚本缺了些什么?(双选)
7 _4 u0 D8 e2 i- w4 k5 D-
- <?php
- $rs = database_query ("select * from mytable where id = " .
- $my_id);
- while ($a = database_get_data ($rs)) {
- var_dump ($a);
- }
- ?>
复制代码 9 D' `' ^. f( j* @: K
A.参数出口(Parameter escapement)5 H* s, D5 F. Y
B.输出格式化
7 E C" b. {2 j1 ~ ^. `* |C.错误检查% _& ^" S3 v2 I0 ]( ]& p4 N+ p+ p
D.一个SQL查询
' r4 Y1 `+ B; `* YE.以上都不对# e9 N' q8 q2 U, g' ]
0 A8 |" B/ G! w: I% x
Z% d/ }: ]. R8.以下那种错误类型无法被自定义的错误处理器捕捉到?(双选)
. \( ]. }! g, u+ D2 T9 @/ f0 {! B( }1 C
A.E_WARNING
& r6 P2 h W) cB.E_ERROR
$ n( S: m3 ?$ G+ W5 wC.E_USER_ERROR
3 A! [2 j) G; ?) B+ BD.E_PARSE
& x4 x& [/ E H9 k% VE.E_NOTICE1 B; S, Q9 f: n. s
& F! @- R0 s) b, Y1 s4 r- A6 E1 D5 l6 t
9.当需要比较一个常量和一个变量时,如何才能保证不会错弄成赋值?5 v7 V% _0 D# R3 o' N5 c* P
1 M/ F" \4 o) Z- B1 w' m9 YA.把变量转换成int
+ B6 C i( k& T2 q) ~, rB.使用全等比较符(===)
& J( T9 ?! O1 O+ TC.确保常量是第一个操作数
C# p. f6 j9 }5 s4 ?D.使用三元运算符$ t: @+ w ]' M
E.用括号把操作包起来! E, w* i+ R; ~( O0 w. ], N6 z
" s3 i4 u+ w! M2 X! Q! {- A% a5 @" u Y
10.要通过邮件给系统管理员发送错误信息,以下那种方法最简便? Q( E8 H" q6 D# D8 {# T9 L
O+ [ Y3 ~7 C" o! l4 {A.创建一个连接远程SMTP服务器的函数7 x; y+ ]0 B8 F5 V
B.使用mail函数7 d2 N# v, [+ x' P
C.使用error_log函数
6 A, ?" t9 V5 Y6 m. a$ B/ TD.调用sendmial程序
5 g- R7 t# l/ t2 a jE.使用webservice7 ]8 ]/ U$ X+ z1 ^. h( E
3 x8 d: m% u+ c9 K/ B5 W
" f" g8 \; O- l5 `11.能否仅调用一个函数就关闭脚本内所有的错误报告?8 y, t4 m2 r% `: ?; Y4 V* O
$ v8 u9 h: H: k% f5 C- [+ ]
A.能# {# p4 M, K- w0 w- }' T
B.不能% m, y$ A D( G, j X
# M+ j, ~% |+ Q, l5 M: Y1 r& O1 V# g- g$ [; ~
12.概要分析器(profiler)是做什么的?
+ \7 g; N8 u w- W" R' a% R9 u. Q
9 o, B f: l+ l. @4 iA.创建关于脚本结构的档案, B" M. `$ g0 s
B.把脚本转化成UML图
+ O# M: G, Y5 J5 ]C.精确测算脚本不同部分的运行时间
' \ _" B0 {# K' L1 nD.计算脚本通过web服务器执行时的维度! P9 E# h4 m9 b, @
E.扫描脚本,识别由常见错误导致的bug2 F( ?- V) ` g' `2 A5 h7 [
! D9 t' g' V7 J4 _
# o+ m; G9 n. G F6 o
13.______能帮助识别和解决bug。
; v h' ]" c5 j" q! M+ {
9 M5 K1 a" H! N* W答案:____________ A ~5 ]' [" j9 L0 j% _
( {' u5 b' y7 ?4 r( `6 @4 f1 U! R" c
14.trigger_error()和user_error()有什么区别?
. ?' F1 w2 g1 w) K% _& r) B/ R; Q. x- J' b
A.trigger_error()允许脚本抛出系统级的错误
* h' d4 v/ _4 w/ c/ GB.user_error()允许脚本抛出系统级的错误( k6 j# Q+ g: D0 M1 Y3 e0 P
C.user_error()不能被用在错误管理器中
3 H2 e9 q8 M2 s( p' ]D.trigger_error只在PHP5中可用- X. X% T( r! e
E.没有区别: \2 {) p: t1 x% ?5 _; O
- M% T7 Z& P% `* c+ X
- C- m8 c K) R; a. v) }
15.______函数能返回脚本里任意行中调用的函数的名称。该函数同时还经常被用在调试中,用来判断错误是如何发生的。. P% U5 }+ g: j; C3 m) I1 z
3 _! d0 o4 V4 D/ b+ S) L+ g0 i
A.print_r
$ b6 }# t) Z Y0 i6 T2 F- M) |B.var_dump
2 Z& c I5 Y- o9 y3 O' VC.stack_dump
+ Y, A* l' N8 @# A- MD.debug_backtrace" f3 I. S* A& o4 e( k
E.以上都不对/ d4 n% O0 n# m. \7 L& u
% Q6 X6 y% O, S# M2 \1 ~
答案8 D7 [# }/ [% a4 q7 j4 Y2 r. {/ i6 J
1 w% a3 Z1 V/ {& p+ c% j8 n1 [
1.答案是E。三元操作符把每个if语句连到一起,作为&&操作的一部分。然而本题中,$x=1这个赋值只在第三个if为false时发生。如果第一个和第二个条件都不成立,$x=1就不会执行。这题对三元操作的应用有些极端,实际应用时,需要根据可读性来决定是否需要用三元运算符(本题这种情况就最好不要用)。" M5 `7 z+ h1 @- W' D# i6 j0 r
6 G5 Z; @6 g$ K7 L: x% j2.问题是由第三方数据源传输缓慢导致的,而你无法控制这个数据源。你也许能在网络连通性上做些工作(假设问题出在你这一边)。还可以对接收到的内容进行缓存,这样能减少获取重复数据的时间。因此,答案是B和E。
3 l# K- E& x! n1 S7 v5 E# `4 y* T X4 a" J+ ?, D. O1 ?% |
3.正确的选择是B和D。如果关闭错误报告、使用@抑错符和关闭错误日志,那么在你交付给客户的网站出现问题时,你将很难进行分析和调试。, o) C# ^' ^! q5 C
# W+ f' T& L: s1 Q1 w
4.这是在描述===操作符。
7 I5 [7 Z; v( B+ D- i" m
; {* M3 u1 x; n5.正确答案是D。PHP脚本在执行时,将首先被解析成“中间”码(也叫opcode,操作码),然后解释器执行。操作码缓存出现在这两个步骤之间,对解析器的输出进行缓存。下次执行该脚本时,将缓存的输出直接送入解释器。这样就就不需要再解析一次了。. [9 Z9 d+ |& q/ W; H$ v' b9 L
# g. G* Q6 J3 x6 a, o9 l
6.正确答案是A和D。如果RAM太小,进程间将出现资源竞争,服务器将大量使用硬盘交换。同样的,如果允许过多进程同时执行,也会使服务器频繁进行交换,导致速度下降。/ `, c$ Y, A0 @3 \/ i8 H
9 G: N S1 R7 C. s2 z3 ^
7.正确答案是A和C。脚本不检验datebase_query()的调用是否成功,因此将持续执行下去,最终产生错误。此外,$my_id参数没有转义——可能导致代码注入(详见第11章)。
1 h- s% C! U9 `! s
2 S6 O& M5 @7 D7 E" D8.答案B和D正确。出现解析错误往往表示脚本中有语法错误,自定义的错误管理器无法捕捉到它们的原因很明显:错误管理器在脚本里,而现在无法解析脚本,管理器也就无法执行。类似的,E_ERROR表示有致命的运行错误出现,比如内存耗尽。因此脚本会立刻被中断,因为解释器无法执行后面的代码。
# c+ m/ J0 m b3 Y; v5 j1 B' r/ G5 {* ?6 I# x& h5 s
9.答案是C。比较操作是一个可交换的操作(就是说结果独立于操作数之外),而赋值不是。因此,比如说,$a==10和10==$a是等效的,而$a=10和10=$a却不是,而且后者会导致一个错误,因为这不是一个合法的操作。确保常量在操作符前面,能保证你不会错误得将比较变成赋值。, i6 e F( `: Y! d, Z, W; i
, u3 ^+ o: X* {) ?) S10.答案是C。error_log函数能将信息送往一个指定的地址。尽管mail()也可以用,但error_log能自动给邮件添加标题,因此这才是最简单的方法。
7 m/ Q3 T: |- Q; c/ V" M
$ l A( j% W8 C, M11.答案是不能。error_reporting函数能关闭所有运行时的错误报告,但对解析时的错误无效,因为解析错误发生在脚本执行之前。1 p' r( g! x, {8 ]. |6 N m) m1 m
$ W5 f$ V3 z% r5 z5 P w( {7 c+ j12.显然,答案是C。概要分析器(profiler)能监视脚本的运行,并记录单个部分的运行时间。它可以用来找出和解决瓶颈。
1 {( w! b c$ ~4 w# d2 \* w. w9 ]; M! @# J7 B& U
13.这是对调试器的完美定义!你可以用调试软件监视脚本运行,同时分析系统资源消耗,从而发现和解决程序缺陷。9 I+ w/ i1 t) Q
- Z$ O! i9 f2 h1 h14.trigger_error()和user_error()之间没有区别。后者其实是前者的别名。) n& O: \6 f6 |- y
4 _' s+ i2 a) v; D8 z$ M15.答案是D。题目是在描述debug_backtrace函数,它返回一个由所有在代码的特定位置调用过的函数名组成的数组。 |
|