  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14247
- 金币
- 2414
- 威望
- 1647
- 贡献
- 1362
|
[Zend权威认证试题讲解]第十二章 -调试与性能管理
作为一个开发者,无论你经验多么丰富,或者无论你多么努力,你的程序中总会有bug。这是生命中一个必然的部分,如同死亡与缴税(尽管并没有后面两个那么严重)。5 e3 p2 |' @! {- \" W
要想解决bug,首先要能找到bug。事实上,许多开发者花费了无数小时茫然得盯着代码,只是因为他们没有把程序的容错能力摆在首位。忽略了这个部分,那么期望一个没有bug的程序就是——不可能的。 U @" u& \( H, D. C, x6 H
本章测试题将考察你对调试和性能管理相关知识的了解,以及如何用PHP做好这两件事。
& b* K2 m! }: H- h# q
. p3 N/ R. D$ F* m
% E1 i$ L: `6 A- p: p% n* y4 D# Z5 t4 E问题
6 M Y; q: B9 A: a! N
; U5 K8 Y, r0 G1.以下脚本如何用三元操作替代?
: w3 `5 b* `# e \-
- <?php
- if ($a < 10) {
- if ($b > 11) {
- if ($c == 10 && $d != $c) {
- $x = 0;
- } else {
- $x = 1;
- }
- }
- }
- ?>
复制代码 $ ~2 w) X; l8 g) E# v9 a
A.$x = ($a A. < 10 || $b > 11 || $c == 1 && $d != $c) ? 0 : 1;2 i9 E2 H6 n4 a7 M. u3 F Y
B.$x = ($a < 10 || $b > 11 || ($c == 1 && $d != $c)) ? 0 : 1;: h$ t+ I1 v6 z$ W9 I9 i( F5 `0 I
C.$x = (($a < 10 && $b > 11) || ($c == 1 && $d != $c)) ? 0 : 1;/ u% D ^) j6 X2 U* @# Q7 P
D.$x = ($a < 10 && $b > 11 && $c == 1 && $d != $c) ? 1 : 0;
( t- C% E' u1 \/ S+ ~3 {6 g: uE.以上都不对5 S6 g/ j, |* d: m7 P9 W C, z
1 Z8 x8 C& r5 E
5 y* ?' F. x/ @- h# [7 {2.有一个脚本由于要从远程获取数据,因而运行速度很慢,以下那种方法能对其进行优化?(双选)
1 \/ A5 n# n8 J- F
1 H5 O7 Z7 ]: V$ N7 n" `1 d cA.安装操作码缓存(opcode cache)+ G3 F) `7 }. Q5 v
B.优化或者升级你的网络连接
9 C, g6 _7 v9 R; lC.添置更多的硬件
9 U2 Y# D+ R1 d: xD.增加服务器的可用RAM8 I+ A8 N6 i% {' \6 i% e% l
E.使用连接缓存
, }3 [' e) a+ @+ q' p# G
! \2 F4 R6 x& ~+ h7 k; j3 [) b( r4 e3 r5 u; J7 E5 ?7 ~
3.架设生产环境下的服务器时,需要做哪些步骤?(双选) K) m9 Z1 n" H. {. E, z; U
4 F/ ^+ L6 c9 K3 }5 w) m
A.关闭错误报告7 _3 ~4 ]# M3 R. f- U* f
B.打开错误日志! Z' N' {3 a7 v9 T& O# d/ l+ t7 v
C.关闭错误日志
|3 U: o, v8 M0 q: YD.关闭错误显示
3 K& z9 w. w" w7 EE.使用@抑错符
& t* j9 ^- P- l) V7 @: u& R l v# @- U, C( z+ b
& O+ `6 V% r) g( F: X
4.______操作符能对操作数的数据类型进行严格的比较?; b/ x5 E+ R5 [3 s
2 S0 o2 w1 B& `: h答案:____________
4 N. G; K% T6 `5 s9 Z
; H2 Z6 g! w! |# c1 Q& F! N6 s# `, Q7 i+ P5 Z5 T- {
5.操作码缓存(opcode cache)能做什么?, v9 V2 U/ H8 x8 N H3 j
8 V/ ]/ q& e+ `9 r4 K, N# R) qA.把脚本编译成二进制对象,使它运行得更快9 x* q0 S G s& E8 t$ m
B.代替Zend引擎加快解释器的运行
0 L& R5 j+ x* y( C( {' r# IC.缓存脚本输出以提高执行效率
) J4 Z. M/ u" a/ E3 L7 f8 RD.缓存解析器产生的中间码,以提高运行效率
% o" r5 l' s, \5 KE.在内存中缓存脚本,减少从硬盘中读取的次数
\1 o& d" s% R2 _# H% \! ?
/ W# t6 e @% z4 H9 h8 C* l! G
. y3 [0 z# I. o( q) ^6.以下哪些情况容易造成系统资源枯竭?(双选): J% C7 F, {$ o3 _' V! B
7 q f7 c1 I2 v$ y1 k! }8 M6 |- T+ Z( RA.RAM太小" V3 ]; J& L/ U8 r$ M+ y+ G
B.使用了低带宽的连接$ K/ |/ t; Z2 y- x j" A" S% J3 n. m0 I
C.虚拟内存超过2GB
6 d% q% n* b- p0 iD.允许同时运行太多的服务器进程4 x: {0 E0 @" f; |2 _, n4 t2 s
E.以上都不对
! y: B. E7 i3 I4 i5 T" q& j
2 d# ~" k1 n# s% _
6 b6 u# T- X' w* [$ e7 Z7.以下脚本缺了些什么?(双选)
/ n: W k: I% I& c% `. }) u, l-
- <?php
- $rs = database_query ("select * from mytable where id = " .
- $my_id);
- while ($a = database_get_data ($rs)) {
- var_dump ($a);
- }
- ?>
复制代码
: T. Z# X1 r3 EA.参数出口(Parameter escapement)3 Y& w3 P# y: s4 X9 v5 K
B.输出格式化
# n! {$ \" j6 r5 eC.错误检查; B2 ^: W) R8 n2 h: d$ v
D.一个SQL查询& Z" @5 S _/ c
E.以上都不对4 [$ l$ q' _2 R% J' Y
3 H/ E* S0 T5 [9 g: Z: F1 r3 I" W" N4 L' `( q) ]- ] A$ y
8.以下那种错误类型无法被自定义的错误处理器捕捉到?(双选). f3 p8 C7 t5 i" q) F
1 L- p! O3 d* NA.E_WARNING7 v# w: T8 w! M! D t7 A1 E
B.E_ERROR" w" l8 z8 S2 m! ?( y
C.E_USER_ERROR- l0 K' `( } p+ u6 S& X: M. G
D.E_PARSE
+ y, x7 w Y2 @9 y5 M& V2 M4 uE.E_NOTICE: t/ m" T+ q' k! h/ z) L
) c# T4 Q4 D) k3 s% D
+ l2 d3 C4 x. e9.当需要比较一个常量和一个变量时,如何才能保证不会错弄成赋值?, w6 {& s! @/ Z) m9 |6 T: y3 {
' {* W# a/ n6 |( _A.把变量转换成int& }) I( ?* o2 ^5 r
B.使用全等比较符(===)
( B$ }7 ~7 S' Q7 EC.确保常量是第一个操作数6 G" X4 g! p5 w4 G K x
D.使用三元运算符; F7 `6 b" F: v B/ X7 l4 y
E.用括号把操作包起来
* z) e4 o5 J. @3 J3 ~. q. a' y3 d! @+ o, ^& m
& l. I1 _& _/ q/ @% K10.要通过邮件给系统管理员发送错误信息,以下那种方法最简便?
* a7 p( M7 ]& [ G M
7 l u1 { c2 Y# uA.创建一个连接远程SMTP服务器的函数* a1 p7 ~) S, h# P
B.使用mail函数
& P4 w9 U0 s. w: ?) B7 Z+ n% eC.使用error_log函数( _0 F7 m0 v# @! p2 v
D.调用sendmial程序/ @9 v- r2 i2 L5 I# V
E.使用webservice7 D% }7 W$ W4 y0 v( ^
; U2 ^% M+ U- a" ^, `# d# g7 |1 ?( `3 v
11.能否仅调用一个函数就关闭脚本内所有的错误报告?1 I) L4 h6 S/ v! c7 W
' h, x1 O7 b6 H2 x. y
A.能
* ^. e" Y- n' Z6 J$ c% ZB.不能, q2 S( B& P& `1 L. E
2 ]) U) O! k0 P: C$ c0 H
( p- E* a& n$ E; `- i# Y6 K2 I
12.概要分析器(profiler)是做什么的?( b2 e- ?4 S4 P, h0 {" o, w$ g
1 \# x$ c/ u7 N5 m# w# b" s% w, H
A.创建关于脚本结构的档案
; h) R8 Z. F. P+ H, lB.把脚本转化成UML图( V2 ?: T- Z# ?9 i
C.精确测算脚本不同部分的运行时间
* {. X0 v" U8 I4 ~3 h" ~D.计算脚本通过web服务器执行时的维度
K7 m0 X; e8 s4 lE.扫描脚本,识别由常见错误导致的bug
5 K& ^! w; |" H4 e# E% v. a
: o' u/ R Q' P* P8 U; E8 x; K) j, K0 ~: X+ N
13.______能帮助识别和解决bug。
$ Q+ Z2 a$ N+ n, m$ V5 ?5 j# e/ T/ q! b$ c
答案:____________
% j u4 X, K0 Q4 h+ c q: O9 S3 V) u2 i* s. h
, Z: F" }" U) O9 p: r
14.trigger_error()和user_error()有什么区别?" _& p0 I! Q) r( _# A4 N1 f
6 t9 S, L" t i$ n1 dA.trigger_error()允许脚本抛出系统级的错误
. r: N0 P ]9 b- d3 v3 f7 PB.user_error()允许脚本抛出系统级的错误
' H1 Q4 p$ j% W- lC.user_error()不能被用在错误管理器中* _: G1 D$ h4 r0 W2 C% w# {
D.trigger_error只在PHP5中可用
7 u; P" W3 |# F0 O M7 i gE.没有区别! a% B: K. U+ z
( F, {. [1 b6 i
. i2 y& R3 e2 f* \0 f% ?
15.______函数能返回脚本里任意行中调用的函数的名称。该函数同时还经常被用在调试中,用来判断错误是如何发生的。
7 Q n+ c. t8 m" o3 ~1 _# T& k. }6 j8 p; l
A.print_r2 a+ t6 v4 l! J1 w1 x9 Y$ |
B.var_dump$ _0 D8 N( R( p# u: J( v; V9 Q
C.stack_dump
# u7 G: c" i- U; J' XD.debug_backtrace
" b+ x& r7 [3 e- {, g7 vE.以上都不对) k4 F# Z0 U3 F! U6 ^& [/ l2 Z
0 C& s% j7 K, k& q0 K( e
答案/ Q1 n2 _6 m! T- p+ O8 h' }; Y
3 k$ R# \* e- N G a1 B1.答案是E。三元操作符把每个if语句连到一起,作为&&操作的一部分。然而本题中,$x=1这个赋值只在第三个if为false时发生。如果第一个和第二个条件都不成立,$x=1就不会执行。这题对三元操作的应用有些极端,实际应用时,需要根据可读性来决定是否需要用三元运算符(本题这种情况就最好不要用)。9 A3 K: H4 p2 T& u, s" |2 z2 V. U. ~
: r& W) X& [& ~+ A* E% m7 ?2.问题是由第三方数据源传输缓慢导致的,而你无法控制这个数据源。你也许能在网络连通性上做些工作(假设问题出在你这一边)。还可以对接收到的内容进行缓存,这样能减少获取重复数据的时间。因此,答案是B和E。- d+ v- n# M! G; C* p
1 Z( i8 Q& Z3 s3.正确的选择是B和D。如果关闭错误报告、使用@抑错符和关闭错误日志,那么在你交付给客户的网站出现问题时,你将很难进行分析和调试。
9 {+ ?5 V& [+ ], z D% D) z9 n6 d; N1 k. n+ o% c1 F( c
4.这是在描述===操作符。
" f; c2 D8 E: y. ]" {* L1 U( H# Z4 ?6 K; T
5.正确答案是D。PHP脚本在执行时,将首先被解析成“中间”码(也叫opcode,操作码),然后解释器执行。操作码缓存出现在这两个步骤之间,对解析器的输出进行缓存。下次执行该脚本时,将缓存的输出直接送入解释器。这样就就不需要再解析一次了。5 _) Q# O: O- q( r8 q
% ]% L% }: A9 b+ b2 z4 y% N: o. H
6.正确答案是A和D。如果RAM太小,进程间将出现资源竞争,服务器将大量使用硬盘交换。同样的,如果允许过多进程同时执行,也会使服务器频繁进行交换,导致速度下降。
% j) x6 N7 {# W& q) j1 |6 K9 O( l: Q1 F% _
7.正确答案是A和C。脚本不检验datebase_query()的调用是否成功,因此将持续执行下去,最终产生错误。此外,$my_id参数没有转义——可能导致代码注入(详见第11章)。9 {! W8 N( A6 O' I
7 k& ?) G: w( l1 X) C! }6 e! K( R8.答案B和D正确。出现解析错误往往表示脚本中有语法错误,自定义的错误管理器无法捕捉到它们的原因很明显:错误管理器在脚本里,而现在无法解析脚本,管理器也就无法执行。类似的,E_ERROR表示有致命的运行错误出现,比如内存耗尽。因此脚本会立刻被中断,因为解释器无法执行后面的代码。3 Z: y& j6 r5 c
! q' F- \: }) s6 L1 m- [. y7 x4 H9.答案是C。比较操作是一个可交换的操作(就是说结果独立于操作数之外),而赋值不是。因此,比如说,$a==10和10==$a是等效的,而$a=10和10=$a却不是,而且后者会导致一个错误,因为这不是一个合法的操作。确保常量在操作符前面,能保证你不会错误得将比较变成赋值。
8 L: O( U% M$ }# @, Z1 b# f5 ]9 D8 u# E, O3 f( X
10.答案是C。error_log函数能将信息送往一个指定的地址。尽管mail()也可以用,但error_log能自动给邮件添加标题,因此这才是最简单的方法。$ a. M. \" m3 n- J1 J o# T
1 @% t( `2 k7 U: n2 I+ }
11.答案是不能。error_reporting函数能关闭所有运行时的错误报告,但对解析时的错误无效,因为解析错误发生在脚本执行之前。9 d* Q' Z6 O! B) i
+ s/ j, E; A* s' \0 g
12.显然,答案是C。概要分析器(profiler)能监视脚本的运行,并记录单个部分的运行时间。它可以用来找出和解决瓶颈。
8 m" o; c9 S6 r- V; v" O$ \0 o0 v; `0 M; q7 V" H
13.这是对调试器的完美定义!你可以用调试软件监视脚本运行,同时分析系统资源消耗,从而发现和解决程序缺陷。
) A" b9 B4 x1 p) l/ F5 c/ M
5 Z1 L! [, Y; p9 i9 x8 T14.trigger_error()和user_error()之间没有区别。后者其实是前者的别名。
T& e7 i2 F' X$ i/ @/ x4 \" q9 I9 N
15.答案是D。题目是在描述debug_backtrace函数,它返回一个由所有在代码的特定位置调用过的函数名组成的数组。 |
|