  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14221
- 金币
- 2401
- 威望
- 1647
- 贡献
- 1349
|
[Zend权威认证试题讲解]第十二章 -调试与性能管理
作为一个开发者,无论你经验多么丰富,或者无论你多么努力,你的程序中总会有bug。这是生命中一个必然的部分,如同死亡与缴税(尽管并没有后面两个那么严重)。
7 t8 V1 c1 C7 Y; z要想解决bug,首先要能找到bug。事实上,许多开发者花费了无数小时茫然得盯着代码,只是因为他们没有把程序的容错能力摆在首位。忽略了这个部分,那么期望一个没有bug的程序就是——不可能的。! u. C4 J0 j @% F9 H
本章测试题将考察你对调试和性能管理相关知识的了解,以及如何用PHP做好这两件事。
( [" U4 F4 e- Z* i: |! ^0 j& _# ^/ C6 r# w" o4 g) F
! {, }, R& L8 g/ D0 p+ Z+ d+ _$ R
问题
/ W/ Q0 I7 s! g Y" J: l$ c# K3 b0 \4 J
1.以下脚本如何用三元操作替代?
# K9 K4 a+ ^" {-
- <?php
- if ($a < 10) {
- if ($b > 11) {
- if ($c == 10 && $d != $c) {
- $x = 0;
- } else {
- $x = 1;
- }
- }
- }
- ?>
复制代码
1 o! T2 _. L! Y( t. L1 SA.$x = ($a A. < 10 || $b > 11 || $c == 1 && $d != $c) ? 0 : 1;
- i4 R$ q* C$ `$ h: O/ _, ]B.$x = ($a < 10 || $b > 11 || ($c == 1 && $d != $c)) ? 0 : 1;
# v# d2 t9 C! HC.$x = (($a < 10 && $b > 11) || ($c == 1 && $d != $c)) ? 0 : 1;
- f# O3 i8 W/ O3 |) YD.$x = ($a < 10 && $b > 11 && $c == 1 && $d != $c) ? 1 : 0;
+ y i; Q) P7 a" l7 z, AE.以上都不对- S1 D! U6 M2 T& k$ P8 v# M
( l2 T$ Q: ^5 Q& D+ Q- `" j% l, i" Q! X: Q4 b. P* D
2.有一个脚本由于要从远程获取数据,因而运行速度很慢,以下那种方法能对其进行优化?(双选)* F0 i- m& {3 X0 l/ H6 u
' O7 o6 U! F5 ]( I( w
A.安装操作码缓存(opcode cache)* \! z, I$ \5 t
B.优化或者升级你的网络连接
! o: n9 P: f" ?0 {% f8 @C.添置更多的硬件
! S2 v G z3 a: s ^. [; zD.增加服务器的可用RAM$ `4 ?) P3 \1 _0 d5 G! E
E.使用连接缓存
% z8 m0 a3 Q- \' F- R7 e! K& C8 a5 M4 f2 `- ]" M7 g6 m
0 [0 i- n& Y7 x$ N# _* S
3.架设生产环境下的服务器时,需要做哪些步骤?(双选)3 s" w* W9 s( A% e- ?4 s& H* U
5 p" l& d6 u2 s/ g7 H
A.关闭错误报告
6 ]* U( B; ^' P6 F7 I8 G. i) eB.打开错误日志
. ^. k* e, @7 |. W5 MC.关闭错误日志: |/ }# I6 Y2 l) u2 l
D.关闭错误显示
9 u4 t" g3 _; t! T9 `E.使用@抑错符
& X M0 Q+ C% ~+ ?
5 \* V% K% ]' X
) C' ^9 @7 q' l) N4.______操作符能对操作数的数据类型进行严格的比较?
; s0 b. U f* I3 d
; \* f9 Y$ l: Z5 C X/ N5 P答案:____________2 z7 W, z6 }* ] m8 U
f% O1 q( s$ \: r
9 a' Q* t5 t6 k+ P$ U
5.操作码缓存(opcode cache)能做什么?- q5 ?! i7 Q; {) C
% D/ b4 {6 |9 w3 `- R8 P/ TA.把脚本编译成二进制对象,使它运行得更快
+ H+ E2 A/ n# HB.代替Zend引擎加快解释器的运行) t u, H4 H. B$ _' v5 ?# {5 k
C.缓存脚本输出以提高执行效率
G8 t1 b& e6 I zD.缓存解析器产生的中间码,以提高运行效率
) h* A% `' x- S7 f# FE.在内存中缓存脚本,减少从硬盘中读取的次数
7 @3 q# x( Y* e! ~+ b" I' `9 [+ l+ N3 X7 e* E P
; w j- j% H0 I, M, L0 w6.以下哪些情况容易造成系统资源枯竭?(双选)
! }; D8 L, e% T) q: h
, c" ?7 d5 n. c0 y: Q! QA.RAM太小( V$ L" V4 O2 B- W' [7 B
B.使用了低带宽的连接
% D3 \7 E: ~* Z5 f# u* Z6 aC.虚拟内存超过2GB* o7 A% c% Y$ g0 m1 B( A
D.允许同时运行太多的服务器进程
4 q! W ~* |8 c3 `& U# [. K1 S+ K8 NE.以上都不对% \; `6 a3 k5 i( m. L" O
; d1 g3 X& W7 @' A6 ]; B9 U+ x* c# o
" r8 k$ K& K D! K1 A4 E) @: \7.以下脚本缺了些什么?(双选) $ y1 S0 B: n- f* E# \ K+ t
-
- <?php
- $rs = database_query ("select * from mytable where id = " .
- $my_id);
- while ($a = database_get_data ($rs)) {
- var_dump ($a);
- }
- ?>
复制代码
! f* \& O' I5 [A.参数出口(Parameter escapement)
0 d5 c: i$ Y/ D9 LB.输出格式化/ e2 Y. B( b8 u4 w- U
C.错误检查
3 d5 @' i+ e) k3 o9 }" DD.一个SQL查询
: G! u& T- W+ ME.以上都不对' H3 l3 z8 ` p( R% W
6 n8 b/ v% H, K& d3 K* r6 R
/ k0 c$ h5 R( z+ r- H: L0 _
8.以下那种错误类型无法被自定义的错误处理器捕捉到?(双选)1 l/ _) I/ O3 J7 j! p0 w2 h" N5 o
- m6 f- n0 I# b3 a- F. ]! HA.E_WARNING' m' C7 k, i, _; n' y
B.E_ERROR
& N' V3 m9 Q; E, pC.E_USER_ERROR0 U [3 d1 F* k; ]# b+ z
D.E_PARSE: w2 h3 P' X/ V6 }& r
E.E_NOTICE
# X& a& U" W% y' a$ c% S
* O- C8 d$ e1 B5 x/ L4 b. U7 b* D8 W8 E8 N% r; ^
9.当需要比较一个常量和一个变量时,如何才能保证不会错弄成赋值?
6 q4 S6 ?9 L: ~' w- j3 G0 C8 h/ h$ w
A.把变量转换成int
7 D" l% m2 [2 A, i: z) d6 D" }B.使用全等比较符(===), Z$ P6 m( B2 Y5 C l# L
C.确保常量是第一个操作数
- B4 S' d8 J, G2 ^3 f# F; DD.使用三元运算符) }# p( U5 \4 o5 v1 w
E.用括号把操作包起来' S# v! R* V' f7 q4 ~
( n, h4 M, r& t, B) ?: i
7 s* [9 x8 n' o+ y. ]- q10.要通过邮件给系统管理员发送错误信息,以下那种方法最简便?
4 E, g4 e, z! |/ `3 S) \) U0 V M
7 X- R* d% Z6 L. l! J9 y6 QA.创建一个连接远程SMTP服务器的函数
/ v% Q- k& n, l+ b# U' S) ?B.使用mail函数8 u5 @. O1 F- w
C.使用error_log函数8 T8 E3 @9 ^9 Q% M6 r
D.调用sendmial程序, w7 a& [& `; R+ d; V. C
E.使用webservice: f7 c3 U9 i/ K C7 N, c2 n; }9 C
; P4 g: N* b8 h" R! c; L% |" |/ r8 p# w0 {
11.能否仅调用一个函数就关闭脚本内所有的错误报告?
' ^5 i6 A4 E( m3 d" c( y u0 [2 W2 u8 y) U0 Y
A.能
" L7 p3 ^% S# w$ SB.不能
) F7 q' A7 s! h6 J" E( v/ V* V
2 d/ ^3 S& J; m; Z2 a0 C9 n0 G' T2 Z7 @6 u6 J# M* o0 Q, Z) ~
12.概要分析器(profiler)是做什么的?. ^- B0 N3 H/ R0 H/ D, v% Y
" C& @. W' l1 W+ }3 m) W. ?4 a) MA.创建关于脚本结构的档案
; @# u3 s, _5 t- ]/ V1 D4 N( C' qB.把脚本转化成UML图
* l' c; U$ G. T( f3 W+ TC.精确测算脚本不同部分的运行时间
) |5 d/ @1 e( ~; tD.计算脚本通过web服务器执行时的维度
. ]0 V' y/ j/ PE.扫描脚本,识别由常见错误导致的bug2 O% g+ o, e4 [: @' y U
6 M+ R# c6 i( T2 K3 I0 }5 R; m; ?5 I2 X
13.______能帮助识别和解决bug。& j; F$ f* {% G2 K6 ?2 L6 J2 U
2 @) G2 l) z, ~. g
答案:____________
8 g5 I5 N3 H+ M7 y8 } D
1 F2 q( g5 |, w" m# v0 i; S
) e" _% g0 h" g# {1 b1 i14.trigger_error()和user_error()有什么区别?
, \6 S7 E' P* a* v( D" ~
: u3 t- E( B! `: f8 {A.trigger_error()允许脚本抛出系统级的错误
% h' h% l; R$ {% IB.user_error()允许脚本抛出系统级的错误
; _& L, s5 H5 k; ^8 qC.user_error()不能被用在错误管理器中2 M8 X, w% R8 E
D.trigger_error只在PHP5中可用
/ s0 |( @& O3 ?( f% `" ]2 D! nE.没有区别! }# O7 i5 W. ~( m
2 B6 c$ g/ ]: i( M: j. W: x, l1 C
15.______函数能返回脚本里任意行中调用的函数的名称。该函数同时还经常被用在调试中,用来判断错误是如何发生的。5 \' h0 K* s( Z, z2 W
) |3 Y! M% T& i/ S v1 S; n; R
A.print_r* @9 j% U; n3 f; M0 k; `) t
B.var_dump. m% m3 c A( C
C.stack_dump2 R3 B5 h8 d6 f$ [" C
D.debug_backtrace- [ {. c" c* E4 U
E.以上都不对
' M8 k8 R5 o; _' p/ T
5 k, ^+ A+ w' k7 l答案 u- Y! i: L0 B
6 o/ s+ @ S, N' }1.答案是E。三元操作符把每个if语句连到一起,作为&&操作的一部分。然而本题中,$x=1这个赋值只在第三个if为false时发生。如果第一个和第二个条件都不成立,$x=1就不会执行。这题对三元操作的应用有些极端,实际应用时,需要根据可读性来决定是否需要用三元运算符(本题这种情况就最好不要用)。5 A! q* i+ |" _
d# C# l8 t- B6 n) w2.问题是由第三方数据源传输缓慢导致的,而你无法控制这个数据源。你也许能在网络连通性上做些工作(假设问题出在你这一边)。还可以对接收到的内容进行缓存,这样能减少获取重复数据的时间。因此,答案是B和E。
& Z3 M3 y7 s) w: |4 v+ g3 u) R; H$ Z: \+ m% V9 ?+ X% f& K
3.正确的选择是B和D。如果关闭错误报告、使用@抑错符和关闭错误日志,那么在你交付给客户的网站出现问题时,你将很难进行分析和调试。; k, C$ z7 U( z2 U [
W d- @- o. s) \
4.这是在描述===操作符。7 T) g5 I; }6 | ?: @, Y
1 ]3 v9 u, b Q8 y* X8 ]' B* B) ]
5.正确答案是D。PHP脚本在执行时,将首先被解析成“中间”码(也叫opcode,操作码),然后解释器执行。操作码缓存出现在这两个步骤之间,对解析器的输出进行缓存。下次执行该脚本时,将缓存的输出直接送入解释器。这样就就不需要再解析一次了。
/ f, m9 ]: O- K' c
* f3 P) L. N% r4 b$ a' {6.正确答案是A和D。如果RAM太小,进程间将出现资源竞争,服务器将大量使用硬盘交换。同样的,如果允许过多进程同时执行,也会使服务器频繁进行交换,导致速度下降。) K9 ?) p, E- u# G W
; b6 C" o: F, y4 W4 V
7.正确答案是A和C。脚本不检验datebase_query()的调用是否成功,因此将持续执行下去,最终产生错误。此外,$my_id参数没有转义——可能导致代码注入(详见第11章)。& G2 W, s$ P! G5 [) s: U# n
" b/ G7 G' R: V. w' o8.答案B和D正确。出现解析错误往往表示脚本中有语法错误,自定义的错误管理器无法捕捉到它们的原因很明显:错误管理器在脚本里,而现在无法解析脚本,管理器也就无法执行。类似的,E_ERROR表示有致命的运行错误出现,比如内存耗尽。因此脚本会立刻被中断,因为解释器无法执行后面的代码。. c# L0 Z& B! G$ r6 R0 i5 ], P
; G* F N# {0 G. x0 B5 N1 e y
9.答案是C。比较操作是一个可交换的操作(就是说结果独立于操作数之外),而赋值不是。因此,比如说,$a==10和10==$a是等效的,而$a=10和10=$a却不是,而且后者会导致一个错误,因为这不是一个合法的操作。确保常量在操作符前面,能保证你不会错误得将比较变成赋值。
7 H8 x0 l$ i5 A) g- C4 F7 l& L" i- F: X4 U5 [
10.答案是C。error_log函数能将信息送往一个指定的地址。尽管mail()也可以用,但error_log能自动给邮件添加标题,因此这才是最简单的方法。
, Z* `8 V8 n' V- |: z v( ~) z6 m% d; ?
11.答案是不能。error_reporting函数能关闭所有运行时的错误报告,但对解析时的错误无效,因为解析错误发生在脚本执行之前。
1 |: r0 n. c* [. Z, B9 ~$ Y8 R$ B, m. [1 B# t
12.显然,答案是C。概要分析器(profiler)能监视脚本的运行,并记录单个部分的运行时间。它可以用来找出和解决瓶颈。8 F- o% m" r: j4 C `
; y# c. s. t9 ?6 P; s7 N! s2 E13.这是对调试器的完美定义!你可以用调试软件监视脚本运行,同时分析系统资源消耗,从而发现和解决程序缺陷。
( P% \8 k/ r) ^7 _' U
+ O* j) W% X, S2 P- U+ o0 E6 D14.trigger_error()和user_error()之间没有区别。后者其实是前者的别名。& V- s! E) t1 W$ E
; K& w* a6 [) w+ j15.答案是D。题目是在描述debug_backtrace函数,它返回一个由所有在代码的特定位置调用过的函数名组成的数组。 |
|